我的汽车进步之路——网络管理

不使用部分网络(Non-PN):总线所有节点 "同睡同醒",是基础版状态机。

使用部分网络(Partial Network, PN):支持 "子网独立唤醒",只有对应功能域的节点被唤醒,其他节点保持休眠,进一步降低功耗。

一、基础概念与核心定时器

整个状态机由 3 个核心定时器驱动,是理解所有迁移的关键:

  1. NM-Timeout Timer(NM 超时定时器):监控总线 NM 报文活跃度,每次收到 NM 报文就重置;超时代表总线长期无管理报文。
  2. Repeat Message Timer(重复报文定时器):控制唤醒初期的快速发送窗口,确保所有节点可靠被唤醒。
  3. Wait Bus-Sleep Timer(总线等待休眠定时器):休眠前的最终确认定时器,防止瞬时干扰导致误休眠。

经典的 CAN NM 状态机,所有节点统一唤醒、统一休眠。整体分为 3 个顶层状态:Sleep ModeNetwork ModePrepare 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 报文发送状态机 (管控报文发送节奏)和节点运行状态机(管控节点是否允许休眠)。

(1)NM 报文发送状态机(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_22:NM 超时定时器到期,但因存在本地事件不能休眠,因此重启定时器,继续发送心跳维持总线唤醒。
      • NM_21:NM 报文发送失败,回到立即发送态重试发送。
  • Ready Sleep State(准备休眠态)

    • 触发场景:节点自身无本地业务,已做好休眠准备。
    • 行为:自身允许休眠,但仍监听总线;只要其他节点还在发 NM 报文,就继续保持唤醒,等待所有节点同步就绪。
    • 迁移:
      • NM_23:本地事件重新触发,回到正常运行态。
      • NM_16:NM 超时定时器到期,确认总线无节点发心跳、所有节点都准备休眠,进入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 域并行管理的迁移逻辑。

核心差异点

  1. 远程唤醒帧升级为 PNMF 普通 NM 报文升级为部分网络管理帧(PNMF),报文中携带 PN 域标识;节点只会被自身所属 PN 域的 PNMF 唤醒,不响应其他域的唤醒。

  2. 新增多 PN 域并行管理 节点可同时属于多个 PN 域,支持多子网叠加唤醒:

    • NM_07:收到其他 PN 域的唤醒请求,节点打开对应应用层 PDU 组,新增对应业务功能。
    • NM_10:正常运行态下,收到另一个 PN 域的 PNMF,打开新的 PDU 组,继续保持唤醒。
    • NM_14:准备休眠态下,收到另一个 PN 域的 PNMF,打开新 PDU 组,取消休眠。
    • NM_13:收到当前 PN 域的维持帧,当前域继续保持唤醒,节点继续在准备休眠态等待。
  3. 本地事件与 PN 域绑定 本地事件不再是全局唤醒,而是对应到具体 PN 域;触发本地事件时,节点发送对应域的 PNMF,只唤醒同域节点。

  4. 发送状态机逻辑完全复用 立即发送、重复报文、正常发送三个子状态的逻辑和基础版完全一致,仅报文中增加了 PN 域标识字段。

四、完整工作流程举例(基础版)

以 "上电→唤醒→工作→休眠" 为例,串起整个状态机:

  1. 蓄电池上电,NM 模块初始化,进入 Sleep Mode
  2. 点火触发本地事件(NM_03),节点唤醒,进入 Immediate Transmit State,立即发送 NM 报文。
  3. 进入 Repeat Message State,快速连发多帧 NM 报文,确保总线上所有节点被唤醒。
  4. 重复报文定时器超时,进入 Normal Transmit State 慢周期发心跳;同时因存在本地点火事件,进入 Normal Operation State 保持唤醒。
  5. 熄火后本地事件消失(NM_11),节点进入 Ready Sleep State,自身允许休眠,等待其他节点同步。
  6. 所有节点都进入准备休眠态,总线无 NM 心跳,NM 超时定时器到期(NM_16),进入 Prepare Bus-Sleep Mode 开启休眠倒计时。
  7. Wait Bus-Sleep 定时器到期(NM_19),确认总线无活动,正式进入 Sleep Mode,完成全流程休眠。

在 CAN 网络管理(NM)的语境里,本地事件(Local Event)是节点自身产生的、要求节点保持唤醒状态(或主动唤醒总线)的内部业务需求。简单说就是:节点自己有事情要做,不能睡觉。

它和「远程事件 / 远程唤醒(Remote Wakeup)」是一对核心对应概念:远程事件是 "别的节点喊我醒",本地事件是 "我自己有事不能睡"。

一、核心本质:休眠的第一道闸门

整个 CAN NM 状态机的同步休眠逻辑,本质是两道独立闸门:

  1. 自身闸门(本地事件):节点自己有没有未完成的业务 → 决定 "我自己想不想睡"
  2. 总线闸门(远程 NM 报文):总线上其他节点还活不活跃 → 决定 "别人睡没睡"

只有两道闸门同时满足(自己没事、总线也无活跃节点),节点才会最终进入低功耗休眠。本地事件就是优先级更高的第一道闸门 ------ 只要有本地事件存在,无论总线是否活跃,节点都绝对不允许休眠。


二、汽车 ECU 中典型的本地事件

本地事件都来自节点自身的硬件 / 软件状态,和总线通信无关,常见场景包括:

  • 电源类:点火开关打到 ON/ACC 档、蓄电池充电管理激活、硬线唤醒脚被触发
  • 功能类:BCM 检测到车门解锁 / 大灯开启 / 雨刮工作、发动机 ECU 检测到发动机运行、仪表检测到背光开启
  • 诊断类:诊断仪直连本节点、本节点触发了需上报的故障码、Bootloader 升级中
  • 硬线触发类:物理按键按下、传感器信号触发、IO 口电平变化

本地事件 vs 远程事件 核心对比

对比维度 本地事件(Local Event) 远程事件(Remote Event)
信号来源 节点自身的硬件、软件业务 总线其他节点发送的 NM 管理报文
触发逻辑 我自己有事必须做 别人有事,喊我保持在线
报文行为 会主动发送 NM 报文,唤醒整条总线 仅响应唤醒,维持自身在线,不主动发起唤醒
休眠权限 有本地事件时,节点绝对不能休眠 无本地事件时,仅靠远程事件维持唤醒,超时后即可进入休眠
典型场景 点火、按键按下、诊断连接 收到其他节点的 NM 心跳报文