跳转至

ComM / CanNm / BswM / EcuM:通信模式、唤醒与 Bus-Sleep 联动

适用范围:AUTOSAR Classic Platform CAN 网络管理场景。本文描述常见模块职责与集成排查思路。具体行为应以项目采用的 AUTOSAR Release、ARXML、供应商实现和整车需求为准。

1. 四个模块的职责

模块 核心职责 不应误认为
ComM 汇总 SW-C、诊断等用户的通信请求,管理每个 Channel/PNC 的通信模式 直接控制 CAN 控制器寄存器或决定每个 CAN 帧内容
CanNm 执行 CAN 网络管理协议,处理 NM PDU、Repeat Message、Normal Operation、Ready Sleep 等网络状态 通用 CAN 信号通信模块或 CAN 驱动
BswM 根据模式/状态请求进行 Mode Arbitration,并通过 Rule/Action List 编排模块动作 只负责开关 COM 的简单开关
EcuM 管理 ECU 启动、唤醒源验证、休眠/关机流程和电源状态协作 代替 ComM/CanNm 管理网络协议状态

还要关注 CanSM:它负责 CAN 通信状态管理及控制器/收发器模式协调,是 ComM 与 CAN 底层状态之间的重要桥梁。CanNm 的网络管理状态与 CanSM 的控制器/通信模式不是同一套状态机。

2. 典型通信请求链

flowchart TD
    A["SW-C / DCM / 其他 ComM User"] --> B["ComM_RequestComMode"]
    B --> C["ComM 汇总 Channel / PNC 请求"]
    C --> D["CanSM:请求 CAN 通信模式"]
    C --> E["CanNm:网络管理请求/状态协调"]
    D --> F["CanIf / CAN Driver / Transceiver"]
    E --> G["NM PDU 收发与网络状态"]
    F --> H["BusSM Mode Indication"]
    G --> I["Nm 状态通知"]
    H --> J["ComM 更新当前模式"]
    I --> J
    J --> K["BswM Mode Arbitration"]
    K --> L["Action List:控制 PDU Group、应用模式等"]

要点: - 用户请求 COMM_FULL_COMMUNICATION 是请求,不代表控制器已经启动、PDU Group 已打开或总线上已经有报文。 - ComM_RequestComMode 的返回值表示请求 API 的受理情况,不等于整个网络已经完成模式切换。 - ComM 的请求模式、当前模式、最大允许模式以及 CanSM/CanNm 的内部状态必须分开观测。 - BswM 是否参与某项控制,取决于项目是否配置对应 Mode Request Port、Rule 和 Action List。

3. ComM 三种常见通信模式

ComM 模式 含义(概念层面) 工程关注点
COMM_NO_COMMUNICATION 用户不请求该通道进行常规通信 进入无通信的条件、网络释放、PDU Group 关闭时机
COMM_SILENT_COMMUNICATION ECU 可接收通信,但不主动发送常规应用通信 只接收/静默场景是否符合整车需求,NM 报文与诊断例外按规范和配置确认
COMM_FULL_COMMUNICATION 允许完整通信 仍需等待底层状态切换、控制器启动、PDU Group 与应用 Runnable 就绪

不要把 COMM_FULL_COMMUNICATION 直接等同于 CanNm 的 Normal Operation,也不要把 COMM_NO_COMMUNICATION 直接等同于 MCU 已经进入 Sleep。ComM 是通信模式管理;ECU 电源状态还涉及 EcuM、BswM、OS、MCU、收发器和整车电源策略。

4. CanNm 状态与 Repeat Message

CanNm 状态 典型作用 排查重点
Repeat Message State 网络唤醒/重复消息阶段,用于让网络节点识别通信恢复或节点加入 Repeat Message 时间、NM PDU 发送、重复消息位/配置、网络请求来源
Normal Operation State 正常网络运行阶段 网络请求是否持续、NM PDU 周期、节点是否保持网络唤醒
Ready Sleep State 本节点不再主动请求网络保持,但仍观察网络活动并等待进入睡眠条件 本地请求是否真正释放、其他节点 NM PDU 是否仍存在、Ready Sleep 定时器
Prepare Bus-Sleep Mode 准备进入 Bus-Sleep 的过渡阶段 Prepare Bus-Sleep 时间、是否有新网络请求/唤醒事件打断
Bus-Sleep Mode 网络管理层认为总线进入睡眠状态 收发器唤醒能力、唤醒源、网络静默条件和后续唤醒验证

上述状态名称和具体转换条件应按所用 CanNm 规范版本及配置确认。NM PDU 停止发送、CanNm 进入 Bus-Sleep、CanSM 进入无通信、收发器进入低功耗、MCU Sleep 是不同层次的事件,不应当作同一时间点。

5. 休眠流程:从释放请求到 ECU Sleep

sequenceDiagram
    participant APP as SW-C / DCM
    participant CM as ComM
    participant NM as CanNm / Nm
    participant SM as CanSM
    participant BM as BswM
    participant EM as EcuM
    participant HW as CanIf / Transceiver / MCU
    APP->>CM: 释放通信请求 / NO_COMMUNICATION
    CM->>NM: 协调网络释放
    NM-->>CM: 网络状态变化通知
    CM->>SM: 请求降低 CAN 通信模式
    SM->>HW: 控制器/收发器模式切换
    SM-->>CM: BusSM Mode Indication
    CM-->>BM: 通信模式变化
    BM->>BM: Rule Arbitration / Action List
    BM->>HW: 按配置关闭 PDU Group / 控制相关模式
    BM->>EM: 满足关机条件时触发相应动作
    EM->>HW: 进入 ECU 关机/低功耗流程

建议按“谁还在请求通信”开始排查: 1. 检查所有 ComM User:SW-C、DCM、诊断活动、网络管理相关请求是否已释放。 2. 检查是否存在其他 Channel User 或 PNC 仍请求 Full Communication。 3. 检查 ComM 是否受到 Communication Allowed、NoCom 或 PreventWakeUp 等项目配置约束。 4. 检查 CanNm 是否仍处于 Repeat Message/Normal Operation,或仍收到其他节点 NM PDU。 5. 检查 CanSM 的模式请求、控制器/收发器模式指示和 Bus-Off 状态。 6. 检查 BswM 对应 Rule 是否满足、Action List 是否执行、是否有后续规则重新打开通信。 7. 最后判断 EcuM 是否满足进入 Sleep/Shutdown 的条件。

6. 唤醒流程:唤醒事件不等于唤醒已验证

flowchart TD
    A["物理/网络/内部唤醒事件"] --> B["EcuM Wakeup Source 检测"]
    B --> C["EcuM_CheckWakeup / 驱动通知(按集成配置)"]
    C --> D["EcuM 验证唤醒源"]
    D --> E{"验证成功?"}
    E -- 否 --> F["按配置清除/忽略无效唤醒"]
    E -- 是 --> G["EcuM 通知 ComM / 相关模块"]
    G --> H["ComM 请求/切换 Full Communication"]
    H --> I["CanSM / CanNm 协调网络恢复"]
    I --> J["BswM Rule 与 Action List"]
    J --> K["PDU Group、应用模式和 Runnable 恢复"]

排查唤醒问题时至少区分: - 检测到唤醒源:硬件或驱动报告了事件。 - 唤醒源已验证:EcuM 的验证流程确认该事件有效。 - 通信恢复:ComM/CanSM/CanNm 的状态机完成必要切换。 - 应用恢复:COM PDU Group、RTE 数据、SW-C Runnable 和诊断服务进入可工作状态。

7. Repeat Message 与 Full Communication 常见误判

现象 不要直接下的结论 应检查
请求 Full Communication 后很快看到 NM 报文 应用通信已全部恢复 ComM 当前模式、CanSM 模式指示、COM I-PDU Group、应用数据
NM 报文持续发送 一定有 SW-C 用户没释放 ComM User、CanNm 网络请求、其他节点 NM PDU、诊断请求、Repeat Message 配置
本节点不发 NM 报文但总线仍有流量 本 ECU 已经睡眠 其他节点 NM PDU、应用 PDU、控制器/收发器状态
CanNm 已到 Ready Sleep 但 ECU 不休眠 CanNm 状态机卡死 其他 User 请求、ComM 状态、BswM Rule、EcuM shutdown 条件
Wakeup Source 检测到但未恢复通信 CanIf 一定有问题 EcuM 验证、唤醒源映射、ComM 通知、CanSM/CanNm 恢复
关机后短时间又被唤醒 硬件误唤醒 网络上其他节点仍活跃、收发器唤醒配置、Wakeup Validation、整车电源策略

8. BswM Rule / Action List 检查清单

  • 每个 Mode Request Source 是否正确连接到对应的 BswM Mode Request Port。
  • Rule 条件是否覆盖 ComM、CanSM、CanNm、EcuM、DCM 及项目自定义模式。
  • Action List 的触发条件、执行顺序和是否可重复执行是否明确。
  • 是否有多个 Rule 写同一个目标模式或 PDU Group,导致动作相互覆盖。
  • 是否存在一个 Action List 关闭 PDU Group,另一个 Action List 又重新打开。
  • 是否区分初始化、正常运行、诊断会话、PostRun、Shutdown 和 Wakeup 阶段。
  • 对每个 Action 的返回值、执行结果和异步完成条件是否有观测证据。
  • 是否把模式通知当作异步状态变化处理,而不是假设请求后立即切换完成。

9. 最小化调试观测表

时间点 观测对象 建议记录
T0 ComM User User ID、请求模式、请求来源、API 返回值
T1 ComM Channel/PNC Requested Mode、Current Mode、最大允许模式
T2 CanNm/Nm 网络状态、Repeat Message、NM PDU Tx/Rx、网络请求
T3 CanSM BSM 状态、控制器/收发器模式请求和指示、Bus-Off
T4 BswM Mode Request、Rule 命中、Action List 执行顺序和结果
T5 EcuM Wakeup Source、验证状态、Shutdown Target、Sleep 条件
T6 COM/CanIf/硬件 PDU Group 状态、总线报文、Controller/Transceiver 状态
T7 应用 Runnable 激活、RTE 数据更新、降级/恢复状态

不要只记录最终模式值;需要记录请求来源、状态转换前后值和时间戳,否则难以区分“没有请求”“请求被限制”“状态切换未完成”和“切换完成后又被其他用户拉起”。

10. 回归测试建议

  • 单个 SW-C User 请求 Full Communication,再释放请求,验证完整进入和退出路径。
  • 两个 User 同时请求 Full Communication,先释放其中一个,确认另一个仍能保持通信。
  • 注入 DCM 诊断活动,确认诊断请求可按设计保持通信,诊断结束后可正确释放。
  • 验证 Repeat Message、Normal Operation、Ready Sleep、Prepare Bus-Sleep 和 Bus-Sleep 的时间条件。
  • 验证其他节点持续发送 NM PDU 时,本节点不会错误进入睡眠。
  • 分别测试有效唤醒、无效唤醒、重复唤醒和唤醒期间再次收到网络活动。
  • 验证 PDU Group 关闭/打开与 ComM、CanSM、CanNm 状态之间的先后关系。
  • 验证 Bus-Off、控制器停止/启动、收发器低功耗和通信模式切换的交互。
  • 验证 PostRun/Shutdown 条件下 NvM 保存完成判据与通信关闭顺序。
  • 记录 AUTOSAR Release、供应商版本、ARXML 配置、定时参数和测试证据。

11. 官方参考资料

AUTOSAR ComM 规范说明 EcuM 负责唤醒事件验证并在验证后通知 ComM;BswM 可根据配置传播用户请求、控制 COM I-PDU Group,并参与通信允许/禁止协调。具体动作仍由项目配置决定。

本指南是集成排查框架,不是固定状态机参数模板。请对照项目实际的 ComM、CanNm、CanSM、BswM、EcuM 配置和供应商集成手册逐项核验。