前言
上一篇《AUTOSAR中的Nm到底在干什么?为什么网络睡眠、网络唤醒全靠它?》中,我们讲清楚了:
- Network Request是什么
- 网络为什么不能直接睡眠
- Ready Sleep和Bus Sleep区别
- ComM、Nm、CanSM如何协同工作
但很多同学看完后又产生了一个新的疑问:
Nm负责网络管理我懂了,那CanNm到底在干什么?
为什么仅仅发一条NM报文,
整个网络就能被唤醒?
为什么一个节点掉线,
其他ECU都能知道?
为什么很多OEM调试网络问题,
第一件事就是抓NM报文?
今天就带大家彻底拆开CanNm,
看看NM报文里到底藏着什么秘密。
-
CanNm到底是什么?
先回顾一下上一篇的架构。
ComM
↓
Nm
↓
CanNm
↓
CanIf
↓
CAN Bus
其中:
Nm负责:
网络管理策略
而CanNm负责:
NM报文发送与接收
简单理解:
Nm像指挥官。
CanNm像传令兵。
例如:
BCM决定:
我要唤醒网络
CanNm就会发送:
NM报文
通知所有节点:
大家起床了!

-
NM报文长什么样?
很多新人第一次抓总线:
会发现这样一条报文:
ID = 0x500
Data:
01 00 00 00 00 00 00 00
或者:
40 00 00 00 00 00 00 00
这就是NM报文。
典型结构:
┌───────────────┐
│ Source NodeID │
├───────────────┤
│ CBV │
├───────────────┤
│ User Data │
└───────────────┘
其中:
- Node Identifier
- Control Bit Vector
- User Data
是最重要的部分。
Node Identifier是什么?
Node ID:
表示:
我是谁
例如:
BCM = 0x01
Gateway = 0x02
ADAS = 0x03
TCU = 0x04
当收到NM报文:
NodeID = 0x03
所有节点都知道:
ADAS在线

最神秘的CBV是什么?
CBV:
Control Bit Vector
控制位向量。
也是NM报文的灵魂。
例如:
Byte1
中的每一位都有特殊含义。
Bit0
Repeat Message Request
Bit3
Coordinator Sleep Ready
等等。
很多OEM调试网络管理:
实际上看的就是CBV。
Repeat Message Request是什么?
简称:
RMR
CanNm中最常见的功能。
例如:
某个ECU刚刚上电。
它并不知道:
当前网络状态
于是发送:
RMR = 1
意思:
大家继续发送NM报文
这样:
整个网络重新进入:
Repeat Message State
确保所有节点重新同步。
-
为什么一个NM报文就能唤醒网络?
很多新人觉得很神奇。
实际上过程非常简单。
假设:
当前网络状态:
Bus Sleep
此时:
BCM检测到:
车门解锁
于是:
CanNm发送NM报文
总线产生活动。
其他ECU:
CAN Wakeup
被硬件唤醒。
随后:
收到NM报文
进入:
Repeat Message State
最终:
Normal Operation

-
Remote Sleep Indication是什么?
这是很多OEM会开启的功能。
简称:
RSI
当节点发现:
长时间收不到NM报文。
会认为:
网络准备睡眠
于是产生:
Remote Sleep Indication
通知上层:
大家可能都准备睡觉了
这也是Ready Sleep的重要依据之一。
Node Detection是什么?
很多OEM要求:
能够检测网络中:
哪些节点在线
例如:
网络中有:
BCM
Gateway
ADAS
TCU
如果突然:
ADAS NM超时
大家就知道:
ADAS掉线
因此CanNm还承担:
Node Detection
功能。

-
为什么NM报文周期这么短?
很多项目:
100ms
甚至:
20ms
发送一次NM。
原因:
必须及时知道:
网络是否还活着
如果发送太慢:
例如:
1s
一次。
那么:
节点掉线后:
可能数秒才能发现。
因此:
OEM一般会配置:
NmMessageCycleTime
和
NmTimeoutTime
共同工作。
-
项目中最常见的CanNm问题
问题1
网络睡不着
抓包发现:
NM报文一直发送
根因:
Network Request未释放
问题2
网络频繁唤醒
抓包发现:
RMR频繁置位
导致:
不断进入Repeat Message
问题3
节点误判离线
原因:
NmTimeoutTime配置过短
问题4
网络无法同步
原因:
NM ID配置错误
多个节点使用相同Node ID。

如果网络有问题:
先看NM报文。
80%的问题都能找到线索。
-
面试高频题
问题:
CanNm和Nm有什么区别?
标准答案:
Nm负责策略
CanNm负责实现
问题:
NM报文最重要的字段是什么?
答案:
Node ID
CBV
问题:
为什么NM报文能唤醒网络?
答案:
总线活动
CAN Wakeup
NM同步
三者共同完成。

总结
CanNm是AUTOSAR网络管理真正落地的模块。
它通过NM报文:
- 维持网络活跃
- 协调网络睡眠
- 同步节点状态
- 检测节点在线
- 实现网络唤醒
很多项目里的:
- 网络睡不着
- 节点频繁掉线
- 网络异常唤醒
- 静态电流超标
🚗 一句话总结:
Nm负责制定规则,而CanNm负责把规则通过NM报文告诉整个网络。
👉下期预告
《AUTOSAR中的Partial Networking到底是什么?为什么一辆车睡觉时总有几个ECU醒着?》
带你搞懂:
- PNC是什么
- PN Filter怎么工作
- Selective Wakeup原理
- CAN Transceiver如何筛选唤醒报文
- 为什么OTA升级时TCU不用唤醒整车
