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

📅 2026/7/2 17:39:04 👁️ 阅读次数 📝 编程学习
我的汽车进步之路——网络管理

不使用部分网络(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 心跳报文