先从状态机说起:![](https://img-blog.csdnimg.cn/20211005150335409.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rWu5rKJIFBvdW5keQ==,size_14,color_FFFFFF,t_70,g_se,x_16)
AUTOSAR网络管理状态:
-
睡眠模式(Bus-Sleep Mode):当节点没有本地网络唤醒以及远程唤醒请求时,ECU通讯控制器切换至睡眠模式,ECU功耗降低至适当水平;此模式下,NM报文只收不发,APP报文不收不发,当出现有效唤醒源时必须要被唤醒;
-
预睡眠模式(Prepare Bus-Sleep Mode):这个状态是为了等待总线上的所有节点能够在进入Bus-Sleep Mode之前有时间停止节点的active状态(如清空队列中为发送的报文);此模式下,NM报文只收不发,APP报文不收不发,如果缓冲区有APP报文那可以继续发完;等待T_WAIT_BUS_SLEEP超时后进入睡眠模式。
-
网络模式(Network Mode):
包含3个子状态:
-
重复报文状态(Repeat Message State):NM报文可收可发,APP报文可收可发
-
NM PDU 快速发送状态:以N_immediateNMCircleTime快速发送N_immediateNM_times次NM PUD
-
NM PDU 正常发送状态:以T_NM_MessageCircleTime正常周期发送NM PUD,最多T_REPEAT_MESSAGE时长
-
-
正常工作状态(Normal Operation State):NM报文可收可发,APP报文可收可发;
-
准备睡眠状态(Ready Sleep State):NM报文只收不发,APP报文可收可发;
状态迁移条件:
-
01:给ECU上电,ECU自己就会初始化进入睡眠模式。如果没有唤醒源来唤醒此节点,那就会一直待在睡眠模式。
-
02:远程唤醒,远程唤醒是其他节点想要和我通信。
-
03:当出现本地唤醒,这里再解释下,本地唤醒就是我自己想要主动和其他节点通信
-
04:快速发送次数N_immediateNM_times完成
-
05: T_NM_timerout定时器超时,不改变当前状态。定时器需要重置。
-
06: 本地唤醒条件满足且T_repeat_message超时
-
07: 收到RepeatMessageRequest bit =1的NM PDU
-
08: T_NM_timerout定时器超时,不改变当前状态。定时器需要重置。
-
09:本地唤醒条件不满足且T_NM_timeout超时
-
10:收到本地唤醒请求
-
11:收到NM报文的byte1字节的重复请求位如果置1,强制进入RMS
-
12:本地唤醒条件不满足,且T_repeat_message超时
-
13:T_NM_TIMEOUT超时
-
14: T_NM_timerout定时器超时,不改变当前状态。定时器需要重置。
-
15:收到远程唤醒请求
-
16:收到本地唤醒请求
-
17:T_WAIT_BUS_SLEEP超时
-
Nm报文格式:
Byte0:这里填的是ECU的地址,或者叫ECU的ID或偏移地址;
此报文的ID=一个基础值+Offset,例如主机厂规定的NM Base Address为0x500,那么此报文的ID=0x500+0x9=0x509;
如HUT NM ID为0x509,Offset = 9;
Byte1:
这里关注下bit0和bit4:
bit0:当此位置1时强制进入RMS;
bit4:告诉其他节点自身是怎么被唤醒的;
置0:被动唤醒、远程唤醒,比如被其他节点发送的NM报文唤醒;
置1:主动唤醒、本地唤醒,比如给ECU上电;
byte2-byte7里的user data数据由用户自行定义。