流程
1.初始化
节点上电或复位后,经初始化函数CanNm_Init()默认进入总线睡眠状态,在总线睡眠状态下应停发所有应用报文和网络管理报文,但要可以接收网络管理报文,以使得其它节点能够唤醒当前节点。
2.进入网络模式
唤醒后直接进入重复消息状态,开启两个定时器。
当节点收到了网络管理报文时,不是直接进入网络模式,而是上报应用层,应用层判断当前状态,允许的话会调用CanNm_PassiveStartup()函数,使节点进入网络模式。当节点自身想要进行网络通讯时,调用CanNm_NetworkRequest()使节点进入网络模式。前者是被动,后者是主动。后者发送的网络管理报文中CBV的Active Wakeup Bit位为1。
节点进入网络模式后,默认进入重复报文状态(网络管理报文一直发),启动定时器NM-Timeout,NM-Timeout用来记录网络管理报文是否超时,其超时时间为CanNmTimeoutTime,每收到或成功发送一帧网络管理报文,都应重启NM-Timeout。节点要开始周期发送网络管理报文。常规情况下,节点要先等待一个时间偏移量(CanNmMsgCycleOffset)后再发送第一帧网络管理报文,发送周期为CanNmMsgCycleTime,发送次数为CanNmRepeatMessageTime。
网络中所有节点的报文发送周期CanNmMsgCycleTime和CanNmTimeoutTime都是相同的,且CanNmTimeoutTime必须大于CanNmMsgCycleTime;所有节点的CanNmMsgCycleOffset都是不同的,以防止网络中所有节点同时发送网络管理报文造成网络拥塞。
3.正常工作状态
当节点在重复报文状态发送了CanNmRepeatMessageTime次网络管理报文后,需要退出重复报文状态,退出时判断网络当前处于释放状态还是请求状态,如果处于请求状态,则进入常规运行状态,如果处于释放状态,则进入准备睡眠状态。
在常规运行状态中,节点要周期发送网络管理报文,发送周期为CanNmMsgCycleTime。节点网络此时处于正常工作状态。
在常规运行状态中,定时器NM-Timeout如果超时了要被重启。
4.常规运行状态返回重复报文状态
当节点处于常规运行状态时,如果收到了Repeat Message Request置为1的网络管理报文,则会强制重新进入重复报文状态。
5.进入准备睡眠状态
当节点不再需要进行网络通讯时,应用层会调用CanNm_NetworkRelease()函数,释放网络,节点进入准备睡眠状态,停发网络管理报文,但要保持应用报文的发送。
6.重新返回常规运行状态
节点处于准备睡眠状态时,如果应用层重新需要使用网络,可以调用CanNm_NetworkRequest()函数使节点重新回到常规运行状态。
7.准备睡眠状态返回重复报文状态
当节点处于准备睡眠状态时,如果收到了Repeat Message Request置为1的网络管理报文,也会强制重新进入重复报文状态。进入重复报文状态后的逻辑同上。
8.由重复报文状态进入准备睡眠状态
重复报文状态退出时如果节点网络处于释放状态,则节点直接进入准备睡眠状态。
9.进入预睡眠模式
当节点在准备睡眠状态NM-Timeout超时,即网络中所有节点都已进入准备睡眠状态(或不处于网络模式),网络中没有网络管理报文,节点将会进入预睡眠模式,同时启动定时器Wait Bus-Sleep Timer,其超时时间为CanNmWaitBusSleepTime,所有节点的CanNmWaitBusSleepTime都应配置为相同的,以保证所有节点同时进入睡眠模式。
节点在预睡眠模式中同样不发送网络管理报文,同时还要停止应用报文的发送。
10.由预睡眠模式进入网络模式
接收到网络管理报文
11.进入睡眠模式
预睡眠模式中定时器Wait Bus-Sleep Timer超时,进入睡眠模式,睡眠模式中网络管理报文和应用报文都不发送,节点正式进入休眠状态,应尽可能地关闭功能,降低消耗。
机制
1.快发
主动唤醒网络的时候,当节点进入重复报文阶段时,在时间<CanNmImmediateNmCycleTime,共发送CanNmImmediateNmTransmissions次,然后进入常规运行阶段,之后网络管理报文的发送周期恢复CanNmMsgCycleTime。
2.总线负载降低策略(Bus Load Reduction Mechanism)
节点处于重复报文阶段和常规运行阶段的时候,都会周期性发送网络管理报文,这对总线负载是一种消耗,且网络中节点越多,总线负载占用越大。标准中制定了一种策略来降低总线负载。
只要有一个节点在发送报文,网络中所有节点就都可以保持在网络模式,多发的网络管理报文是对总线负载的浪费。
当配置参数与CanNmBusLoadReductionEnabled为有效,且节点处于常规运行阶段时,进入总线负载降低模式,此时:
节点如果接收到了一帧网络管理报文,则应将定时器CanNm Message Cycle Timer重置为CanNmMsgReducedTime,而不是CanNmMsgCycleTime,CanNmMsgReducedTime 参数是一个小于 CanNmMsgCycleTime 且大于CanNmMsgCycleTime的一半( ½ CanNmMsgCycleTime)的时间值,且每个节点的CanNmMsgReducedTime 值不同。
节点如果发送了一帧网络管理报文,则还是将定时器CanNm Message Cycle Timer重置为CanNmMsgCycleTime。
这种策略的结果是:网络中只有CanNmMsgReducedTime 值最小的两个节点交替发送网络管理报文。
当网络中只有一个节点处于常规运行阶段时,网络管理报文的周期为CanNmMsgCycleTime。
3.远程睡眠指示
当配置参数CanNmRemoteSleepIndEnabled为有效的时候,如果节点在CanNmRemoteSleepIndTime时间后仍没有收到其他节点发送的网络管理报文,说明其它节点都已经进入休眠或准备休眠,此时应调用Nm_RemoteSleepIndication()函数通知应用层网络中所有节点都进入了休眠。如果此时节点又收到了其他节点发送的网络管理报文,应该再调用Nm_RemoteSleepCancellation()函数通知应
用层取消之前的指示。该策略称为远程睡眠指示。
代码
检测主动唤醒状态接口
1.COMM_NO_COMMUNICATION
2.COMM_FULL_COMMUNICATION
网关状态机代码