扫描关注一起学嵌入式,一起学习,一起成长
大家好,今天这篇文章来自一位汽车电子软件的大佬,将这篇文章分享给大家。感谢这位大佬的投稿。
AUTOSAR CAN 网络管理是一个独立于硬件的协议,只能在 CAN 上使用。它的主要目的是协调网络的正常运行和总线休眠模式之间的转换。除了核心功能之外,还提供了可配置功能,例如, 实施服务来检测所有当前节点或检测是否所有其他节点都准备好休眠。CAN 网络管理(CanNm)功能提供网络管理接口(NmIf)和 CAN 接口(CanIf)模块之间的适配。网络管理的制约
- CanNm 的一个通道只与一个网络中的一个网络管理集群相关联。一个网络管理群集在一个节点中只能有一个 CanNm 通道。
- CanNm 的一个通道仅与同一 ECU 内的一个网络相关联。
网络管理协议
- 本地唤醒请求, 即来自该节点内部的对网络的唤醒请求。
- 远程唤醒请求, 即来自网络上其他节点的网络管理报文请求。
当节点没有本地网络唤醒及远程唤醒请求时, ECU 通讯控制器切换至睡眠模式, ECU 功耗降低至适当水平。在睡眠模式下,节点的网络管理报文和应用报文禁止发送,并且不能对总线上的报文进行 ACK 应答;但可以被总线上的报文唤醒,在被唤醒后才可以对总线报文进行ACK 应答。同时节点在该模式下,如果检测到有效的唤醒源,节点必须被唤醒。当节点进入预睡眠模式时,将启动T_WAIT_BUS_SLEEP定时器。在预睡眠模式下,总线活动需静止下来,最终达到总线上没有活动,但ECU通讯控制器状态应处于工作模式。在该模式下,节点的网络管理报文和应用报文禁止发送(为了清空发送缓存,允许将发送队列中已有的报文发完),但需对总线上的报文进行ACK应答。当节点进入网络模式时,将启动 T_NM_TIMEROUT 定时器。在网络模式下成功接收或者发送网络管理报文时,节点将重新启动 T_NM_TIMEROUT 定时器。重复报文状态确保节点从睡眠模式或预睡眠模式到网络模式的转换对网络上的其他节点可见。进入重复报文状态时,节点将(重新)开始网络管理报文的发送,并启动 T_REPEAT_MESSAGE 定时器。应用报文必须在第一帧网络管理报文发送开始后且小于 T_STARTx_AppFrame 内发送。节点的网络管理状态将保持在重复报文状态直到 T_REPEAT_MESSAGE 时间截止,一旦该时间超时,网络管理状态应该离开重复报文状态。在 重 复 报 文 状 态 下 , 节 点 一 旦 接 收 或 发 送 一 条 网 络 管 理 报 文 , 或 者T_NM_TIMEROUT 超时,则 T_NM_TIMEROUT 立即重置。- NM 快速发送子状态。节点在进入 NM 快速发送子状态时,为了快速唤醒网络,节点必须以快速周期T_NM_ImmediateCycleTime 发送网络管理报文。发送的快速网络管理报文数量由参数 N_ImmediateNM_TIMES 决定,节点每次成功发送一条快速周期网络管理报文时,该数值应递减 1。
- NM 正常发送子状态。进入NM正常发送子状态后,节点必须以正常周期T_NM_MessageCycle发送网络管理报文。
当节点因发生本地唤醒事件需要与网络上的其他节点进行通讯时,必须保持在常规操作状态,并且以正常周期 T_NM_MessageCycle 发送网络管理报文。在常规操作状态下,节点一旦接收或发送一条网络管理报文,或者 T_NM_TIMEROUT 超时,则 T_NM_TIMEROUT 应该立即重置。在常规操作状态下,节点的网络管理报文和应用报文必须正常发送。在准备睡眠状态下,节点一旦接收到一条网络管理报文, T_NM_TIMEROUT应该立刻重置。T_NM_TIMEROUT超时,节点的网络管理状态应进入预睡眠模式。网络管理报文
CAN 网络管理报文 ID 范围从 0x500~0x53F,其中报文优先级定义为(110) 2 = 6 级, FFFA 为网络管理 PGN(自定义),00~FF 为 ECU 源地址SA;网络管理报文数据场的字节 1 用于发送控制比特向量(Control Bit Vector),字节 2~7 用户自定义:当控制器有重复报文请求,主动回到重复报文状态,并将重复报文请求位置 1;当该控制器离开重复报文状态,将重复报文请求位清零;控制器由于其他条件(本地唤醒或接收到其他控制器重复报文状态位置 1 的 NM 报文)而回到重复报文状态,重复报文请求位保持 0。当控制器由于本地唤醒进入重复报文状态时,主动唤醒位置 1,直到重新进入预睡眠模式时清零;当控制器由于远程 NM 报文唤醒,主动唤醒位保持 0。网络管理常用参数
状态迁移
网络管理节点的上电后(Battery Power on),节点进行网络管理模块初始化,初始化完成后进入睡眠模式,具备被本地唤醒事件或者远程唤醒请求的能力。当网络管理节点处于睡眠模式时,如果收到有效的远程唤醒请求,那么节点必须离开睡眠模式并进入重复报文状态的 NM 正常发送子状态。进入 NM 正常发送子状态后,在定时器 T_REPEAT_MESSAGE 超时前,节点必须以以 T_NM_MessageCycle 为周期发送网络管理报文。如果节点在睡眠模式下检测到本地唤醒请求,那么节点必须主动唤醒网络, 进入NM 快速发送子状态, 并将主动唤醒位设置为 1。节点进入 NM 快速发送子状态后,需以 T_NM_ImmediateCycleTime 为周期,发送数量为 N_ImmediateNM_TIMES 的网络管理报文。处于 NM 快速发送子状态的节点,在计数器 N_ImmediateNM_TIMES 为零时,将进入 NM 正常发送子状态。处于重复发送状态下的节点,如果 T_NM_TIMEROUT 超时,节点的网络管理状态不应改变,但 T_NM_TIMEROUT 必须重置。处于 NM 正常发送子状态的节点,当 T_REPEAT_MESSAGE 超时, 主动唤醒模式下,则进入常规操作状态。节点继续保持以正常周期 T_NM_MessageCycle发送网络管理报文和相关的应用报文。处于常规操作状态的节点,如果节点自身有重复报文请求,节点将网络管理状态切换到重复报文状态的 NM 快速发送子状态;如果节点收到其他节点重复报文请求位置 1 的 NM 报文,节点将网络管理状态切换到重复报文状态的 NM 正常发送子状态。处于常规操作状态下的节点,如果 T_NM_TIMEROUT 超时,节点的网络管理状态不应改变,但 T_NM_TIMEROUT 必须重置。处于常规操作状态下的节点,如果本身不需要网络,节点马上将网络管理状态切换到准备睡眠状态,同时停止发送网络管理报文,保持应用报文的发送和接受,每次接受到网络管理报文,重置T_NM_TIMEROUT定时器。处于准备睡眠状态的节点,如果检测到本地唤醒请求,则将网络管理状态切换到常规操作状态。处于准备睡眠状态的节点,如果节点自身有重复报文请求,节点将网络管理状态切换到重复报文状态的 NM 快速发送子状态;如果节点收到其他节点重复报文请求位置 1 的 NM 报文,节点将网络管理状态切换到重复报文状态的 NM 正常发送子状态。处于 NM 正常发送子状态下的节点,当 T_REPEAT_MESSAGE 超时,且自身无网络请求,节点将立即进入准备睡眠状态,并开启CANNM_WBS_TIMER定时器。处 于 准 备 睡 眠 状 态 的 节 点, 如 果 不 再 收 到 本 地 或 远 程 唤 醒 请 求 , 在CANNM_WBS_TIMER超时后,节点将进入预睡眠模式,进入预睡眠模式后开启T_WAIT_BUS_SLEEP 定时器.处于网络模式的节点,在成功接收或者发送一帧网络管理报文后,节点的网络处于预睡眠模式的节点,如果收到远程唤醒请求,将进入重复报文状态的 NM 正常发送子状态。处于预睡眠模式的节点,如果收到本地唤醒请求,将进入重复报文状态的 NM 快速发送子状态。处 于 预 睡 眠 模 式 的 节 点 , 如 果 不 再 收 到 本 地 或 远 程 唤 醒 请 求 ,在T_WAIT_BUS_SLEEP 超时后,节点将进入睡眠模式。故障处理
节点的网络管理所在的网络总线不可用时,必须执行如下行为:- 如果节点没有准备好睡眠,但总线变得不可用,则不应该进入睡眠模式。
- 如果节点已准备好睡眠,但总线变得不可用,则应该进入睡眠模式。
- 如果总线不可用,但节点状态变为准备睡眠,则应该进入睡眠模式。
- 如果总线不可用,但节点状态变为未准备好睡眠,则不应该进入睡眠模式。
网络管理的故障处理不适用于已经处于睡眠模式的节点,因为在睡眠模式下无通信行为,此时总线不可用是难以检测到的。
觉得文章不错,点击“分享”、“赞”、“在看” 呗!