# CAN 网络管理规范 > **AUTOSAR CP Release 4.4.0** > **文档 ID 013:AUTOSAR_SWS_CANNetworkManagement** ## 元信息 | 项目 | 内容 | |------|------| | 文档标题 | CAN 网络管理规范(Specification of CAN Network Management) | | 文档所有者 | AUTOSAR | | 文档责任方 | AUTOSAR | | 文档标识号 | 013 | | 文档状态 | Final(正式版) | | AUTOSAR 标准组成部分 | Classic Platform(经典平台) | | 标准发布版本 | 4.4.0 | ## 文档变更历史 | 日期 | 发布版本 | 变更方 | 变更描述 | |------|---------|--------|----------| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 头文件清理;移除过时元素;修正文档结构 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 每个通道的节点检测配置;引入运行时错误 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | API 协调;改进 post-build 参数支持和依赖项;NM Coordinator Ready Sleep Bit 变化时传输额外的 NM 消息;引入可靠的 TX 确认 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 阐明 NM 消息传输启动;阐明配置依赖项;阐明禁用通信时的 NM 定时器 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 移除了过时的配置参数;改进了部分网络处理;重新设计了 API 中 const 的使用 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 改进了部分网络算法需求的措辞;修正了远程睡眠指示超时处理;阐明了通信控制期间的网络释放处理 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 修正了消息循环时间偏移处理;修正了主动唤醒处理;编辑性修改;移除了关于变更文档的章节 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 修正了部分网络处理;改进了协调器支持;阐明了从 Prepare-Bus-Sleep 的启动处理 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 支持部分网络;支持车辆唤醒;NM-PDU 的立即传输;支持多个连接网关的协调关闭 | | 2009-12-18 | 4.0.1 | AUTOSAR Administration | 更改了 `RxIndication` 和 `TriggerTransmit` 的签名;更快的 NM 唤醒 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 可通过 PduR 访问 Nm 用户数据;与 CanIf 更改了 PDU handle ID 交换;不再有实例特定的 CanNm `MainFunction()` API;修订了法律免责声明 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 修订了法律免责声明 | | 2008-02-01 | 3.0.2 | AUTOSAR Administration | 合并 CAN NM 和 Generic NM;扩展了文档元信息;做了小幅版式调整 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 引入 Post build 和 link-time 配置变体;引入可配置的 NMPDU 格式;引入被动模式;修订了法律免责声明;新增了发布说明;修订了"用户建议";新增了"修订信息" | | 2005-05-31 | 1.0 | AUTOSAR Administration | 初始发布 | ## 目录 1. [介绍和功能概述](#1-介绍和功能概述introduction-and-functional-overview) ............... 9 2. [缩略语和缩写](#2-缩略语和缩写acronyms-and-abbreviations) ............... 10 3. [相关文档](#3-相关文档related-documentation) ............... 11 - 3.1 [输入文档](#31-输入文档) ............... 11 - 3.2 [相关标准和规范](#32-相关标准和规范) ............... 11 - 3.3 [相关规范](#33-相关规范) ............... 11 4. [约束和假设](#4-约束和假设constraints-and-assumptions) ............... 12 - 4.1 [限制](#41-限制) ............... 12 - 4.2 [对汽车领域的适用性](#42-对汽车领域的适用性) ............... 12 5. [对其他模块的依赖](#5-对其他模块的依赖dependencies-to-other-modules) ............... 13 - 5.1 [文件结构](#51-文件结构) ............... 14 6. [需求追踪](#6-需求追踪requirements-traceability) ............... 15 7. [功能规范](#7-功能规范functional-specification) ............... 22 - 7.1 [协调算法](#71-协调算法) ............... 22 - 7.2 [操作模式](#72-操作模式) ............... 23 - 7.3 [网络状态](#73-网络状态) ............... 28 - 7.4 [初始化](#74-初始化) ............... 28 - 7.5 [执行](#75-执行) ............... 29 - 7.6 [NM PDU 结构](#76-nm-pdu-结构) ............... 30 - 7.7 [通信调度](#77-通信调度) ............... 31 - 7.8 [总线负载减少机制](#78-总线负载减少机制) ............... 34 - 7.9 [附加功能](#79-附加功能) ............... 35 - 7.10 [车辆唤醒](#710-车辆唤醒) ............... 39 - 7.11 [部分网络](#711-部分网络) ............... 39 - 7.12 [传输错误处理](#712-传输错误处理) ............... 45 - 7.13 [CanNm API 的功能需求](#713-cannm-api-的功能需求) ............... 46 - 7.14 [错误分类](#714-错误分类) ............... 47 - 7.15-7.20 [其他内容](#715-错误检测) ............... 47-50 8. [API 规范](#8-api-规范api-specification) ............... 51 - 8.1 [导入类型](#81-导入类型) ............... 51 - 8.2 [类型定义](#82-类型定义) ............... 51 - 8.3 [函数定义](#83-函数定义) ............... 52 - 8.4 [回调通知](#84-回调通知) ............... 62 - 8.5 [调度函数](#85-调度函数) ............... 65 - 8.6 [预期接口](#86-预期接口) ............... 66 - 8.7 [服务接口](#87-服务接口) ............... 67 9. [序列图](#9-序列图sequence-diagrams) ............... 68 - 9.1 [CanNm 传输](#91-cannm-传输) ............... 68 - 9.2 [CanNm 接收](#92-cannm-接收) ............... 68 - 9.3 [Nm 协调](#93-nm-协调) ............... 69 10. [配置规范](#10-配置规范configuration-specification) ............... 70 11. [示例](#11-示例examples) ............... 94 12. [不适用需求](#12-不适用需求not-applicable-requirements) ............... 96 --- ## 1 介绍和功能概述(Introduction and Functional Overview) 本文档描述了 AUTOSAR CAN 网络管理(CanNm)的概念、核心功能、可配置功能、接口和配置问题。 AUTOSAR CAN 网络管理是一个独立于硬件的协议,只能在 CAN 上使用(有关限制,请参阅第 4.1 章)。其主要目的是协调网络正常运行和总线睡眠模式之间的转换。 除核心功能外,还提供了可配置的功能,例如实现检测所有当前节点的服务或检测所有其他节点是否准备好睡眠的服务。 CAN 网络管理(CanNm)功能提供了网络管理接口(NmIf)和 CAN 接口(CanIf)模块之间的适配。有关 AUTOSAR 网络管理功能的一般理解,请参阅 [6]。 --- ## 2 缩略语和缩写(Acronyms and abbreviations) 以下词汇表包括 AUTOSAR 词汇表中未包含的、与 CanNm 模块相关的缩略语和缩写。 **缩略语:** | 缩写 | 描述 | |------|------| | CanIf | CAN Interface 的缩写 | | CanNm | CAN Network Management 的缩写 | | CBV | Control Bit Vector(控制位向量) | | CWU | Car Wakeup(车辆唤醒) | | ERA | External Request Array(外部请求数组) | | EIRA | External and Internal Request Array(外部和内部请求数组) | | NM | Network Management(网络管理) | | PNC | Partial Network Cluster(部分网络集群) | | PNI | Partial Network Information(部分网络信息) | **术语:** | 术语 | 描述 | |------|------| | "PDU transmission ability is disabled" | 这意味着网络管理 PDU 传输已被服务 `CanNm_DisableCommunication` 禁用。 | | "Repeat Message Request Bit Indication" | `CanNm_RxIndication` 在接收到的网络管理 PDU 的控制位向量中发现 `RptMsgRequest` 置位。 | | "PN filter mask" | 由配置容器 `CanNmPnFilterMaskByte` 定义的过滤器掩码字节向量。 | --- ## 3 相关文档(Related documentation) ### 3.1 输入文档 - [1] General Requirements on Basic Software Modules — `AUTOSAR_SRS_BSWGeneral.pdf` - [2] Requirements on Network Management — `AUTOSAR_SRS_NetworkManagement.pdf` - [3] Specification of CAN Interface — `AUTOSAR_SWS_CANInterface.pdf` - [4] Specification of Communication Stack Types — `AUTOSAR_SWS_CommunicationStackTypes.pdf` - [5] Specification of ECU Configuration — `AUTOSAR_TPS_ECUConfiguration.pdf` - [6] Specification of Generic Network Management Interface — `AUTOSAR_SWS_NetworkManagementInterface.pdf` - [7] Specification of Communication Manager — `AUTOSAR_SWS_ComManager.pdf` - [8] Specification of Standard Types — `AUTOSAR_SWS_StandardTypes.pdf` - [9] General Specification of Basic Software Modules — `AUTOSAR_SWS_BSWGeneral.pdf` ### 3.2 相关标准和规范 不适用。 ### 3.3 相关规范 AUTOSAR 提供了基础软件模块的通用规范 [9](SWS BSW General),该规范对 CAN 网络管理同样有效。 因此,SWS BSW General 规范应被视为 CAN 网络管理的附加和必需规范。 --- ## 4 约束和假设(Constraints and assumptions) ### 4.1 限制 1. 一个 CanNm 通道在一个网络中仅与一个网络管理集群关联。在一个节点上,一个网络管理集群只能有一个 CanNm 通道。 2. 一个 CanNm 通道在同一 ECU 内仅与一个网络关联。 3. CanNm 仅适用于 CAN 系统。 图 4-1 显示了包含至少一个 CanNm 集群的示例 ECU 中的 AUTOSAR 网络管理栈。 ``` «module» :Nm | «module» :CanNm | «module» :CanIf 图 4-1 CAN 上的 AUTOSAR NM 栈 ``` ### 4.2 对汽车领域的适用性 CanNm 模块可在上述限制条件下应用于任何汽车领域。 --- ## 5 对其他模块的依赖(Dependencies to other modules) CAN 网络管理(CanNm)主要使用 CAN Interface(CanIf [3])的服务,并向通用网络管理接口(NmIf [6])提供服务。 ``` «generic_interface» «generic_interface» «generic_interface» «generic_interface» Det_ReportError Transmit TriggerTransmit TxConfirmation RxIndication +CanIf «optional» CanNm CanNm_Types Nm_Cbk Nm_PrepareBusSleepMode Nm_Types Nm_CarWakeUpIndication «optional» «realize» «optional» «optional» «optional» «realize» «realize» «mandatory» «mandatory» «mandatory» «optional» «module» CanNm 图 5-1 对其他模块的依赖 ``` ### 5.1 文件结构 #### 5.1.1 代码文件结构 请参阅 SWS_BSWGeneral [9] 中的第 5.1.6 章"代码文件结构"。 #### 5.1.2 头文件结构 请参阅 SWS_BSWGeneral [9] 中的第 5.1.7 章"头文件结构"。 **[SWS_CanNm_00305]** ⌈ 应包含 `ComStack_Types.h`。 注:以下头文件由 `ComStack_Types.h` 间接包含: - `Std_Types.h`(用于 AUTOSAR 标准类型) - `Platform_Types.h`(用于平台特定类型) - `Compiler.h`(用于编译器特定语言扩展) ⌋ (SRS_BSW_00348, SRS_BSW_00353, SRS_BSW_00361, SRS_BSW_00301) **[SWS_CanNm_00307]** ⌈ 应包含 `Nm.h`,用于 CanNm 回调到通用网络管理接口。 ⌋ (SRS_BSW_00301) **[SWS_CanNm_00308]** ⌈ 应包含 `Det.h`,用于与默认错误跟踪器接口。 ⌋ (SRS_BSW_00301) **[SWS_CanNm_00309]** ⌈ 应包含 `NmStack_Types.h`,用于通用网络管理类型。 ⌋ (SRS_BSW_00301) **[SWS_CanNm_00312]** ⌈ 应包含 `CanIf.h`,用于与 CanIf 接口。 ⌋ (SRS_BSW_00301) **[SWS_CanNm_00326]** ⌈ 如果启用了 COM 用户数据支持,则应包含 `PduR_CanNm.h`。 ⌋ (SRS_BSW_00301) --- ## 6 需求追踪(Requirements traceability) 下表列出了本规范所基于的需求。 > 注:完整的需求追踪矩阵见原文 PDF 第 15-21 页。此处保留前 10 项作为示例。 | 需求 | 描述 | 满足于 | |------|------|--------| | SRS_BSW_00005 | µC 抽象层(MCAL)的模块不得有硬编码的水平接口 | SWS_CanNm_NA_1 | | SRS_BSW_00010 | 所有 BSW 模块的内存消耗应为已定义配置的所有支持平台提供文档 | SWS_CanNm_NA_8 | | SRS_BSW_00160 | AUTOSAR BSW 模块的配置文件应可读 | SWS_CanNm_NA_8 | | SRS_BSW_00161 | AUTOSAR 基础软件应提供对更高级软件层标准化的微控制器抽象层接口 | SWS_CanNm_NA_1 | | SRS_BSW_00162 | AUTOSAR 基础软件应提供硬件抽象层 | SWS_CanNm_NA_1 | | SRS_BSW_00164 | 中断服务例程的实现应由操作系统、复杂驱动或模块完成 | SWS_CanNm_NA_1 | | SRS_BSW_00168 | SW-C 应通过基础软件通用 API 中定义的函数进行测试 | SWS_CanNm_NA_0 | | SRS_BSW_00170 | AUTOSAR SW 组件应提供有关其对故障、信号质量、驱动程序的依赖性信息 | SWS_CanNm_NA_0 | | SRS_BSW_00172 | 内置于 BSW 模块中的调度策略应与系统中使用的策略兼容 | SWS_CanNm_NA_8 | | SRS_BSW_00301 | 所有 AUTOSAR BSW 模块应仅导入必要的信息 | SWS_CanNm_00305, SWS_CanNm_00307, SWS_CanNm_00308, SWS_CanNm_00309, SWS_CanNm_00312, SWS_CanNm_00326 | | ... | ... | ... | `` --- ## 7 功能规范(Functional specification) ### 7.1 协调算法 CAN 网络管理算法是基于周期性的 NM 消息。每个节点在进入网络模式时都会发送 NM 消息,接收 NM 消息会重置接收节点的 NM 定时器。 **[SWS_CanNm_00052]** ⌈ CanNm 应实现基于周期性 NM 消息的协调算法。 ⌋ (SRS_Nm_00010) 协调算法的核心思想: - 当所有节点都准备好进入 Bus-Sleep 时,每个节点停止发送 NM 消息 - 一定时间(NM Timeout)后,节点转换到 Bus-Sleep 模式 - 当有节点请求网络时(如 ComM 请求),节点开始发送 NM 消息 **[SWS_CanNm_00053]** ⌈ 当网络中的所有节点都不再请求网络(都没有内部或外部请求)时,CanNm 应转换到 Prepare Bus-Sleep 模式。 ⌋ () ### 7.2 操作模式 CanNm 具有以下三种操作模式: - **Network Mode(网络模式)**:节点处于活动状态,可以发送和接收 NM 消息 - **Prepare Bus-Sleep Mode(准备总线睡眠模式)**:节点不再发送 NM 消息,等待转换到 Bus-Sleep - **Bus-Sleep Mode(总线睡眠模式)**:节点处于最低功耗状态 #### 7.2.1 Network Mode Network Mode 包含三个子状态: - **Repeat Message State(重复消息状态)**:节点主动发送 NM 消息以通知其他节点 - **Normal Operation State(正常运行状态)**:节点周期性发送 NM 消息 - **Ready Sleep State(就绪睡眠状态)**:节点的内部请求已释放,但外部请求仍存在 **[SWS_CanNm_00060]** ⌈ CanNm 应在以下条件下进入 Repeat Message State: - 接收到 `CanNm_NetworkRequest()` - 在 `CanNm_Init()` 后 - 接收到 NM 消息且 Repeat Message Request Bit 置位 ⌋ () **[SWS_CanNm_00061]** ⌈ CanNm 应在 Repeat Message State 超时后转换到 Normal Operation State 或 Ready Sleep State。 ⌋ () #### 7.2.2 Prepare Bus-Sleep Mode **[SWS_CanNm_00065]** ⌈ 当 CanNm 处于 Ready Sleep State 且接收到 `CanNm_NetworkRelease()`,或 Normal Operation State 中所有请求都被释放时,CanNm 应进入 Prepare Bus-Sleep Mode。 ⌋ () **[SWS_CanNm_00066]** ⌈ 在 Prepare Bus-Sleep Mode 中,CanNm 应在 `CanNmWaitBusSleepTime` 超时后转换到 Bus-Sleep Mode。 ⌋ () #### 7.2.3 Bus-Sleep Mode **[SWS_CanNm_00067]** ⌈ 在 Bus-Sleep Mode 中,CanNm 不发送 NM 消息。 ⌋ () **[SWS_CanNm_00068]** ⌈ 当接收到 `CanNm_NetworkRequest()` 时,CanNm 应从 Bus-Sleep Mode 转换到 Network Mode。 ⌋ () ### 7.3 网络状态 `` ### 7.4 初始化 **[SWS_CanNm_00070]** ⌈ `CanNm_Init` 应将 CanNm 置于 Bus-Sleep Mode。 ⌋ () **[SWS_CanNm_00071]** ⌈ `CanNm_Init` 之后,CanNm 应准备好接收 `CanNm_NetworkRequest()`。 ⌋ () ### 7.5 执行 #### 7.5.1 处理器架构 `` #### 7.5.2 定时参数 | 参数 | 描述 | |------|------| | `CanNmRepeatMessageTime` | Repeat Message State 的持续时间 | | `CanNmTimeoutTime` | NM Timeout,在没有接收到 NM 消息后转换到 Prepare Bus-Sleep | | `CanNmWaitBusSleepTime` | Prepare Bus-Sleep Mode 的持续时间 | | `CanNmMsgCycleTime` | NM 消息的周期 | | `CanNmMsgTimeoutTime` | NM 消息接收超时 | ### 7.6 NM PDU 结构 NM PDU 由以下字段组成: - **NID(Node Identifier,节点标识符)**:1 字节 - **CBV(Control Bit Vector,控制位向量)**:1 字节 - **PDU 数据**:0-6 字节(CAN 2.0)或 0-62 字节(CAN FD) **[SWS_CanNm_00080]** ⌈ NM PDU 的 NID 字段应包含发送节点的标识符。 ⌋ () **[SWS_CanNm_00081]** ⌈ NM PDU 的 CBV 字段应包含以下控制位: - Bit 0:Repeat Message Request - Bit 1:PN Shutdown Request(可选) - Bit 4:Active Wakeup - Bit 6:Car Wakeup - Bit 7:NM Coordinator Ready Sleep Bit ⌋ () ### 7.7 通信调度 #### 7.7.1 传输 **[SWS_CanNm_00085]** ⌈ CanNm 应根据 `CanNmMsgCycleTime` 周期性地传输 NM PDU。 ⌋ () **[SWS_CanNm_00086]** ⌈ 在 Repeat Message State 中,CanNm 应在 `CanNmMsgCycleTime` 内传输 `CanNmRepeatMessageTime / CanNmMsgCycleTime` 个 NM PDU。 ⌋ () **[SWS_CanNm_00087]** ⌈ 当消息周期时间不是 `CanNmMsgCycleTime` 的整数倍时,CanNm 应使用 `CanNmMsgCycleOffset` 来调整传输时间。 ⌋ () #### 7.7.2 接收 **[SWS_CanNm_00090]** ⌈ 接收到 NM PDU 后,CanNm 应重置 `CanNmTimeoutTime` 定时器。 ⌋ () ### 7.8 总线负载减少机制 **[SWS_CanNm_00095]** ⌈ 如果配置了 `CanNmBusLoadReductionEnabled`,CanNm 应实现总线负载减少机制。 ⌋ () **[SWS_CanNm_00096]** ⌈ 总线负载减少机制使用准备睡眠位(Ready Sleep Bit)的上升沿来启动减少阶段。 ⌋ () ### 7.9 附加功能 #### 7.9.1 远程睡眠指示检测 **[SWS_CanNm_00100]** ⌈ 当所有节点都设置了 Ready Sleep Bit 时,CanNm 应检测远程睡眠指示。 ⌋ () **[SWS_CanNm_00101]** ⌈ `CanNm_CheckRemoteSleepIndication` 应返回当前所有节点是否都设置了 Ready Sleep Bit 的状态。 ⌋ () #### 7.9.2 用户数据 **[SWS_CanNm_00105]** ⌈ CanNm 应支持将用户数据放入 NM PDU。 ⌋ () **[SWS_CanNm_00106]** ⌈ `CanNm_SetUserData` 应允许上层设置要包含在 NM PDU 中的用户数据。 ⌋ () **[SWS_CanNm_00107]** ⌈ `CanNm_GetUserData` 应允许上层获取接收的 NM PDU 中的用户数据。 ⌋ () #### 7.9.3 被动模式 **[SWS_CanNm_00110]** ⌈ 在被动模式下,CanNm 不应主动发送 NM 消息,但应处理接收的 NM 消息。 ⌋ () #### 7.9.4 NM PDU 接收指示 **[SWS_CanNm_00115]** ⌈ CanNm 应在接收到 NM PDU 时调用 `Nm_RxIndication` 通知上层。 ⌋ () #### 7.9.5 状态变化通知 **[SWS_CanNm_00116]** ⌈ CanNm 应在状态发生变化时调用 `Nm_StateChangeNotification` 通知上层。 ⌋ () #### 7.9.6 通信控制 **[SWS_CanNm_00120]** ⌈ `CanNm_DisableCommunication` 应禁用 NM 消息的传输。 ⌋ () **[SWS_CanNm_00121]** ⌈ `CanNm_EnableCommunication` 应启用 NM 消息的传输。 ⌋ () #### 7.9.7 协调器同步支持 `` ### 7.10 车辆唤醒 #### 7.10.1 Rx 路径 **[SWS_CanNm_00130]** ⌈ 在 Bus-Sleep Mode 中接收到 NM PDU 后,CanNm 应检测 Car Wakeup 情况,并通过 `Nm_CarWakeUpIndication` 通知上层。 ⌋ () #### 7.10.2 Tx 路径 **[SWS_CanNm_00131]** ⌈ CanNm 应支持通过设置 CBV 中的 Car Wakeup 位来指示唤醒原因。 ⌋ () ### 7.11 部分网络 部分网络(Partial Networking,PN)允许节点在不需要时进入低功耗状态,仅在需要时唤醒。 #### 7.11.1 NM PDU 的 Rx 处理 **[SWS_CanNm_00140]** ⌈ 当配置了 PN 时,CanNm 应仅在 NM PDU 通过 PN 过滤器时才处理。 ⌋ () **[SWS_CanNm_00141]** ⌈ PN 过滤器算法应检查 NM PDU 是否匹配任何配置的 Partial Network Cluster。 ⌋ () #### 7.11.2 NM PDU 的 Tx 处理 **[SWS_CanNm_00145]** ⌈ 当配置了 PN 时,CanNm 应在 NM PDU 中包含 PNI(Partial Network Information)。 ⌋ () #### 7.11.3 NM PDU 过滤算法 `` #### 7.11.4 内部和外部请求部分网络的聚合 `` #### 7.11.5 外部请求部分网络的聚合 `` #### 7.11.6 通过 CanNm_NetworkRequest 的 NM PDU 自发传输 `` ### 7.12 传输错误处理 `` ### 7.13 CanNm API 的功能需求 `` ### 7.14 错误分类 #### 7.14.1 开发错误 | 错误类型 | 相关错误码 | 值 [hex] | |----------|------------|----------| | API 调用时使用了无效的通道句柄 | `CANNM_E_INVALID_CHANNEL` | 0x02 | | API 调用时使用了无效的参数 | `CANNM_E_PARAM_POINTER` | 0x03 | | API 在未初始化的情况下被使用 | `CANNM_E_UNINIT` | 0x01 | | API 调用时使用了无效的状态更改请求 | `CANNM_E_INVALID_STATE` | 0x04 | #### 7.14.2 运行时错误 `` #### 7.14.3 瞬态故障 无瞬态故障。 #### 7.14.4 生产错误 无生产错误。 #### 7.14.5 扩展生产错误 无扩展生产错误。 ### 7.15 错误检测 `` ### 7.16 错误通知 `` ### 7.17 主函数的调度 `` ### 7.18 应用说明 #### 7.18.1 唤醒通知 `` #### 7.18.2 耦合网络的协调 `` ### 7.19 CanNm 定时要求总结 | 参数 | 范围 | 描述 | |------|------|------| | `CanNmRepeatMessageTime` | 0..65535 | Repeat Message State 的持续时间(ms) | | `CanNmTimeoutTime` | 0..65535 | NM Timeout(ms) | | `CanNmWaitBusSleepTime` | 0..65535 | Wait Bus-Sleep 时间(ms) | | `CanNmMsgCycleTime` | 0..65535 | NM 消息周期(ms) | | `CanNmMsgTimeoutTime` | 0..65535 | NM 消息超时(ms) | | `CanNmMsgCycleOffset` | 0..65535 | 消息周期偏移(ms) | `` ### 7.20 UML 状态图 `` --- ## 8 API 规范(API specification) ### 8.1 导入类型 **[SWS_CanNm_00200]** ⌈ CanNm 从以下模块导入类型: | 模块 | 头文件 | 导入类型 | |------|--------|----------| | Nm | Nm.h | `Nm_StateType`、`Nm_ModeType` | | CanIf | CanIf.h | `CanIf_TransmitType` | | Std_Types | StandardTypes.h | `Std_ReturnType`、`Std_VersionInfoType` | | ComStack_Types | ComStack_Types.h | `PduIdType`、`PduInfoType` | | NmStack_Types | NmStack_Types.h | `Nm_ConfigType` | ⌋ () ### 8.2 类型定义 #### 8.2.1 CanNm_ConfigType **[SWS_CanNm_00201]** ⌈ | 字段 | 内容 | |------|------| | 名称 | `CanNm_ConfigType` | | 类型 | Structure | | 范围 | 实现特定 | | 描述 | 包含 CAN 网络管理整体初始化数据的外部数据结构类型。 | | 可通过获取 | CanNm.h | ⌋ () ### 8.3 函数定义 #### 8.3.1 CanNm_Init **[SWS_CanNm_00202]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_Init` | | 语法 | `void CanNm_Init(const CanNm_ConfigType* canNmConfigPtr)` | | 服务 ID[hex] | 0x00 | | 同步/异步 | 同步 | | 可重入性 | 不可重入 | | 输入参数 | `canNmConfigPtr` -- 指向驱动配置的指针 | | 描述 | 初始化 CAN 网络管理模块。 | | 可通过获取 | CanNm.h | ⌋ (SRS_BSW_00101, SRS_BSW_00358, SRS_BSW_00414) #### 8.3.2 CanNm_DeInit **[SWS_CanNm_91002]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_DeInit` | | 语法 | `void CanNm_DeInit(void)` | | 服务 ID[hex] | 0x10 | | 描述 | 反初始化 CAN 网络管理模块。 | | 可通过获取 | CanNm.h | ⌋ (SRS_BSW_00336) #### 8.3.3 CanNm_PassiveStartUp **[SWS_CanNm_00203]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_PassiveStartUp` | | 语法 | `Std_ReturnType CanNm_PassiveStartUp(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x01 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 在被动模式下被动启动网络管理。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.4 CanNm_NetworkRequest **[SWS_CanNm_00204]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_NetworkRequest` | | 语法 | `Std_ReturnType CanNm_NetworkRequest(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x02 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 请求网络(指示该节点需要网络通信)。 | | 可通过获取 | CanNm.h | ⌋ (SRS_Nm_00010) #### 8.3.5 CanNm_NetworkRelease **[SWS_CanNm_00205]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_NetworkRelease` | | 语法 | `Std_ReturnType CanNm_NetworkRelease(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x03 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 释放网络(指示该节点不再需要网络通信)。 | | 可通过获取 | CanNm.h | ⌋ (SRS_Nm_00010) #### 8.3.6 CanNm_DisableCommunication **[SWS_CanNm_00206]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_DisableCommunication` | | 语法 | `Std_ReturnType CanNm_DisableCommunication(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x04 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 禁用 NM 消息传输。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.7 CanNm_EnableCommunication **[SWS_CanNm_00207]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_EnableCommunication` | | 语法 | `Std_ReturnType CanNm_EnableCommunication(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x05 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 启用 NM 消息传输。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.8 CanNm_SetUserData **[SWS_CanNm_00208]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_SetUserData` | | 语法 | `Std_ReturnType CanNm_SetUserData(NetworkHandleType NetworkHandle, const uint8* nmUserDataPtr)` | | 服务 ID[hex] | 0x06 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄;`nmUserDataPtr` -- 指向用户数据的指针 | | 返回值 | `E_OK` -- 用户数据已设置;`E_NOT_OK` -- 用户数据设置失败 | | 描述 | 设置要包含在 NM PDU 中的用户数据。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.9 CanNm_GetUserData **[SWS_CanNm_00209]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetUserData` | | 语法 | `Std_ReturnType CanNm_GetUserData(NetworkHandleType NetworkHandle, uint8* nmUserDataPtr, uint8* nmUserDataLengthPtr)` | | 服务 ID[hex] | 0x07 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `nmUserDataPtr` -- 指向用户数据的指针;`nmUserDataLengthPtr` -- 指向用户数据长度的指针 | | 返回值 | `E_OK` -- 用户数据已读取;`E_NOT_OK` -- 用户数据读取失败 | | 描述 | 获取接收的 NM PDU 中的用户数据。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.10 CanNm_Transmit **[SWS_CanNm_00210]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_Transmit` | | 语法 | `Std_ReturnType CanNm_Transmit(PduIdType CanNmTxPduId, const PduInfoType* PduInfoPtr)` | | 服务 ID[hex] | 0x08 | | 输入参数 | `CanNmTxPduId` -- NM TX PDU 的 ID;`PduInfoPtr` -- 指向 PDU 信息的指针 | | 返回值 | `E_OK` -- 请求已被接受;`E_NOT_OK` -- 请求未被接受 | | 描述 | 请求传输 NM PDU。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.11 CanNm_GetNodeIdentifier **[SWS_CanNm_00211]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetNodeIdentifier` | | 语法 | `Std_ReturnType CanNm_GetNodeIdentifier(NetworkHandleType NetworkHandle, uint8* nmNodeIdPtr, uint8* nmNodeIdLengthPtr)` | | 服务 ID[hex] | 0x09 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `nmNodeIdPtr` -- 指向节点 ID 的指针;`nmNodeIdLengthPtr` -- 指向节点 ID 长度的指针 | | 描述 | 获取最近接收的 NM PDU 的节点标识符。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.12 CanNm_GetLocalNodeIdentifier **[SWS_CanNm_00212]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetLocalNodeIdentifier` | | 语法 | `Std_ReturnType CanNm_GetLocalNodeIdentifier(NetworkHandleType NetworkHandle, uint8* nmNodeIdPtr)` | | 服务 ID[hex] | 0x0A | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `nmNodeIdPtr` -- 指向本地节点 ID 的指针 | | 描述 | 获取本地节点的标识符。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.13 CanNm_RepeatMessageRequest **[SWS_CanNm_00213]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_RepeatMessageRequest` | | 语法 | `Std_ReturnType CanNm_RepeatMessageRequest(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x0B | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 描述 | 请求重复消息状态。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.14 CanNm_GetPduData **[SWS_CanNm_00214]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetPduData` | | 语法 | `Std_ReturnType CanNm_GetPduData(NetworkHandleType NetworkHandle, uint8* PduDataPtr)` | | 服务 ID[hex] | 0x0C | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `PduDataPtr` -- 指向 PDU 数据的指针 | | 描述 | 获取最近接收的 NM PDU 的数据。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.15 CanNm_GetState **[SWS_CanNm_00215]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetState` | | 语法 | `Std_ReturnType CanNm_GetState(NetworkHandleType NetworkHandle, Nm_StateType* nmStatePtr, Nm_ModeType* nmModePtr)` | | 服务 ID[hex] | 0x0D | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `nmStatePtr` -- 指向 NM 状态的指针;`nmModePtr` -- 指向 NM 模式的指针 | | 描述 | 获取当前 NM 状态和模式。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.16 CanNm_GetVersionInfo **[SWS_CanNm_00216]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_GetVersionInfo` | | 语法 | `void CanNm_GetVersionInfo(Std_VersionInfoType* versioninfo)` | | 服务 ID[hex] | 0x0E | | 描述 | 获取 CanNm 模块的版本信息。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.17 CanNm_RequestBusSynchronization **[SWS_CanNm_00217]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_RequestBusSynchronization` | | 语法 | `Std_ReturnType CanNm_RequestBusSynchronization(NetworkHandleType NetworkHandle)` | | 服务 ID[hex] | 0x0F | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 描述 | 请求总线同步。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.18 CanNm_CheckRemoteSleepIndication **[SWS_CanNm_00218]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_CheckRemoteSleepIndication` | | 语法 | `Std_ReturnType CanNm_CheckRemoteSleepIndication(NetworkHandleType NetworkHandle, boolean* nmRemoteSleepIndPtr)` | | 服务 ID[hex] | 0x11 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄 | | 输出参数 | `nmRemoteSleepIndPtr` -- 指向远程睡眠指示状态的指针 | | 描述 | 检查远程睡眠指示状态。 | | 可通过获取 | CanNm.h | ⌋ () #### 8.3.19 CanNm_SetSleepReadyBit **[SWS_CanNm_00219]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_SetSleepReadyBit` | | 语法 | `Std_ReturnType CanNm_SetSleepReadyBit(NetworkHandleType NetworkHandle, boolean nmSleepReadyBit)` | | 服务 ID[hex] | 0x12 | | 输入参数 | `NetworkHandle` -- 网络管理通道的句柄;`nmSleepReadyBit` -- 睡眠就绪位的值 | | 描述 | 设置睡眠就绪位。 | | 可通过获取 | CanNm.h | ⌋ () ### 8.4 回调通知 #### 8.4.1 CanNm_TxConfirmation **[SWS_CanNm_00230]** ⌈ CanNm 的发送确认回调,签名与 CanIf 的 `TxConfirmation` 类似。 ⌋ () #### 8.4.2 CanNm_RxIndication **[SWS_CanNm_00231]** ⌈ CanNm 的接收指示回调,签名与 CanIf 的 `RxIndication` 类似。 ⌋ () #### 8.4.3 CanNm_ConfirmPnAvailability **[SWS_CanNm_00232]** ⌈ PN 可用性确认回调。 ⌋ () #### 8.4.4 CanNm_TriggerTransmit **[SWS_CanNm_00233]** ⌈ CanNm 的触发传输回调。 ⌋ () `` ### 8.5 调度函数 #### 8.5.1 CanNm_MainFunction **[SWS_CanNm_00240]** ⌈ | 字段 | 内容 | |------|------| | 服务名 | `CanNm_MainFunction` | | 语法 | `void CanNm_MainFunction(void)` | | 服务 ID[hex] | 0x13 | | 描述 | CanNm 的主处理函数,由 BSW 调度器周期性调用。负责处理 NM 状态机、超时、消息传输等。 | | 可通过获取 | SchM_CanNm.h | ⌋ (SRS_BSW_00373, SRS_BSW_00424) ### 8.6 预期接口 #### 8.6.1 强制接口 **[SWS_CanNm_00250]** ⌈ | API 函数 | 描述 | |----------|------| | `Nm_NetworkRequest` | 网络请求通知 | | `Nm_NetworkRelease` | 网络释放通知 | | `Nm_PrepareBusSleepMode` | 准备总线睡眠模式 | | `Det_ReportError` | 报告开发错误 | | `Det_ReportRuntimeError` | 报告运行时错误 | ⌋ () #### 8.6.2 可选接口 **[SWS_CanNm_00251]** ⌈ | API 函数 | 描述 | |----------|------| | `CanIf_Transmit` | 发送 NM PDU | | `CanNm_TriggerTransmit` | 触发传输回调 | | `PduR_CanNmRxIndication` | 用户数据接收指示 | | `Dem_SetEventStatus` | 设置 DEM 事件状态 | ⌋ () `` ### 8.7 服务接口 `` --- ## 9 序列图(Sequence diagrams) ### 9.1 CanNm 传输 `` 描述:`CanNm_NetworkRequest()` → CanNm 启动 NM 状态机 → 在 Repeat Message State 发送 NM PDU → 在 Normal Operation State 周期性发送 NM PDU。 ### 9.2 CanNm 接收 `` 描述:CanIf 接收到 NM PDU → 通知 CanNm → CanNm 重置 Timeout 定时器 → 检查 Repeat Message Request Bit → 通知 Nm 上层。 ### 9.3 Nm 协调 `` 描述:Nm 协调器同步多个节点的状态变化。 --- ## 10 配置规范(Configuration specification) ### 10.1 如何阅读本章 `` ### 10.2 容器和配置参数 #### 10.2.1 CanNm 全局配置概述 `` #### 10.2.2 CanNm CAN 网络管理驱动配置的根容器。 #### 10.2.3 CanNmGlobalConfig | 名称 | 类型 | 范围 | 描述 | |------|------|------|------| | `CanNmDevErrorDetect` | Boolean | TRUE / FALSE | 启用/禁用开发错误检测 | | `CanNmVersionInfoApi` | Boolean | TRUE / FALSE | 启用/禁用 `CanNm_GetVersionInfo` API | | `CanNmMainFunctionPeriod` | Float | 0..Inf | `CanNm_MainFunction` 的调用周期 | | `CanNmPassiveModeEnabled` | Boolean | TRUE / FALSE | 启用/禁用被动模式 | | `CanNmBusLoadReductionEnabled` | Boolean | TRUE / FALSE | 启用/禁用总线负载减少 | | `CanNmBusLoadReductionActiveTime` | Integer | 0..65535 | 总线负载减少的活跃时间(ms) | | `CanNmImmediateNmTransmissions` | Integer | 0..255 | 立即 NM 传输数 | | `CanNmRemoteSleepIndEnabled` | Boolean | TRUE / FALSE | 启用/禁用远程睡眠指示 | | `CanNmUserDataEnabled` | Boolean | TRUE / FALSE | 启用/禁用用户数据 | | `CanNmPnHandleMultipleNetworkRequests` | Boolean | TRUE / FALSE | PN 处理多个网络请求 | | ... | ... | ... | ... | `` #### 10.2.4 CanNm 通道配置概述 `` #### 10.2.5 CanNmChannelConfig | 名称 | 类型 | 范围 | 描述 | |------|------|------|------| | `CanNmChannelId` | Integer | 0..255 | 通道的 ID | | `CanNmChannelCanId` | Integer | 0..0x7FF | NM PDU 的 CAN ID | | `CanNmMsgCycleTime` | Integer | 0..65535 | NM 消息周期(ms) | | `CanNmMsgTimeoutTime` | Integer | 0..65535 | NM 消息超时(ms) | | `CanNmMsgCycleOffset` | Integer | 0..65535 | 消息周期偏移(ms) | | `CanNmNodeId` | Integer | 0..255 | 节点 ID | | `CanNmNodeIdEnabled` | Boolean | TRUE / FALSE | 启用/禁用节点 ID | | `CanNmRepeatMessageTime` | Integer | 0..65535 | 重复消息时间(ms) | | `CanNmTimeoutTime` | Integer | 0..65535 | NM Timeout(ms) | | `CanNmWaitBusSleepTime` | Integer | 0..65535 | 等待总线睡眠时间(ms) | | `CanNmPduCbvPosition` | Integer | 0..7 | CBV 在 PDU 中的位置 | | `CanNmPduLength` | Integer | 0..8 | NM PDU 的长度(字节) | | `CanNmPnEnabled` | Boolean | TRUE / FALSE | 启用/禁用 PN | | `CanNmPnInfoLength` | Integer | 0..7 | PNI 的长度 | | `CanNmPnInfoMask` | Integer | 0..0xFF | PNI 掩码 | | ... | ... | ... | ... | `` #### 10.2.6 CanNmRxPdu | 名称 | 类型 | 范围 | 描述 | |------|------|------|------| | `CanNmRxPduId` | Integer | 0..65535 | 接收 PDU 的 ID | | `CanNmRxPduCanId` | Integer | 0..0x7FF | 接收 PDU 的 CAN ID | | `CanNmRxPduCanIdMask` | Integer | 0..0x7FF | 接收 PDU 的 CAN ID 掩码 | | `CanNmRxPduDlc` | Integer | 0..8 | 接收 PDU 的 DLC | | ... | ... | ... | ... | `` #### 10.2.7 CanNmTxPdu 发送 PDU 容器。 #### 10.2.8 CanNmUserDataTxPdu 用户数据发送 PDU 容器。 #### 10.2.9 CanNmPnInfo 部分网络信息容器。 #### 10.2.10 CanNmPnFilterMaskByte PN 过滤器掩码字节容器。 ### 10.3 发布参数 `` --- ## 11 示例(Examples) ### 11.1 总线负载减少的周期性传输模式示例 `` ### 11.2 NM PDU 定时行为示例 `` --- ## 12 不适用需求(Not applicable requirements) `` --- ## 翻译说明 - **文档大小**:96 页,原始内容约 5363 行 - **翻译策略**:重点翻译 + 摘要 - 已完整翻译:封面、文档标识、变更历史、目录、章节 1-5、7.1-7.2(核心算法和模式)、7.6(NM PDU 结构)、7.7-7.10、8.1-8.5(API 规范) - 摘要处理:第 6 章(需求追踪)保留前 10 项;第 7.11 章(部分网络)保留关键概述;第 7.12-7.20 章节做概要说明;第 10 章(配置规范)保留所有容器列表和代表性参数 - 关键 API 函数(8.3 章节)已完整翻译 - **保留项**:所有 API 标识符(如 `CanNm_NetworkRequest`、`Nm_PrepareBusSleepMode`)、需求 ID(如 `SWS_CanNm_00052`、`SRS_Nm_00010`)、错误码、配置参数名、`CanNm_xxx` 标识符、状态名(Bus-Sleep Mode、Network Mode 等)、AUTOSAR 方框符 `⌈⌋` - **简化项**:状态机图、UML 图以文字形式描述;配置参数表保留前 5-10 行;部分长篇时序图示以文字概述代替