我的汽车进步之路——网络管理 不使用部分网络Non-PN总线所有节点 “同睡同醒”是基础版状态机。使用部分网络Partial Network, PN支持 “子网独立唤醒”只有对应功能域的节点被唤醒其他节点保持休眠进一步降低功耗。一、基础概念与核心定时器整个状态机由 3 个核心定时器驱动是理解所有迁移的关键NM-Timeout TimerNM 超时定时器监控总线 NM 报文活跃度每次收到 NM 报文就重置超时代表总线长期无管理报文。Repeat Message Timer重复报文定时器控制唤醒初期的快速发送窗口确保所有节点可靠被唤醒。Wait Bus-Sleep Timer总线等待休眠定时器休眠前的最终确认定时器防止瞬时干扰导致误休眠。经典的 CAN NM 状态机所有节点统一唤醒、统一休眠。整体分为 3 个顶层状态Sleep Mode、Network Mode、Prepare Bus-Sleep Mode。1. Sleep Mode休眠模式状态含义节点低功耗休眠CAN 控制器与 NM 模块关闭不参与总线通信。进入条件NM_19总线等待休眠定时器超时确认总线无活动从准备休眠态正式进入休眠。NM_20蓄电池断电Bat Power Off任意状态下直接掉电。退出唤醒条件NM_02远程唤醒收到总线上其他节点的 NM 报文同时启动 NM 超时定时器、重复报文定时器。NM_03本地事件唤醒如点火、开关触发等节点自身事件同样启动两个定时器。 唤醒后直接进入Network Mode下的立即发送态。2. Network Mode网络模式节点正常工作、参与总线网络管理的模式内部包含两组并行的子状态机NM 报文发送状态机管控报文发送节奏和节点运行状态机管控节点是否允许休眠。1NM 报文发送状态机3 个子状态控制节点发送 NM 报文的频率保障唤醒可靠、运行稳定。Immediate Transmit State立即发送态触发场景刚被唤醒、休眠中被重新唤醒、NM 报文发送失败重试。行为立即发送一帧 NM 报文快速通知总线 “节点已唤醒”。迁移发送完成后NM_04进入重复报文态。Repeat Message State重复报文态触发场景唤醒初期、有新事件需要主动通知总线。行为以较高频率重复发送 NM 报文通常连续发多帧避免丢包导致部分节点未唤醒。迁移重复报文定时器超时NM_05后进入正常发送态。Normal Transmit State正常发送态触发场景总线稳定唤醒后。行为以低周期通常 500ms~1s周期性发送 NM 报文作为 “心跳” 维持总线唤醒。迁移若有新的本地 / 远程事件NM_06回到重复报文态再次快速发报文通知总线。2节点运行状态机2 个子状态由节点自身的业务需求决定控制节点是否允许休眠。Normal Operation State正常运行态触发场景节点有本地业务需要处理如发动机运行、功能激活。行为节点强制保持唤醒不允许休眠持续维持 NM 报文心跳。迁移NM_11所有本地事件消失节点无业务需求进入准备休眠态。NM_22NM 超时定时器到期但因存在本地事件不能休眠因此重启定时器继续发送心跳维持总线唤醒。NM_21NM 报文发送失败回到立即发送态重试发送。Ready Sleep State准备休眠态触发场景节点自身无本地业务已做好休眠准备。行为自身允许休眠但仍监听总线只要其他节点还在发 NM 报文就继续保持唤醒等待所有节点同步就绪。迁移NM_23本地事件重新触发回到正常运行态。NM_16NM 超时定时器到期确认总线无节点发心跳、所有节点都准备休眠进入Prepare Bus-Sleep Mode开启最终休眠倒计时。3. Prepare Bus-Sleep Mode准备总线休眠模式休眠前的 “最后确认阶段”防止误休眠。行为启动 Wait Bus-Sleep 定时器持续监听总线活动。迁移NM_19定时器到期确认总线持续无活动正式进入 Sleep Mode。NM_17收到远程 NM 报文/ NM_18触发本地事件取消休眠重新回到网络模式的立即发送态再次唤醒总线。NM_20蓄电池断电直接掉电。使用部分网络PN 版状态机详解部分网络Partial Network是进阶功能总线被划分为多个逻辑子网PN 域只有对应域的节点会被唤醒其余节点保持休眠比如解锁只唤醒车身域动力 / 娱乐域继续休眠。和基础版相比核心差异在于所有远程唤醒都增加了 PN 域校验并新增了多 PN 域并行管理的迁移逻辑。核心差异点远程唤醒帧升级为 PNMF普通 NM 报文升级为部分网络管理帧PNMF报文中携带 PN 域标识节点只会被自身所属 PN 域的 PNMF 唤醒不响应其他域的唤醒。新增多 PN 域并行管理节点可同时属于多个 PN 域支持多子网叠加唤醒NM_07收到其他 PN 域的唤醒请求节点打开对应应用层 PDU 组新增对应业务功能。NM_10正常运行态下收到另一个 PN 域的 PNMF打开新的 PDU 组继续保持唤醒。NM_14准备休眠态下收到另一个 PN 域的 PNMF打开新 PDU 组取消休眠。NM_13收到当前 PN 域的维持帧当前域继续保持唤醒节点继续在准备休眠态等待。本地事件与 PN 域绑定本地事件不再是全局唤醒而是对应到具体 PN 域触发本地事件时节点发送对应域的 PNMF只唤醒同域节点。发送状态机逻辑完全复用立即发送、重复报文、正常发送三个子状态的逻辑和基础版完全一致仅报文中增加了 PN 域标识字段。四、完整工作流程举例基础版以 “上电→唤醒→工作→休眠” 为例串起整个状态机蓄电池上电NM 模块初始化进入Sleep Mode。点火触发本地事件NM_03节点唤醒进入Immediate Transmit State立即发送 NM 报文。进入Repeat Message State快速连发多帧 NM 报文确保总线上所有节点被唤醒。重复报文定时器超时进入Normal Transmit State慢周期发心跳同时因存在本地点火事件进入Normal Operation State保持唤醒。熄火后本地事件消失NM_11节点进入Ready Sleep State自身允许休眠等待其他节点同步。所有节点都进入准备休眠态总线无 NM 心跳NM 超时定时器到期NM_16进入Prepare Bus-Sleep Mode开启休眠倒计时。Wait Bus-Sleep 定时器到期NM_19确认总线无活动正式进入Sleep Mode完成全流程休眠。在 CAN 网络管理NM的语境里本地事件Local Event是节点自身产生的、要求节点保持唤醒状态或主动唤醒总线的内部业务需求。简单说就是节点自己有事情要做不能睡觉。它和「远程事件 / 远程唤醒Remote Wakeup」是一对核心对应概念远程事件是 “别的节点喊我醒”本地事件是 “我自己有事不能睡”。一、核心本质休眠的第一道闸门整个 CAN NM 状态机的同步休眠逻辑本质是两道独立闸门自身闸门本地事件节点自己有没有未完成的业务 → 决定 “我自己想不想睡”总线闸门远程 NM 报文总线上其他节点还活不活跃 → 决定 “别人睡没睡”只有两道闸门同时满足自己没事、总线也无活跃节点节点才会最终进入低功耗休眠。本地事件就是优先级更高的第一道闸门 —— 只要有本地事件存在无论总线是否活跃节点都绝对不允许休眠。二、汽车 ECU 中典型的本地事件本地事件都来自节点自身的硬件 / 软件状态和总线通信无关常见场景包括电源类点火开关打到 ON/ACC 档、蓄电池充电管理激活、硬线唤醒脚被触发功能类BCM 检测到车门解锁 / 大灯开启 / 雨刮工作、发动机 ECU 检测到发动机运行、仪表检测到背光开启诊断类诊断仪直连本节点、本节点触发了需上报的故障码、Bootloader 升级中硬线触发类物理按键按下、传感器信号触发、IO 口电平变化本地事件 vs 远程事件 核心对比对比维度本地事件Local Event远程事件Remote Event信号来源节点自身的硬件、软件业务总线其他节点发送的 NM 管理报文触发逻辑我自己有事必须做别人有事喊我保持在线报文行为会主动发送 NM 报文唤醒整条总线仅响应唤醒维持自身在线不主动发起唤醒休眠权限有本地事件时节点绝对不能休眠无本地事件时仅靠远程事件维持唤醒超时后即可进入休眠典型场景点火、按键按下、诊断连接收到其他节点的 NM 心跳报文