网络管理各状态转换

发布时间 2023-08-10 13:05:48作者: 芒果酸奶

详细说一下各个状态之间是如何转换的,以及节点处于每个状态时要做哪些工作。
① 初始化
节点上电或复位后,经初始化函数 CanNm_Init()默认进入总线睡眠状态,在总
线睡眠状态 CanNm_Sleep 下应停发所有应用报文和网络管理报文,但要可以接收
网络管理报文,以使得其它节点能够唤醒当前节点。
② 进入网络模式
当节点收到了网络管理报文时,不是直接进入网络模式,而是上报应用层,应用
层判断当前状态,允许的话会调用 CanNm_PassiveStartup()函数,使节点进入
网络模式。当节点自身想要进行网络通讯时,调用 CanNm_NetworkRequest()使
节点进入网络模式。前者是被动,后者是主动。后者发送的网络管理报文中 CBV
的 Active Wakeup Bit 位为 1.
节点在网络模式中要一直发送应用报文。
节点进入网络模式后,默认进入重复报文阶段,启动定时器 NM-Timeout,
NM-Timeout 用来记录网络管理报文是否超时,其超时时间为 CanNmTimeoutTime,
每收到或成功发送一帧网络管理报文,都应重启 NM-Timeout。节点要开始周期
发 送 网 络 管 理 报 文 。 常 规 情 况 下 , 节 点 要 先 等 待 一 个 时 间 偏 移 量
(CanNmMsgCycleOffset)后再发送第一帧网络管理报文,发送周期为
CanNmMsgCycleTime,发送次数为 CanNmRepeatMessageTime。
网络中所有节点的报文发送周期 CanNmMsgCycleTime 和 CanNmTimeoutTime 都是
相同的,且 CanNmTimeoutTime 必须大于 CanNmMsgCycleTime;所有节点的
CanNmMsgCycleOffset 都是不同的,以防止网络中所有节点同时发送网络管理报
文造成网络拥塞。
③ 进入常规运行阶段
当节点在重复报文阶段发送了 CanNmRepeatMessageTime 次网络管理报文后,需
要退出重复报文阶段,退出时判断网络当前处于释放状态还是请求状态,如果处
于请求状态,则进入常规运行阶段,如果处于释放状态,则进入准备睡眠阶段。
在 常 规 运 行 阶 段 中 , 节 点 要 周 期 发 送 网 络 管 理 报 文 , 发 送 周 期 为
CanNmMsgCycleTime。节点网络此时处于正常工作状态。
在常规运行阶段中,定时器 NMTimeout 如果超时了要重启。
④ 由常规运行阶段返回重复报文阶段
当节点处于常规运行阶段时,如果收到了 Repeat Message Request 置为 1 的网
络管理报文,则会强制重新进入重复报文阶段。
⑤ 进入准备睡眠阶段
当节点不再需要进行网络通讯时,应用层会调用 CanNm_NetworkRelease()函数,
释放网络,节点进入准备睡眠阶段,停发网络管理报文,但要保持应用报文的发
送。
⑥ 重新返回常规运行阶段
节点处于准备睡眠阶段时,如果应用层重新需要使用网络,可以调用
CanNm_NetworkRequest()函数使节点重新回到常规运行阶段。
⑦ 准备睡眠阶段返回重复报文阶段
当节点处于准备睡眠阶段时,如果收到了 Repeat Message Request 置为 1 的网
络管理报文,也会强制重新进入重复报文阶段。进入重复报文阶段后的逻辑同上。
⑧ 由重复报文阶段进入准备睡眠阶段
如上文所述,当重复报文阶段退出时如果节点网络处于释放状态,则节点直接进
入准备睡眠阶段。
⑨ 进入预睡眠模式
当节点在准备睡眠阶段 NM-Timeout 超时,即网络中所有节点都已进入准备睡眠
阶段(或不处于网络模式),网络中没有网络管理报文,节点将会进入预睡眠模
式 , 同 时 启 动 定 时 器 Wait Bus-Sleep Timer , 其 超 时 时 间 为
CanNmWaitBusSleepTime,所有节点的 CanNmWaitBusSleepTime 都应配置为相同
的,以保证所有节点同时进入睡眠模式。
节点在预睡眠模式中同样不发送网络管理报文,同时还要停止应用报文的发送。
⑩ 由预睡眠模式进入网络模式
当节点处于预睡眠模式的时候,应用层想要使用网络进行通讯,或收到了其他节
点的网络管理报文,就会重新进入网络模式,也是默认进入重复报文阶段。
⑪ 进入睡眠模式
当节点在预睡眠模式中定时器 Wait Bus-Sleep Timer 超时后,就会进入睡眠模
式,睡眠模式中网络管理报文和应用报文同样都不发送,节点正式进入休眠状态,
应尽可能地关闭功能,降低能量消耗。
注:CAN 节点模式开始之前要查看 CAN busoff 状态