在深入讲解 AUTOSAR CAN NM 状态机之前,需要明确一个关键事实:没有报文发出,不代表程序没有运行。CAN NM 的状态管理逻辑复杂,即使总线静默,ECU 也可能处于不同的网络管理状态,执行着相应的定时器管理和状态跳转逻辑。
AUTOSAR CAN NM状态机详解
目录
- 1. 状态介绍
- 1.1 总线睡眠模式(Bus-Sleep Mode)
- 1.2 预睡眠模式(Prepare Bus-Sleep Mode)
- 1.3 网络工作模式(Network Mode)
- 1.3.1 报文重复状态(Repeat Message State)
- 1.3.2 常规运行状态(Normal Operation State)
- 1.3.3 就绪睡眠状态(Ready Sleep State)
- 2. 状态间跳转条件
- 2.1 状态跳转表格
- 2.2 BSM→RMS
- 2.3 PBSM→BSM
- 2.4 PBSM→RMS
- 2.5 RMS→NOS
- 2.6 NOS→RMS
- 2.7 RMS→RSS
- 2.8 RSS→RMS
- 2.9 RSS→PBSM
- 3. 常见配置参数
- 4. 参考文献
状态介绍
本小节主要介绍每个状态主要职责,ECU在这个状态里面需要做哪些动作。最重要的是就是 网络工作模式(Network Mode),它涉及到的配置项是最多的,也是最复杂的。
CANNM的状态机可以分成3个大状态:
- 总线睡眠模式(Bus-Sleep Mode)
- 预睡眠模式(Prepare Bus-Sleep Mode)
- 网络工作模式(Network Mode)
其中网络工作模式(Network Mode)又分三个子状态:
- 报文重复状态(Repeat Message State)
- 常规运行状态(Normal Operation State)
- 就绪睡眠状态(Ready Sleep State)
总线睡眠模式(Bus-Sleep Mode)
这个模式是ECU上电之后CAN NM的默认状态。ECU关闭CAN发送功能、停止NM报文收发,CAN收发器进入休眠模式,仅保留基础唤醒检测能力,应用层无CAN数据交互。
预睡眠模式(Prepare Bus-Sleep Mode)
该状态是工作态到休眠态的过渡缓冲状态,核心作用是避免瞬时总线空闲导致的频繁休眠唤醒,提升网络稳定性。其实这个状态和 总线睡眠模式(BSM)没什么太大区别,只是用于过渡一下,避免芯片反复掉电重启。
其中比较关键的配置项是
CANNM_WAIT_BUS_SLEEP_TIME
这个参数是决定ECU待在预睡眠模式(PBSM)的最长时间,时间一到就会跳到总线睡眠模式(BSM)
网络工作模式(Network Mode)
网络工作模式为ECU正常通信状态,包含三种子状态,报文重复状态(RMS)、常规运行状态(NOS)、就绪睡眠状态(RSS)。
这里有一个贯穿整个网络工作模式(NM)的参数
NM-Timeout Timer
说来也是非常神奇,这个定时器只要一进NM状态就会开始计时,他有非常多的重置条件
- 在RMS和NOS状态下,只要计数器记满,就自动重新计时
- 成功发出NM报文,也会重新计时
- 接收到了NM报文,也会重新计时
那么什么时候NM-Timeout Timer能够真正的超时并且不重置呢?答案就是在RSS状态下,如果NM-Timeout Timer超时了,就会跳出NM状态,跳到PBSM状态。
报文重复状态(Repeat Message State)
在这个状态里主要是做应用报文和NM报文的发送。在这个状态下有几个比较重要的参数
- CANNM_REPEAT_MESSAGE_TIME : 这个参数决定ECU在报文重复状态(RMS)待多久
- CanNmImmediateNmTransmissions : 这个参数决定NM快发的帧数
- CanNmImmediateNmCycleTime : 这个参数决定NM快发的周期
- CANNM_MSG_REDUCED_TIME :这个参数决定NM报文的正常发送周期
常规运行状态(Normal Operation State)
在这个状态里主要是做应用报文和NM报文的发送,别的特殊操作没有,属于是一个老实人了。
CanNmMsgCycleTime: 这个参数决定NM报文的正常发送周期
CANNM_MSG_REDUCED_TIME :这个参数一般是大于1/2的CANNM_TIMEOUT_TIME
如果开启了
就绪睡眠状态(Ready Sleep State)
在这个状态,ECU是被禁止发送NM报文,只能发送应用报文。
状态间跳转条件
这部分我们要结合一个UML的状态机图来做一个详细讲解比较更容易理解。
我们首先稍微讲一下,这个图该怎么看
他的跳转线上有许多条件,“/”前面的代表跳转条件,“/”后面的代表跳转时执行的动作。
状态跳转表格如下
| 当前状态 | 目标状态 | 跳转条件 | 伴随动作 |
|---|---|---|---|
| BSM | RMS | - CanNm_PassiveStartup(); - CanNm_NetworkRequest(); | - Start NM-Timeout Timer; - Start Repeat Message Timer; - Nm_NetworkMode(); |
| PBSM | BSM | Wait Bus-Sleep Timer超时 | Nm_BusSleepMode() |
| PBSM | RMS | - CanNm_RxIndication(); - CanNm_PassiveStartUp(); - CanNm_NetworkRequest(); | - Start NM-Timeout Timer; - Start Repeat Message Timer; - Nm_NetworkMode(); |
| RMS | NOS | Network Requested | / |
| NOS | RMS | - Repeat Message Bit Received - CanNm_RepeatMessageRequest(); | Start Repeat Message Timer |
| RMS | RSS | Network Release | / |
| RSS | RMS | - Repeat Message Bit Received - CanNm_RepeatMessageRequest(); | Start Repeat Message Timer |
| RSS | PBSM | NM-Timeout Timer has expired | - Start Wait Bus-Sleep Timer; - Nm_PrepareBusSleepMode(); |
BSM->RMS
由图可知,这个路径有两个条件,满足任意条件都可跳转:
- CanNm_PassiveStartup(); 可以看做是被动唤醒,是由上层组件决定是否运行进入NM模式
- CanNm_NetworkRequest(); 属于主动唤醒,属于是本ECU检测到了某些硬件唤醒源,然后主动将网络唤醒的一种。
在BSM状态下接收到NM报文,不会自动的跳转到NM状态,而是通过调用Nm_NetworkStartIndication通知上层组件去做决策,如果决策允许进入,就会调用CanNm_PassiveStartup去跳转。
在跳转时会伴随着三个动作:
- 启动NM-Timeout 定时器
- 启动Repeate Message 定时器
- 调用NM_NetworkMode函数
PBSM->BSM
进入的条件非常简单,就一个Wait Bus-Sleep Timer超时
PBSM->RMS
由图可知,这个路径有三个条件,满足任意条件都可跳转:
- CanNm_RxIndication(); 属于被动唤醒,收到了其他ECU发出来的NM报文。
- CanNm_PassiveStartup();
- CanNm_NetworkRequest(); 属于主动唤醒,属于是本ECU检测到了某些硬件唤醒源,然后主动将网络唤醒的一种。
在跳转时会伴随着三个动作:
- 启动NM-Timeout 定时器
- 启动Repeate Message 定时器
- 调用NM_NetworkMode函数
RMS->NOS
进入NOS的条件由两点需要同时满足:
- Repeat Message Timer 过期
- Network Requested : 由主动唤醒网络请求
注意:接收到NM报文不会满足Network Requested条件
NOS->RMS
两个条件满足任意一个:
- 接收到Repeat Message Bit,这个是由其他节点发出的,处于CBV区域
- CanNm_RepeatMessageRequest(); 由其他组件决定调用/一般不会使用
这个会伴随着启动 Repeat Message Timer
RMS->RSS
进入NOS的条件由两点需要同时满足:
- Repeat Message Timer 过期
- Network Released : 收到网络释放信号
RSS->RMS
两个条件满足任意一个:
- 接收到Repeat Message Bit,这个是由其他节点发出的,处于CBV区域
- CanNm_RepeatMessageRequest(); 由其他组件决定调用/一般不会使用
这个会伴随着启动 Repeat Message Timer
RSS->PBSM
这个条件很简单就只有一个NM-Timeout Timer 超时退出。并且伴随着启动Wait Bus-Sleep Timer; 以及调用Nm_PrepareBusSleepMode();进入PBSM状态。
常见配置参数
| 配置参数 | 解释 |
|---|---|
| CANNM_TIMEOUT_TIME | 处于NM的超时时间和NM-Timeout Timer相关 |
| CANNM_REPEAT_MESSAGE_TIME | 待在RMS的时间 |
| CanNmMsgCycleTime | NM报文正常发送周期 |
| CanNmImmediateNmCycleTime | NM报文快发的周期 |
| CanNmImmediateNmTransmissions | NM报文快发的次数 |
| CANNM_WAIT_BUS_SLEEP_TIME | PBSM跳转到BSM的等待时间 |
| CANNM_MSG_REDUCED_TIME | NM报文降低时间,需要开启CANNM_BUS_LOAD_REDUCTION_ENABLED |
参考文献
《AUTOSAR_SWS_CANNetworkManagement.pdf》