AUTOSAR CAN 网络管理(NM / CanNm)深度解析:从概念到配置实现

摘要:本文基于一次 ETAS RTA-COM 网络管理专场培训整理。从 "什么是网络管理" 讲起,系统梳理 AUTOSAR NM(CanNm)的分布式直接网络管理机制、主动 / 被动唤醒、NM 状态机、双 ECU 时序、CAN 收发流程、transceiver 交互,再到 ISOLAR / 达芬奇工具中的配置实现(ComM、CanNm、CanIf、EcuM、BswM),并给出休眠 NVM 写入、PNC、常见疑难点的实操解法。配图为培训现场 PPT 截图,供对照理解。


一、引言:为什么需要网络管理(NM)

汽车上 ECU 越来越多,全部时刻满功率工作既不节能也不现实。网络管理(Network Management, NM) 的核心职责就两个字:休眠与唤醒。

  • 当整车无通信需求时,NM 让各节点进入总线休眠,降低整车静态电流;
  • 当出现通信需求时(点火上电、被远程唤醒、应用需要通信),NM 驱动节点回到网络模式正常收发报文。

NM 相关的协议演进:

|-----------------------|--------------|----------|
| 标准 | 说明 | 现状 |
| OSEK NM | 早期标准 | 已基本淘汰,少用 |
| AUTOSAR NM(CanNm) | 广播式分布式直接网络管理 | 当前主流 |
| UDP NM(以太网) | 面向车载以太网 | 可后续拓展 |

AUTOSAR 的 CanNm 基于分布式直接网络管理(Decentralized Direct Network Management)策略 ------ 每个网络节点自给自足,仅依据自己收发到的 NM PDU 决定自身状态,无需中心节点协调。

图 1:被动唤醒(Remote wakeup,经网关)与主动唤醒(Local wakeup,Node1)的 CAN 网络拓扑示例。


二、核心概念:主动 ECU 与被动 ECU

这是 NM 里最需要分清的概念,判断标准只有一个 ------是否主动发送 NM 报文:

|-----------|-----------------|----------------------------|
| | 主动 ECU(Active) | 被动 ECU(Passive) |
| 是否发 NM 报文 | 主动周期发送 | 只收不发 |
| 典型节点 | ABS(主动唤醒) | TCU(被动唤醒) |
| 唤醒来源 | 本地 15 电 / 内部事件 | 收到总线 NM 报文(经网关) |
| 配置要点 | ComM 选 Full | ComM 选 Light(关闭 NM 发送) |

提醒:不同厂商对 "主动 / 被动" 的定义有差异,建议按节点的实际行为(是否发 NM)去描述,不要纠结于命名。

主动唤醒与被动唤醒并不互斥,可同时存在于同一控制器上。


三、硬件基础:SBC、CAN 收发器与特定帧唤醒

网络管理的实现高度依赖硬件:

  • SBC(电源管理芯片) + CAN 收发器 ,通常以 CDD(复杂驱动) 方式集成;
  • 收发器是否支持特定帧(选择性)唤醒,决定了能否用工具配置实现 "仅特定报文唤醒"。

**

图 2:AUTOSAR 规范关于 CAN 收发器唤醒事件检测、ICU 使能 / 禁用通知的说明。

关键点(来自规范 SWS_CanTrcv):

  • 唤醒事件由 CAN 收发器硬件检测,可触发 SW 中断 或周期性轮询;
  • CanTrcv 通过 Icu_EnableNotification / Icu_DisableNotification 使能 / 禁用唤醒通知;
  • Standby 模式 应使能 ICU 通道(防丢唤醒),Normal 模式应禁用 ICU 通道。

实操结论:

  • 项目所用 TG1145 收发器在官方支持列表内,走 SPI 驱动,可工具配置;
  • 若硬件仅支持任意帧唤醒 (如 1043 芯片),工具无法配置 "特定帧唤醒",需手写代码 ;1043 自带烧录固件无法改 RNH 拉高逻辑,只能基于掩码异或配置唤醒帧范围。

四、NM 状态机详解(核心骨架)

NM 的核心是状态机。整体流转:上电 → 总线休眠 → 网络模式(Repeat → Normal)→ 两级休眠准备 → 回到总线休眠。

**

图 3:CanNm 状态机(含 PowerOn、Bus-Sleep、Network Mode、Prepare Bus-Sleep、PowerOff 及各状态触发 / 超时条件)。

4.1 主要状态

|----------------------------|----------------------------------------------|
| 状态 | 行为 |
| Bus-Sleep Mode | 总线休眠,不发送 NM;满足条件(Wait Bus-Sleep Timer 超时)后进入 |
| Network Mode -- Repeat | 网络启动期,快速发送 NM 报文(RMS→RSS),广播自己的存在 |
| Network Mode -- Normal | 常规工作,按慢发周期发 NM,正常收发应用报文 |
| Ready Sleep State | 准备休眠的过渡状态(收到释放请求后进入) |
| Prepare Bus-Sleep Mode | 两级带计时器的休眠准备,超时后回到 Bus-Sleep |

4.2 关键跳转与触发

  • 总线休眠 → 网络模式:被动唤醒接口 CanNm_PassiveStartup(),或主动网络请求 CanNm_NetworkRequest();
  • 进入 Network Mode:启动 NM-Timeout Timer、Repeat Message Timer,回调 Nm_NetworkMode();
  • Repeat → Normal:Repeat Message Timer 超时,停止总线负载削减;
  • Normal → 休眠准备:收到网络释放 CanNm_NetworkRelease() 或 Nm_PrepareBusSleepMode();
  • 回退逻辑:Repeat/Normal 阶段收到特定 NM 报文、或 CanNm_RepeatMessageRequest(),可回到 Repeat 或维持网络。

重要提醒:状态跳转不全是定时器控制 ,还包含报文接收自维护逻辑。且 NM 状态机由 CanSM(Can State Manager)自行控制,ComM 才是需要人工控制的对象------ 这是很多新人理解偏差的地方。


五、双 ECU 网络唤醒时序

以 ABS(网络激活器 / 主动)+ TCU(网络响应器 / 被动) 为例:

**

图 4:Network Wakeup 时序(含 Repeat Message State、Normal Operation State、T1--T6 计时参数)。

  • 主动 ECU :检测到网络请求 → 进入 Repeat,立即发送 NM PDU (Immediate NM PDU)唤醒被动 ECU → 随后进入 Normal,按慢发周期 T2 持续发送 NM;
  • 被动 ECU:收到 NM 报文被唤醒 → 也进入 Repeat → Normal,参与网络;
  • 释放:无通信需求后,双方收到网络释放,逐步进入休眠;
  • 关键计时参数:T2 = NM PDU Normal 慢发周期 、T3 = Repeat Message Timer。

六、CAN 收发流程

NM 报文本质也是 CAN PDU,走标准收发链路。

6.1 发送流程

CanNm → CanIf → CanWrite(Can 驱动)------ 从 NM 主函数向下调用,最终写入 CAN 硬件。

6.2 接收流程

底层驱动轮询读回(Can_MainFunctionRead)→ CanIf_RxIndication → 按 PDU 类型分流:

  • Can Nm PDUs → 交给 CanNm 处理(更新状态机);
  • Other CAN PDUs → PduR_CanIfRxIndication → Com_RxIndication 交给上层应用。

**

图 5:Can_MainFunctionRead → CanIf_RxIndication → (Can Nm PDUs / Other CAN PDUs)分流。


七、Transceiver 交互与状态机

收发器本身也有状态机,关键交互链路为:

复制代码

Integration Code → EcuM → ComM → CanSM → CanIf → CanTrcv → Dio → ETH PHY(HW)

唤醒后依次调用:

  1. ComM_EcuM_WakeUpIndication(NetworkHandleType) ------ 上报唤醒事件;
  1. CanSM_RequestComMode(COMM_FULL_COMMUNICATION) ------ 请求进入全通信;
  1. CanIf_SetTrcvMode(CANIF_TRCV_MODE_NORMAL) ------ 设置收发器模式;
  1. CanTrcv_SetOpMode(...) ------ 下发到收发器驱动;
  1. Dio_WriteChannel(...) ------ 控制硬件端口。

**

图 6:CanTransceiver 交互时序,CAN 收发器进入 NORMAL 模式后即可运行。

收发器状态机一般包括:上电 → 初始化 → 多配置切换 → 去初始化 ,通过判定帧 / 信号完成 sleep / normal / standby 等状态跳转。底层驱动分 DIO 和 SPI 两类,集成时注意区分。


八、工具配置实现(ISOLAR / 达芬奇)

以 RTA-BASE / ISOLAR 为例,主动式 NM 的配置链路:

8.1 前置准备

  1. 导入 DBC 获取 NM 报文定义;
  1. 用 Configuration Enhancer 预设模块参数默认值,可后续手动微调。

8.2 模块级配置

  • ComM :选择变体 ------ 被动节点选 Light (不发送 NM),主动节点选 Full;
  • NM 全局配置 + CanNM 通道参数:设置三类计时器时长、收发 PDU(TX/RX 各一或成对);
  • CanIf:配置收发回调;
  • EcuM:新增 / 自定义唤醒源(见下);
  • BswM:配置通信开关相关动作(后续 PNC 部分再展开)。

8.3 EcuM 唤醒源配置

**

图 7:EcuMWakeupSource 配置界面,最多 32 个唤醒源,其中 5 个标准源(POWER/RESET/INTERNAL_RESET/INTERNAL_WDG/EXTERNAL_WDG)由 EcuM 自动配置。

自定义唤醒源(如 INTERNAL_CAN)需手动添加并关联到 ComM 通道,供被动唤醒识别。

8.4 测试验证

  • 配置 NM 状态切换对应的回调函数;
  • 通过修改 NM 报文的 User Data 字段直观观测当前运行状态;
  • 用 NM UT 测试代码调用 ComM 接口触发网络请求 / 释放,验证状态机流转。

九、实操难点与解法

9.1 休眠前 NVM 写入(Write All)

最简方案(无需走完整 BswM 下电流程):

  1. 手写 Callout 函数;
  1. 依次调用 RTE Stop → OS 停止调度;
  1. 再执行 NVM Write All(也可在 BswM Action List 绑定到休眠触发条件)。

9.2 PNC(部分网络)

  • 本质:满足条件后开启通道发送报文 ,由 BswM 周期扫描 判断触发,切换 ComM User 状态,控制通道 / PDU 组开关;
  • PNC 与 User 一一绑定 ,Enable/Disable 的 PDU 组配置要成对;
  • 规则初始默认值建议设 False,否则可能出现报文丢失 / 需额外调用 PNCR 接口。

9.3 唤醒后第一帧不是 NM 报文?

默认机制下 NM 报文应先发,若出现第一帧为应用报文,可通过:

  • 调整 OS 任务中 CanNm Main Function 的执行顺序 ,放在 Com Main Function 之前;
  • 或延后应用报文发送、修改相关启动时间。

9.4 28 会话(UDS)超时恢复

工具无内置超时自动恢复配置 ,需自行编写逻辑实现会话超时后恢复通信权限。

9.5 NVM 写入过慢

排查方向:

  1. 是 Flash 驱动写入本身慢 ,还是写入过程被高优先级任务抢占;
  1. 单独测试底层 Flash 写入速度定位瓶颈;
  1. 注意不同芯片写入速度不同,无统一标准,以自身正常状态为对照。

十、总结

|---------|--------------------------------------------|
| 维度 | 一句话 |
| NM 作用 | 休眠与唤醒 |
| 主动 / 被动 | 看是否发 NM 报文 |
| 状态机 | 休眠 → Repeat (快发) → Normal (慢发) → 休眠准备 → 休眠 |
| 唤醒链路 | CanTrcv → CanIf → CanSM/ComM → EcuM |
| 收发流程 | 发:CanNm→CanIf→Can;收:Can 读→CanIf→CanNm |
| 配置核心 | ComM 变体 + CanNm 计时器 + EcuM 唤醒源 + BswM 动作 |
| 最大坑 | NM 状态机归 CanSM 管,ComM 才需人工控制 |

学习建议:先吃透 "状态机 + 主动 / 被动" 这两个骨架,再看工具配置时逐项对应,最后用项目调试验证 ------ 深入理解离不开实际项目排 Bug 的过程。


本文配图均来自 ETAS RTA-COM 网络管理培训 PPT 截图(ETAS-VOS/PRM,2024),仅作技术学习参考。

相关推荐
2301_801821711 小时前
NMVM短文本聚类模型学习
学习
叼烟扛炮1 小时前
Linux 学习笔记(八):GCC 编译器的四大阶段与链接原理
linux·笔记·学习
Z21-X2 小时前
云原生运维学习笔记:从云计算概念到服务器硬件的入门之旅
运维·笔记·学习·云原生
叼烟扛炮2 小时前
Linux 学习笔记(七):软件安装与 Vim 编辑器极速入门
linux·学习·编辑器
hgy89692 小时前
Sufer技能积累手册
学习
叼烟扛炮2 小时前
Linux 学习笔记(十六):进程的调度与优先级——谁先抢到 CPU?
linux·笔记·学习
幽灵诶2 小时前
学习Linux
linux·学习
叼烟扛炮3 小时前
Linux 学习笔记(三):文件管理与文本查看
linux·笔记·学习
海绵宝宝转agent3 小时前
2026-10-21学习笔记
笔记·学习·算法