本文框架
- 1. 概述
- 2. NM状态机时间参数及常用接口介绍
- 2.1 涉及时间参数说明
- 2.2 状态机切换涉及接口介绍
- 3 NM状态机及其切换介绍
- 3.1 NM状态机概览
- 3.2 NM状态机切换过程详解
1. 概述
本文为Autosar通信入门系列介绍,如您对AutosarMCAL配置,通信,诊断等实战有更高需求,可以参见AutoSar 实战进阶系列专栏,快速链接:AutoSar实战进阶系列导读
本篇我们一起看下基于CAN通信的网络管理状态机跳转过程,跳转期间会调用到的常用接口,全文大纲如下:
2. NM状态机时间参数及常用接口介绍
2.1 涉及时间参数说明
在状态机切换中有较多状态切换前需要等待的时间,即在该状态需要停留一段时间再切换到下一个状态,在这里,我们先把会用到的时间参数汇总说明如下。
时间参数 | 描述 | 对应配置项 |
---|---|---|
T_ImmediateNmCycleTime | 快速报文NM PDU的循环周期 | CanNmImmediateNmCycleTime |
N_ImmediateNm_Times | 快速报文NM PDU的次数 | CanNmImmediateNmTransmissions |
T_NM_MessageCycle | NM报文发送周期 | CanNmMsgCycleTime |
T_MsgCycleOffset | 发送第一帧NM报文的延迟事件 | CanNmMsgCycleOffset |
T_RepeatMessage | 重复消息状态的超时阈值 | CanNmRepeatMessageTime |
T_NmTimeout | NM PDU的超时阈值 | CanNmTimeoutTime |
T_WaitBusSleep | 总线静默阶段超时阈值 | CanNmWaitBusSleepTime |
2.2 状态机切换涉及接口介绍
在这里我们对NM中常用及状态机切换会用到的接口进行汇总如下:
函数名 | 描述 |
---|---|
CanNM_Init() | CAN网络管理模块的初始化函数 |
CanNM_PassiveStartUp() | 该节点收到总线其他节点NM报文被动唤醒时,可能调用该接口 |
CanNM_NetworkRequest() | 本节点主动请求网络通信,如本地唤醒事件产生后 |
CanNM_NetworkRelease() | 本节点释放网络,不再需要与其他节点进行通信 |
CanNM_RepeatMessageRequest() | 节点从常规运行状态或准备休眠状态,需要返回到重复发送报文状态时调用 |
CanNM_RxIndication() | 本节点收到其他节点的NM报文,调用此接口 |
CanNM_DisableCommunication() | 禁止NM报文发送,对于UDS 0x28服务会用到 |
CanNM_EnableCommunication() | 使能NM报文发送,对于UDS 0x28服务会用到 |
3 NM状态机及其切换介绍
3.1 NM状态机概览
CanNM网络管理核心是状态机,NM状态机分为三个模式:
Bus-Sleep Mode、Network Mode 及Prepare Bus-Sleep Mode,其中:
● Bus-Sleep Mode:总线睡眠模式,用于减少节点对蓄电池的电量消耗。
● Prepare Bus-Sleep Mode:准备总线睡眠模式,保证了节点在进入总线睡眠模式前,有足够的时间停止其网络活动,比如发送缓存中的报文。
● Network Mode:网络模式,其中Network Mode又分为3个子状态(State):
Repeat Message State:重复报文状态,该状态可以被用来检测在线节点。
Normal Operation State:常规运行状态,用于保证只要对网络通信有需求,任何一个网络节点都可以保持网络处于唤醒状态。
Ready Sleep State:准备睡眠状态,用于网络中仍有节点对通信有需求时,推迟向准备总线睡眠模式的转换。
对应的模式及状态切换示意图如下
3.2 NM状态机切换过程详解
模式切换整体示意图如下,后续将按照图片组标注的数字序号进行介绍。
1)PowerOn—>BusSleepMode
当KL30上电或当前节点处于休眠情况下被总线上其他节点唤醒时会执行初始化的操作,CanNM_Init()初始化完成后,CanNM状态机变为第一个模式BusSleepMode,即总线睡眠模式。
在BusSleep模式下会判断唤醒条件是否满足,如不满足则停留在睡眠模式下,直到满足休眠或被唤醒条件。
2)BusSleepMode—>RepeatMessage State
如唤醒条件满足,会根据当前是主动唤醒还是被动唤醒分别调用接口CanNM_NetworkRequest()或CanNM_PassiveStartUp(),将状态切换至RepeatMessage State,在这里需要注意,进入RepeatMessage State后会根据唤醒的原因是主动唤醒还是被动唤醒决定是否进入快发状态:
①主动唤醒情况:以T_ImmediateNmCycleTime的周期快速发送N_ImmediateNm_Times次NM,目的是快速唤醒总线上其他节点,CBV中的Active Wake up bit置为1;
②被动唤醒情况:说明总线上已经有其他节点醒来,不需要自己去唤醒总线上其他节点,只需要以T_NM_MessageCycle 周期发送NM报文即可。
在RepeatMessage State下停留的时间为T_RepeatMessage,超时后将切换到后续状态。
3)PrepareBusSleepMode—>RepeatMessage State
同样在当前节点处于PrepareBusSleepMode准备休眠模式时也会在该状态停留T_WaitBusSleep 时间,如在此期间检测到主动唤醒或被动唤醒需求同样会调用CanNM_NetworkRequest()或CanNM_PassiveStartUp(),将状态切换至RepeatMessage State,后续在RepeatMessage状态中执行的操作与"2)BusSleepMode—>RepeatMessage State"中一致,在此不再赘述。
4)RepeatMessage State—>NormalOperation State
当状态机在RepeatMessage State停留时间达到 T_RepeatMessage后,如ECU需要保持唤醒状态,会调用接口CanNM_NetworkRequest()进入NormalOperation State即常规运行状态。
5)NormalOperation State—>RepeatMessage State
在NormalOperation State状态下有两种情况会切换回RepeatMessage State:
①如ECU收到其他节点NM报文中的Repeat message bit位置1了;
②自身节点有Repeat Message需要,通过调用接口CanNM_RepeatMessageRequest() 来实现,在这种情况下,本节点发送的NM报文中Repeat message bit位也会置1。
6)NormalOperation State—>ReadySleep State
在常规运行状态下,如本节点没有与其他节点交互的需求,会通过接口CanNM_NetworkRelease()释放网络管理请求,将状态切换到ReadySleep State准备休眠状态。
7)ReadySleep State—>NormalOperation State
在准备休眠情况下,如存在本地唤醒源或与其他节点的通信需求,会调用接口CanNM_RepeatMessageRequest() 将状态重新切换回NormalOperation State。
8)RepeatMessage State—>ReadySleep State
在RepeatMessage State状态下,停留时间达到 T_RepeatMessage后,如ECU不需要保持唤醒状态,会调用接口CanNM_NetworkRelease()进入ReadySleepState即准备休眠状态。
9)ReadySleep State—>RepeatMessage State
与NormalOperation State状态切换回RepeatMessage State情况一致,同样有两种可能原因:
①如ECU收到其他节点NM报文中的Repeat message bit位置1了;
②自身节点有Repeat Message需要,通过调用接口CanNM_RepeatMessageRequest() 来实现,在这种情况下,本节点发送的NM报文中Repeat message bit位也会置1。
10)ReadySleep State—>PrepareBusSleepMode
在ReadySleep State下,如没有本地或网络唤醒请求,且T_NmTimeout 超时后,NM状态机会切换到PrepareBusSleepMode,同时启动T_WaitBusSleep 定时器。
11)PrepareBusSleepMode—>BusSleepMode
在T_WaitBusSleep定时器达到设定阈值前,如仍没有本地或网络请求,则进入总线休眠模式,如有本地或网络请求则通过CanNM_NetworkRequest()或CanNM_PassiveStartUp()切换回RMS状态。