CAN总线休眠与唤醒机制解析
引言
在现代汽车电子系统中,CAN总线的休眠与唤醒机制至关重要。车辆熄火停放时,大量ECU(电子控制单元)需要进入低功耗“睡眠”状态,以保证蓄电池不会过度消耗。然而,当需要某些功能(例如无钥匙进入、远程控制等)时,又必须迅速唤醒相关ECU恢复通信。本文将详细探讨以下内容:
- 部分网络(Partial Networking, PN)的概念及其管理流程
- CAN收发器的电平唤醒原理(WUP唤醒模式和WUF唤醒帧)
- CAN控制器和收发器的低功耗模式设计
- CAN总线唤醒时的波形和时序分析
- 唤醒报文的过滤判决机制
- 基于NXP S32G平台的软件栈(AUTOSAR CanSM、CanTrcv、CanNm、CanIf、CanDrv)交互流程
- 实车调试方法和常见故障的排查技巧
CAN总线休眠与唤醒的基础概念
为什么需要休眠和唤醒? 当车辆熄火停放时,大部分ECU并不需要保持工作,但如果它们持续耗电,将在数天或数周内耗尽电瓶。因此,我们希望在车辆不运行时,让车上的各CAN节点进入休眠(Sleep)或待机(Standby)状态,从而使整车网络的电流降到微安级别。然而,某些情况下需要远程唤醒ECU,例如用户按下遥控钥匙解锁车辆,此时相关的ECU必须及时从休眠中被唤醒并执行动作。CAN总线的唤醒机制正是为了解决这种“既要低功耗休眠,又要按需快速唤醒”的矛盾。
传统CAN收发器按照ISO11898-5标准,使用*“任意总线活动唤醒”*策略:只要检测到CAN总线有通信活动(总线从静默转为显性电平),收发器就会认为是唤醒信号并将ECU唤醒。这种方式简单直接,但缺点是无法区分唤醒意图——不论总线上传输的是哪台ECU的消息,任何通信都会唤醒所有处于待机的ECU。这意味着如果仅某个模块需要通信,也会把整个网络上其他休眠节点都唤醒,造成不必要的功耗浪费。
为了解决上述问题,新一代标准引入了部分网络(Partial Networking, PN)技术,也称选择性唤醒。部分网络允许总线中只有特定的ECU在需要时被唤醒,而其余ECU仍保持睡眠,从而 延长ECU低功耗休眠时间,降低车辆整体电流消耗。支持PN的收发器仅对特定的“唤醒帧”有反应,非目标消息将被忽略,不会贸然唤醒ECU。与传统收发器“有报文就唤醒”相比,部分网络机制显著改善了停车静态电流,高效节能。此外,部分网络还能实现分组或单个ECU的有选择地唤醒,而不是整个网络一起唤醒。
总结来说,CAN总线休眠/唤醒机制的基础是:当网络空闲达到一定时间后,各节点进入低功耗模式;当需要时,通过总线发送特殊信号使目标节点恢复正常模式。接下来,我们将深入剖析这一过程在协议和硬件层面的细节,首先从部分网络唤醒的原理开始。
Partial Networking(选择性唤醒)的原理详解
部分网络(PN)是近年来CAN标准(ISO11898-6:2013/ISO11898-2:2016等)新增的功能,其核心在于**“两步式”的唤醒流程**:先由总线活动触发唤醒序列开始(Wake-Up Pattern,WUP),再通过特定唤醒帧(Wake-Up Frame,WUF)确认并完成唤醒。这一过程确保只有收到匹配特定条件的消息时,PN节点才真正唤醒,从而筛除无关的总线活动。下面我们分别介绍WUP和WUF的定义和作用。
唤醒模式WUP:总线唤醒序列
WUP(Wake-Up Pattern)指总线上一段特殊的电平序列,它标志着“有设备开始通信”并触发所有节点从休眠进入唤醒预备状态。根据ISO11898-2:2016定义,WUP由“显性–隐性–显性”两个连续显性电平、中间夹一个隐性电平组成,每段持续时间至少为规定的滤波时间tFilter。具体来说:若总线检测到一次持续时间≥tFilter的显性电平,然后是一段≥tFilter的隐性电平,再接着又一段≥tFilter的显性电平,那么这个显-隐-显序列被确认为有效WUP,可触发远程唤醒。标准规定tFilter在0.5µs~5µs范围内,不同收发器内部实现有所差异:
- 显性电平 < 0.5µs的短脉冲将被忽略(认为是噪声)。
- 显性电平 > 5µs的长脉冲必定触发唤醒(满足最严苛滤波)。
- 0.5~5µs之间的不定长显性电平可能触发唤醒,具体取决于收发器的滤波设置阈值。
旧标准ISO11898-5:2007曾规定简单的“一个显性脉冲即可唤醒”机制,这在低波特率(如125kbps)下一个位时间足够长,可以满足唤醒条件;但在较高波特率下(500kbps一个位仅2µs)需要多个连续位的显性才能累计超过滤波阈值。例如,经典CAN基本帧在500kbps速率下,其控制场中连续三个显性位(RTR、IDE、r0)构成约6µs的显性电平,已经超过5µs阈值,能形成有效显性段。因此,一个标准CAN帧本身往往包含所需的显性序列,正常CAN通信中的帧即可提供WUP序列。ISO11898-2:2016引入新WUP判据(双显性间隔隐性)后,提高了抗噪性能,避免了单个尖刺干扰就误唤醒的问题。
当总线安静一段时间后进入休眠状态,所有收发器都会将总线状态视为隐性稳定。此时任意节点发送第一个CAN帧,帧开始的位(如SOF起始位)将呈现显性电平并持续一个位时间,紧接着帧中也会有隐性和显性的交替。这第一个帧的前若干位就构成了WUP序列。例如:显性(SOF位)-隐性(帧间隙或仲裁场中的隐性位)-显性(仲裁场中显性位)即可形成WUP。因此WUP实际上是正常CAN帧数据中的一部分,只是收发器用特殊滤波器将其识别出来。
对于非PN普通收发器而言,一旦检测到WUP序列(即有总线活动),它们会立即将ECU从睡眠中唤醒,切换到待机状态。待机模式下,ECU上电且收发器准备好进入正常模式。但对于PN收发器,反应有所不同:它不会立刻完全唤醒,而是进入一种“半清醒”状态,继续监听后续的唤醒帧WUF。简单来说,WUP对于PN节点只是“有人叫醒你了”的预通知,而是否真的起床,则要看接下来叫你的是不是点你的名。
在PN收发器内部,这种机制体现为睡眠模式细分为两级:深度睡眠(Deep Sleep)和选择性监听睡眠(Selective Listening Sleep)。具体而言,在平时深度睡眠时,收发器将停止总线偏置,使CAN_H和CAN_L引脚电压下拉接近地电位(总线共模约0V);只有低功耗接收器在暗中“偷听”总线电平,以微安级电流等待唤醒信号。一旦检测到符合WUP特征的活动,收发器便切换到选择性监听状态:重新给总线加上2.5V偏置(恢复正常隐性电平的共模),同时启动唤醒帧接收器来监听总线帧内容。这个过程中,收发器仍然不把任何总线数据传递给MCU的RXD引脚(MCU仍保持睡眠),只是在内部“观察”总线通信。处于选择性监听时,收发器虽然部分电路激活,但仍属于睡眠范畴,电流仅约几百微安,远低于非PN节点被完全唤醒后几十上百毫安的待机电流。如下图描述了收发器不同模式下总线偏置和电路状态:
典型ECU硬件电源与唤醒拓扑示意:MCU及其电源管理IC(PMIC)通过IGN信号(KL15)供电,当点火关闭时ECU依赖电池常电(KL30)进入休眠。支持部分网络的CAN收发器在Sleep模式时仍由电池供电并监测总线,通过INH引脚控制PMIC使MCU上电或断电。图中蓝色部分为CAN收发器,其通过SPI由MCU配置唤醒ID过滤等;休眠时若监测到有效的远程唤醒,总线活动触发收发器从Sleep切换Standby并将INH拉高启动车载电源,MCU由此复位上电。
唤醒帧WUF:选择性唤醒过滤
在WUP将PN节点“半唤醒”后,真正决定其是否完全唤醒的,是随后接收到的唤醒帧(Wake-Up Frame, WUF)。WUF可以是总线上任意一个符合特定条件的标准CAN报文。每个PN收发器/ECU都会提前配置一个“唤醒报文ID”和若干字节的数据模式,当且仅当检测到的报文与预设的ID及数据模式匹配时,才认为这是“叫自己的”唤醒帧,于是触发ECU彻底唤醒;反之,如果收到的报文不符,PN节点就会继续沉睡,不受打扰。
唤醒帧过滤机制通常通过收发器内部的帧解码器实现。以NXP和TI的部分网络收发器为例,它们内置了一个小型的CAN帧过滤单元,包含可配置的寄存器:唤醒帧ID、ID掩码、DLC和数据掩码等。具体过滤逻辑如下:
ID字段匹配:可以配置11位标准ID或29位扩展ID,以及对应的掩码位。掩码位为1表示相应位必须匹配,为0表示忽略该位。在比较时,报文ID各bit与配置ID逐位比对,有掩码的位要求完全相同,无掩码的位则不影响结果。如果所有要求比对的位都吻合,则ID匹配成功。例如配置ID=0x100,掩码=0x7F0表示仅高7位有效,则0x100~0x10F都可视为匹配ID。
DLC及数据匹配:可以选择是否启用数据域匹配(由DATA_MASK_EN位控制)。若启用,则接收报文的DLC(数据长度代码)必须与预设值相同,同时数据区按照配置的掩码进行比对。一般做法是指定前1~2字节的数据内容作为唤醒关键字。例如某ECU设置“唤醒帧ID=0x123,DLC=2字节,数据字节0的第1位=1,字节1的第7位=1”,那么当总线上出现ID为0x123、长度2字节,且这两个字节中任意一个满足对应位为1的条件时,即可算作有效WUF。多数收发器的数据匹配采用位掩码OR匹配规则:配置为1的比特位只要在接收帧中出现1,即认为数据匹配成功(不要求同时满足所有位,这降低了滤波逻辑复杂度)。如果DLC不符或数据位条件都不满足,则此帧不会被视作有效WUF。
远程帧过滤:部分收发器允许/禁止远程帧作为WUF。通常若启用数据匹配,则远程帧(无数据帧)不被当作有效WUF。唤醒帧一般使用有数据的数据帧而非远程帧,以便提供附加的过滤信息。
当PN收发器成功接收到匹配其配置的CAN报文后,就确认这是有效唤醒帧。此时收发器内部会结束选择性监听过程,将ECU真正唤醒:将自身模式从Sleep切换为Standby或Normal模式,并通过RXD脚、电源控制引脚等通知MCU。如果该ECU的MCU先前已断电(如通过INH切断供电),收发器进入Standby时会重新拉高INH脚,上电MCU;如果MCU处于停止模式,收发器则可能在RXD输出一个低脉冲或触发中断,引发MCU退出低功耗。总之,ECU进入唤醒状态并开始正常运行它的程序逻辑。在这之后,收发器也进入Normal模式,可以自由收发CAN帧,与总线恢复通信联系。
未匹配的情况:如果PN节点在WUP之后监听了一些帧,但始终没有看到与其配置吻合的WUF,它会在总线恢复安静一段时间(tSilence)后认为此次唤醒无效,重新进入深度睡眠,将总线偏置拉回地电位,静候下一次机会。ISO11898-2:2016规定了tSilence(静默计时器)的期限,例如典型值约为1秒左右(不同器件实现可能稍有差异),即当总线在唤醒过程后静默超过此阈值,收发器就自动回到离线待命状态。这样可以避免由于一两帧误触发而让收发器长时间保持偏置增加待机功耗——若唤醒未能实质成立,它会再次降低自身能耗直到下次总线活动。
部分网络通信与混合网络场景
通过WUP+WUF,两步筛选机制实现了选择性唤醒。理想情况下,如果一个CAN网络上所有ECU都支持PN功能,那么某个ECU在睡眠中只会对特定唤醒帧敏感,而忽略无关通信。这意味着当总线上开始通信时,只有那些收到“点名”的ECU会真正醒来,其余ECU即使检测到总线有数据流动(WUP)也会继续休眠,达到**“网内分组唤醒”**的目的。这对降低整车静态电流非常有利——例如遥控解锁时,只唤醒车身ECU和门锁ECU,动力、ADAS等其余ECU保持睡眠,从而节能。
然而,在混合网络场景下(即总线上同时存在支持PN的节点和不支持PN的老式节点),情况要复杂一些:那些不支持PN的普通收发器,只要总线上出现WUP(任何通信),就会立即唤醒进入待机模式。换言之,它们无法“筛选”通信——哪怕那帧消息并不是给它的,它也已经被唤醒了。因此,在混合网络中,如果有一个不支持PN的ECU,那么任何CAN通信都会把它唤醒,部分网络的好处在它身上体现不出来。这种情况下,为了避免某些节点无端被叫醒浪费电,有两种工程应对思路:
升级/更换老ECU的收发器:尽可能让同一网络上的ECU全部具备PN能力,从根本上解决问题。如果所有节点都支持选择性唤醒,那么整个网络就可按设计仅唤醒必要的ECU,其余节点继续休眠,从而达到最佳节能效果。
使用“伪部分网络”隔离老节点:如果无法更换某些老ECU的硬件,可考虑通过电路或软件手段,让它们在不需要时与总线隔离或完全断电。例如,可以使用高边开关断开老ECU的电源供给,使其完全掉线;或者利用网关将老节点所在分支与主网络隔离,只有在需要时由网关转发唤醒消息并上电该分支。这种方法相当于物理上实现部分网络。但要注意同步控制和时序,避免通信丢失。
Pretended Networking软件过滤:后文将详述的一种MCU内部过滤机制。如果老ECU的CAN控制器支持Pretended Networking(伪网络唤醒),也可以在MCU端对唤醒消息进行筛选,从而在一定程度上模拟PN效果。例如NXP S32K系列只有CAN0控制器具备PN模式,在不满足硬件PN条件时,可以将CAN Rx脚配置为GPIO中断引脚,通过外部中断侦听总线电平变化,一旦有总线活动则由软件判断是否满足唤醒条件。这种方式本质上是用软件+GPIO替代收发器的硬件滤波器,实现“基本的远程唤醒”。
需要指出,方法2和3可以视作**“Pseudo-PN”(伪部分网络)方案,其效果和可靠性相对真正的硬件PN稍有不及,但在工程上提供了向后兼容的途径。实际项目中经常会遇到分时分域供电的设计:一些ECU(称为KL15节点)随点火电源On/Off直接通断电,不参与休眠管理;另一些ECU(KL30常电节点)则始终有电,需要借助网络管理来休眠唤醒。部分网络技术主要针对KL30常电节点,这些ECU通过PN减少相互之间的不必要唤醒,达到降低暗电流的目的。而KL15节点本身在熄火后就完全断电关机,不存在休眠问题。因此,整车网络设计时通常将关键常电ECU**(如网关、车身控制、无钥匙进入模块等)选用支持PN的收发器和控制器,以充分利用该技术带来的节能优势。
CAN收发器的低功耗模式与唤醒原理
从硬件角度看,实现CAN总线休眠/唤醒的关键部件是CAN收发器。收发器作为CAN控制器与物理总线之间的接口,在不同工作状态下需要调整自身电路以平衡功能与功耗。下面我们介绍CAN收发器常见的几种模式及其唤醒原理:
Normal模式(正常模式):收发器全功能启用,驱动器和接收器均处于工作状态。ECU在Normal模式下可以发送和接收CAN报文,是功耗最高的状态,通常发生在车辆正常行驶、网络通信活跃期间。
Standby模式(待机模式):收发器发射器关闭、不再驱动总线,但低功耗接收器保持活动,能检测总线上的唤醒信号。Standby一般是从Sleep唤醒后的临时状态,此时收发器等待MCU配置其进入Normal模式。在Standby下,收发器通常仍维持总线隐性偏置(约2.5V),但不会把总线数据传给RXD引脚(因为MCU也许尚未准备好处理数据)。Standby模式功耗比Normal低一个量级(典型10~100 mA量级),常用于唤醒过渡阶段或者总线只监听不发消息的场景。
Sleep模式(休眠模式):收发器关闭绝大部分电路,仅保留用于唤醒检测的电路,功耗降至最低(通常几十微安量级甚至更低)。在Sleep模式下,收发器有两种子状态:Offline和Offline with Bias。如前所述,Offline子状态下CAN_H和CAN_L被下拉到GND(共模0V),Offline Bias子状态下则提供典型2.5V偏置。当ECU进入Sleep模式时,收发器起初处于Offline(总线无偏置)监测WUP。一旦检测到WUP序列,总线出现活动,它自动切换到Offline Bias状态,给总线加上2.5V偏置以便正确接收帧内容。如果随后的通信没有匹配的WUF且总线重新沉寂超过tSilence,收发器又返回Offline状态关掉偏置,以最大程度节省静态电流。Sleep模式下收发器不会驱动总线、也不向MCU传递报文,但一直“偷听”总线以寻找唤醒信号。
Off模式(关闭模式):某些收发器(如TJA1145)提供Off模式,用于完全关闭收发器功能(例如车辆长期存储或特殊故障情况下)。Off模式下收发器基本不工作,也不监测总线,因此一般不用于正常休眠(因为ECU将无法通过CAN远程唤醒)。Off更像是一种“硬关闭”,需要本地WAKE脚或上电复位才能重新启动收发器。比如TJA1145的Off模式通常由SPI命令或低电压等触发,使收发器进入超低功耗且不响应CAN总线远程唤醒的状态。
Local Wake-Up(本地唤醒):除了远程的CAN总线唤醒,收发器往往还有一个本地唤醒输入(WAKE引脚)。本地唤醒用于连接ECU上的本地信号源(例如门锁开关、碰撞传感器等),当本地事件发生时,该引脚电平变化可直接触发收发器唤醒ECU。本地唤醒通常在Sleep模式下有效,作用类似于远程WUP:如果WAKE脚检测到跳变(或特定脉冲),收发器同样从Sleep切换到Standby,进而拉高INH脚等方式唤醒MCU。汽车系统中经常将关键本地信号(例如点火开关KL15、电容采样钥匙信号等)接入收发器WAKE,以便在无总线通信时也能激活ECU。
收发器如何通知MCU唤醒事件? 有两种典型情况:
MCU断电休眠的场景:如前所述,有些ECU在Sleep时MCU整个下电,只保留收发器在待命。这时收发器唤醒后通过硬件通路使MCU重新上电:一般收发器的INH(Inhibit)引脚连接到PMIC电源管理芯片,控制后者输出MCU的供电。当收发器检测到有效WUF,进入Standby模式时INH脚会由低变高,相当于按下一个“电子开关”让PMIC输出5V/3.3V电压,MCU电源恢复。此时MCU重新复位启动,像点火启动一样开始运行初始化流程。收发器保持Standby直到MCU的软件将其配置到Normal模式通信。这一硬件链路确保了在MCU完全掉电的深度睡眠下,也能自动唤醒上电。典型的例子是车身控制器BCM等KL30节点:熄火后MCU掉电休眠,仅收发器+PMIC仍挂在电瓶。有人拉门把手触发Comfort系统发送CAN报文->收发器识别唤醒->拉高INH-> PMIC给MCU上电-> MCU启动并运行解锁逻辑。
MCU待机低功耗(不断电)的场景:有些ECU的MCU在休眠时并未完全断电,而是进入Stop模式(时钟停止,大部分外设关闭,但保留RAM,等待中断唤醒)。这种情况下,收发器唤醒时不需要上电流程,而是通过发出中断信号通知MCU。常见做法是利用收发器的RXD脚:在Sleep/Standby模式下,大多数收发器会保持RXD引脚为高电平;当侦测到唤醒事件时(例如WUP之后的WUF确认),它会拉低RXD脚产生一个**“假接收”信号,从而触发挂在RXD引脚上的MCU外部中断,叫醒MCU。一些收发器还提供专门的INT唤醒中断引脚,可直接连到MCU。这类唤醒路径在NXP S32K等微控制器中应用较多:S32K14x系列支持Pretended Networking模式时,建议将CAN收发器的RXD配置成GPIO外部中断**,当休眠期间总线有活动使RXD产生跳变,则Stop模式的MCU可收到中断唤醒。总之,在MCU不断电的前提下,收发器通常通过电平变化触发MCU中断来完成唤醒。
不论采用上述哪种方式,唤醒后MCU都可以通过SPI或寄存器读取收发器状态,以确认唤醒来源。例如TJA1145收发器有状态寄存器标志CW(CAN Wake)和LW(Local Wake)来指示此次唤醒是远程CAN还是本地WAKE引脚引起。工程调试时常利用这些标志来判定究竟是什么触发了ECU唤醒,以便进一步优化或排查误唤醒原因。
收发器低功耗模式设计要点:硬件设计中,要确保收发器与MCU、PMIC等电路正确衔接:
电源供电分配:如图所示,ECU一般有主电源PMIC,提供给MCU的数字电源(3.3V/5V)和给CAN收发器/传感器的通信电源(5V)。PMIC通常有使能EN脚(由点火信号KL15或MCU控制)和Wake输入(供收发器INH控制)。设计时需要明确哪个电源域常通(通常通信5V可能常通以维持收发器待机),哪个由点火或INH控制。部分网络ECU的收发器Vbat必须接常电,否则MCU断电后收发器也断电,将无法接收总线唤醒信号。
INH与WAKE引脚:INH输出一般连接PMIC或稳压模块的使能管脚,实现“远程开机”。WAKE输入若不使用,应拉接适当电平以防噪声触发(通常下拉到地禁用本地唤醒)。若使用WAKE功能,要对该引脚加去抖滤波等,避免抖动误触发。
总线偏置:深度休眠时总线两线0V共模,需注意总线终端电阻可能将CAN_H/CAN_L下拉到中点2.5V(取决于收发器实现)。像TJA1145这样的收发器在Offline模式时通过内部电路把总线钳位地电位以防漂浮。这对设计者来说通常不需要额外处理,但调试时要了解总线电压变化正常与否。例如唤醒时Bus从0V跃升到2.5V共模,是收发器正常行为,不是故障。
响应时间:CAN唤醒全链路的延迟包括:总线WUP/WUF序列时间(取决于报文长度和滤波,同步锁相需要几个帧时间),收发器切换模式和INH有效的时间(一般在几个微秒到毫秒级),PMIC上电延迟(几十毫秒内稳定输出),MCU复位和初始化时间(视MCU主频,一般几十到上百毫秒)。总计从总线发出唤醒帧到ECU真正开始运行应用,可能在100ms量级。因此设计上唤醒帧需在功能需要之前提前发送留出余量。例如无钥匙进入时,从用户按下解锁到门解锁,会有≥100ms的额外延时用于唤醒ECU。这通常可以接受且在系统设计时会考虑进来。
综上,CAN收发器提供了休眠和选择性唤醒的硬件基础,通过精心设计模式状态和引脚交互,实现了ECU的“睡”“醒”受控。同时,现代收发器还有许多增强功能(如FD Passive模式:在睡眠监听时自动忽略CAN FD帧避免误唤醒、看门狗、掉电检测等)来保证在复杂网络中的可靠工作。下一节我们将讨论MCU端的配合机制——Pretended Networking——它是一种软件层面的唤醒过滤,与收发器协同实现CAN低功耗管理。
CAN控制器的低功耗模式与Pretended Networking
除了收发器层面的部分网络方案,汽车MCU本身也在CAN模块中引入了“伪装网络(Pretended Networking,缩写PN同样常用)”模式。这是一种基于CAN控制器的选择性唤醒机制:当MCU进入低功耗STOP模式时,让CAN模块继续以极低功耗运行,监视总线报文,如果检测到符合特定ID/数据条件的报文则触发MCU唤醒中断。Pretended Networking可理解为在MCU端用软件/硬件结合实现类似收发器Selective Wake的功能。它通常配合普通的非PN收发器(或者即使收发器支持PN,也可双保险),用于进一步减少硬件依赖或增强灵活性。
以NXP系列芯片为例,S32K1xx和MPC5xxx等MCU的FlexCAN模块均支持Pretended Networking模式,只是每颗芯片通常只有特定的CAN通道具备此能力(例如S32K144只有CAN0支持PN唤醒)。要利用PN模式,软件需要在进入MCU低功耗前对CAN控制器进行配置:
使能PN模式:设置CAN模块的PN使能位。例如MPC5748G的FlexCAN模块在CAN_MCR(模块配置寄存器)中有PNET_EN位,进入STOP休眠前需将其置1。这样CAN模块就知道在MCU停止时要保持部分激活状态监听总线。
配置唤醒滤波条件:MCU中CAN模块提供了Pretended Networking专用的过滤寄存器,如CTRL1_PN、CTRL2_PN等。其中可配置匹配ID、ID掩码、DLC和数据模式,这和收发器的WUF过滤条件类似。工程师可以为CAN控制器设置一个“伪唤醒报文”——例如ID=0x200,要求首字节=0x5A——当CAN模块在停止模式监听到这个条件的帧时,就会认定为唤醒事件。这实际和硬件收发器筛选WUF异曲同工,只不过由MCU内部逻辑完成。
进入停止模式并保持同步:当MCU准备进入低功耗STOP模式时,FlexCAN模块需要先进入准备状态:它会等待当前总线变空闲(帧间隔结束后第三位确定为空闲)再置位自身休眠确认标志LPM_ACK。然后MCU关断主时钟,只保留CAN模块的协议引擎时钟运行。在STOP模式下,FlexCAN的协议引擎持续与总线同步时钟(利用自身的低功耗振荡器)以监听通信。这类似收发器在睡眠时用内部振荡器追踪总线位流,以便正确采样报文内容。期间CAN模块不主动接收存储帧,仅根据配置滤波判定是否出现唤醒匹配。
唤醒中断:一旦CAN模块检测到符合PN滤波条件的消息,就会触发模块唤醒中断,通知MCU退出STOP模式。MCU响应该中断苏醒后,可以读取CAN模块的标志确认是PN唤醒事件,然后恢复正常运行流程。此时FlexCAN也会在总线空闲适当时机退出低功耗模式,重新激活全部功能。
Pretended Networking的优势在于:即便收发器不具备Selective Wake功能,MCU也能实现按特定消息唤醒自身。举个例子,某车有一条CAN总线,其上旧ECU收发器不会筛选消息。如果不加控制,那么任一CAN帧都会唤醒所有ECU。然而通过在主MCU上启用PN模式设定仅接受ID=X的帧做唤醒条件,那么当其他无关帧出现时,MCU的CAN模块虽然看到了通信但不会发出唤醒中断,MCU就继续休眠;只有遇到ID匹配的帧才会真正唤醒MCU处理。这样在一定程度上实现了选择性唤醒。
需要注意Pretended Networking的功耗权衡:MCU在STOP模式下让CAN模块工作,比完全断电的状态功耗略高。毕竟CAN模块要保持时钟同步并解析一定数量的位流(标准允许为同步目的最多忽略4帧@500kbps或8帧@1Mbps的数据)。不过总体而言,FlexCAN的PN模式电流相比MCU全速运行微乎其微。例如实测MPC5748G在PN模式STOP下,CAN模块工作电流只有几十微安量级。另外,PN模式通常只支持特定的低功耗模式(如STOP2)而不支持更深的关断模式。例如S32K系列要求在STOP2模式才能确保CAN唤醒正常。因此配置时要参考数据手册选择合适的MCU低功耗模式。
Pretended Networking与收发器PN可以搭配使用:比如使用PN收发器(硬件筛选第一层)加上MCU PN(软件筛选第二层)。这在某些方案里提高了可靠性:收发器筛掉99%的无关流量,万一有极特殊情况漏掉,MCU还有机会二次判别。当然,大部分情况下二者择其一即可满足需求。汽车主流还是倾向硬件PN(收发器)方案,因为MCU可以彻底掉电休眠,由收发器承担微安级监听,更节能。而MCU PN更多用于那些不方便更换收发器或架构上需要用软件控制唤醒策略的场景。无论怎样,掌握MCU PN的配置对开发者排查问题很有帮助:我们可以通过调试寄存器验证MCU是否检测到过唤醒事件,判定问题出在收发器还是MCU配置上。
综上,CAN控制器的Pretended Networking为休眠唤醒提供了另一种思路。它将部分网络的概念延伸到软件层面,使老旧硬件也有机会实现类似功能。结合收发器的选择性唤醒,整车网络的休眠唤醒可以在软硬件两方面共同把关,确保既省电又可靠。
AUTOSAR架构下休眠/唤醒的模块交互
在车辆开发中,AUTOSAR经典平台广泛用于管理通信和网络状态。下面我们结合AUTOSAR基础软件(BSW)模块,分析CAN总线休眠/唤醒的软件管理流程。涉及的关键模块及作用如下:
CanSM(CAN State Manager):CAN状态管理模块,负责控制CAN网络通道的通讯状态转变(如Bus-Off恢复、准备休眠、唤醒通知等)。CanSM根据上层要求(来自通信管理ComM或ECU管理EcuM)执行相应动作,驱动下层模块改变状态。
CanNm(CAN Network Management):网络管理模块,实现CAN总线的网络管理协议(NM协议)。它在网络各节点间发送周期性NM报文,监控网络活动并协调节点同步进入休眠或唤醒,以达到“同睡同醒”的策略。CanNm采用分布式网络管理:每个节点都广播自己的网络状态并监听他人状态,以决定何时全网进入休眠。当某节点要休眠时,会发送NM请求通知其他节点,其它节点收到后响应,大家一同进入Bus-Sleep模式;相应地,某节点要唤醒也会发送唤醒通知,整个网络恢复通信。
CanIf(CAN Interface):CAN接口模块,位于CAN上层(如CanSM、Com层)与下层驱动之间。CanIf为上层提供统一的API来使用CAN通信、设置控制器模式、切换收发器模式等,并将下层驱动的通知(如接收报文、状态变化)转发给上层。CanIf负责根据配置将各功能调用路由到正确的CAN Controller或Transceiver驱动(特别是在多路CAN的情况下)。
CanDrv(CAN Driver):CAN硬件驱动,直接控制CAN控制器(如FlexCAN)的寄存器。它实现发送/接收消息的底层操作,以及控制CAN控制器进出睡眠模式、监听唤醒事件等。在AUTOSAR中通常分为Can基础驱动和复杂设备驱动CDD部分,此处泛指与硬件打交道的层面。
CanTrcv(CAN Transceiver Driver):CAN收发器驱动,用于控制独立CAN收发器芯片。如果收发器具有可控模式(Normal/Standby/Sleep)或需要通过SPI配置,则CanTrcv提供API供上层设置。例如CanTrcv_SetOpMode()可设置收发器模式为Standby或Sleep等;CanTrcv_CheckWakeFlag()可读取收发器唤醒标志状态。CanTrcv通常通过MCU的SPI接口对收发器进行读写配置。
此外,还有**EcuM(ECU Manager)和ComM(Communication Manager)**两个管理模块紧密相关。简单来说,ComM决定每条总线的通信需求(Full Com或No Com),而EcuM负责整体ECU电源状态管理。为了聚焦主题,我们主要关注上述CAN栈相关模块。
下面以典型的休眠流程为主线,说明各模块间的交互:
进入休眠流程
通信空闲检测:当应用层或车辆状态判断可以休眠时(例如熄火后若干时间、无重要通信需求),ComM将要求相关网络通道进入通信停止模式(No Communication)。这通常通过ComM通知CanSM实现。另一方面,CanNm也在监视网络上的NM报文,如果一段时间(T_NM_TIMEOUT)未收到其他节点的NM消息,说明大家都准备休眠了。CanNm会通知上层进入Ready Sleep状态。在分布式NM里,每个节点都会在自身计时器超时后认为全网可休眠。
禁止新的报文发送:一旦进入准备休眠阶段(Prepare Bus-Sleep),各节点应该停止发送除NM以外的一般应用报文。已发出的消息允许收尾,但新的消息不再发送。同时节点依然监听总线,以防其他ECU发来NM唤醒请求。如有节点反悔(比如用户又开门触发某ECU发送NM唤醒),则全网都会收到NM消息而重新回到通信模式,不再进入睡眠。
同步进入Bus-Sleep:当所有节点都各自等待超时,确认网络安静后,CanNm报告CanSM说“全网准备就绪”。此时CanSM触发实际的休眠操作:它会调用CanIf函数将CAN控制器设置为睡眠模式,并将收发器设置为低功耗模式。例如,CanSM会执行
CanIf_SetControllerMode(CAN_CTRL, CAN_T_STOP)(或CAN_CS_SLEEP,根据实现)来停止CAN通信,然后调用CanIf_SetTrcvMode(CAN_TRCV, CANTRCV_TRCVMODE_SLEEP)让收发器进入Sleep。在底层,CanDrv接收到睡眠请求后,会通过操作寄存器使CAN控制器进入休眠/停止模式(如设置FlexCAN MCR的睡眠位,或者在Pretended Networking场景下设置PNEN并等待确认)。CanTrcv驱动则通过GPIO或SPI对收发器发出切换模式的命令。例如对TJA1145,需要通过SPI写寄存器将模式MC字段设为Sleep。一旦收发器收到该指令,它会执行模式转换:关闭总线驱动、进入低功耗监听,并在Sleep确认后拉低INH引脚关闭MCU电源输出。ECU进入睡眠:随着收发器进入Sleep,MCU可能会被断电(KL30节点)或者进入MCU自身的STOP低功耗状态(Pretended Networking模式下)等待中断。当所有操作完成后,CanSM通常会调用EcuM通知进入休眠状态。ECU的供电和时钟根据配置降到最低,此时全车CAN总线处于Bus-Sleep模式,总线上无节点主动发送消息,只有收发器在默默监听唤醒。
整个过程中,AUTOSAR模块确保各步骤循序渐进且安全:先由应用层请求 -> NM协商一致 -> 再停发送、停接收 -> 最后硬件进入睡眠。这样避免突然有节点还在发消息时另一节点已经睡死,导致通信不一致的问题。
唤醒流程
当CAN总线需要从休眠中唤醒时,通常由以下几种事件触发:
用户操作引发:例如解锁车门、遥控启动,这些操作可能直接驱动某ECU本地唤醒(如门控ECU的WAKE引脚)或者由网关发送一个特定的CAN唤醒帧到网络上。
定时唤醒:有些系统设计定时周期性唤醒网络做状态检测(如每隔几小时醒来汇报电池状态给远程服务器)。
外部请求:例如诊断设备连接后发送唤醒帧,或另一总线(如以太网网关收到远程命令)要求唤醒某CAN网络。
无论来源如何,唤醒通过CAN总线一定体现为有通信活动。针对休眠中的某条CAN网络,总线上的第一个显性边沿就是各收发器的WUP。当WUP发生时:
非PN节点(不支持选择性唤醒的ECU)将立刻由收发器唤醒MCU。这类ECU的CanTrcv会检测到总线显性电平跳变,随即把RXD拉低触发MCU中断,或直接解除Standby模式供电MCU。这些ECU会立即进入Standby,等待后续正常通信。
PN节点则执行前述的选择性监听流程:它们不会马上通知MCU,而是在内部等待验证唤醒帧WUF。此时其MCU仍沉睡。只有当收发器确认收到匹配的WUF后,才会真正唤醒MCU。
假设现在有一帧唤醒报文发送出来。这个报文在总线上传播,所有ECU都会收到:
支持PN的ECU中,只有那些配置的唤醒ID/数据匹配这帧的节点,才由收发器发出唤醒信号给MCU。其他PN节点看到ID不符,则继续保持睡眠,任凭这帧通过而不理会。
不支持PN的ECU已经在WUP时醒来了,现在它们看到有帧,就当作正常CAN帧处理。如果此帧恰好是NM唤醒帧(某些网络可能定义专门的NM Wakeup报文),那么ComM/CanNm会在这些节点上识别出“哦,要唤醒网络”。但如果此帧与它们无关,也仅仅是闲置等待。
无论PN与否,至少发送唤醒帧的ECU本身肯定是清醒的(可能是一直未休眠的主控,或者它本就发起了唤醒)。当它发送完唤醒帧后,通常会继续发送网络管理唤醒消息。在AUTOSAR NM策略下,节点唤醒时会发送一个NM广播,通知网络其他节点它处于Awake状态。其他节点(尤其非PN的)收到NM唤醒消息,就知道应该退出睡眠。此时即使它们之前没被硬件唤醒,也会由于报文到来触发接收中断,从而唤醒MCU处理NM协议。
从AUTOSAR软件角度看,唤醒过程如下:
收发器检测到唤醒源:PN收发器在硬件上切换到Standby,并通过CanTrcv驱动通知上层“发生远程唤醒”(CanTrcv_CheckWakeFlag返回TRUE)。非PN收发器其实已经把MCU硬件唤醒了。
MCU恢复运行:如果MCU完全下电,需要经过上电复位流程进入EcuM。EcuM会检测复位原因或收发器唤醒标志,将唤醒源(比如CAN Bus 1)记下,然后走ECU上电流程。若MCU是Stop模式被中断唤醒,则立即继续执行,从中断服务程序或EcuM回调中得知唤醒源。同样,EcuM会通知ComM/CanSM对应网络通道收到Wakeup。
CanSM处理唤醒通知:CanSM收到来自EcuM或下层的唤醒指示后,触发网络恢复过程。它调用
CanIf_SetControllerMode(CAN_CTRL, CAN_T_START)将CAN控制器重置为正常通讯模式,调用CanIf_SetTrcvMode(CAN_TRCV, CANTRCV_TRCVMODE_NORMAL)切换收发器至Normal模式。如果唤醒时CAN控制器曾在PN模式,需要清除PN配置(如清PNET_EN位)使其恢复全功能。恢复通信:CanSM接着通知CanNm模块网络已唤醒,CanNm会重新启动NM报文的周期发送。各节点因为NM协议再次活跃,“网络模式(Network Mode)”重新建立。此后,应用层的通信(CANTP、COM消息等)也恢复收发。
需要留意的是,在部分网络场景下,可能出现局部唤醒。例如总线上ECU A和B支持PN,ECU C不支持。A发送了一个只给B的唤醒帧。结果:B的收发器识别WUF把B唤醒;C因为非PN,在WUP就醒了,但没等到NM消息(因为A打算只唤醒B,它自己可能也支持PN没有广播NM)。这样C被无端唤醒一次又发现没后续通信,可怎么办?实际上AUTOSAR NM在这种情况下会有约定:如果节点发现自己醒来但网络未进入正常通信,很快又会进入准备睡眠,或者等待一段超时后再次休眠。对于局部唤醒的应用场景,一般会避开使用AUTOSAR标准NM协议,而是采用点对点的自定义唤醒(比如A给B发特定帧叫醒,B醒来后与A通讯,其他节点无感)。这种“选择性网络唤醒”目前在整车上应用还不算普遍,大多数仍是成组ECU一起唤醒。但随着节能需求提高,或许未来会更灵活运用局部唤醒技术。
AUTOSAR对PN的支持
AUTOSAR配置中可以针对部分网络进行参数设置。例如在ComM配置里,有标志位启用Partial Networking支持;CanSM和CanIf配置表里,可定义每个收发器通道的Wakeup源类型。如果使用PN收发器,就要配置CanTrcv模块并在CanIf中将该通道关联上Transceiver驱动。CanTrcv的配置包括SPI通信参数、唤醒帧ID和掩码等,这些通常由离线的工具填入,然后驱动模块会在初始化时通过SPI把唤醒过滤寄存器写入收发器。从AUTOSAR 4.2开始对ISO11898-6部分网络有更直接的支持,许多MCU厂商的MCAL驱动也实现了Pretended Networking模式的API,供EcuM管理Wakeup。
总的来说,AUTOSAR BSW模块为CAN休眠和唤醒提供了层次分明的控制:上层决策、NM协同、中层调度、底层执行。硬件PN、MCU PN等具体技术在软件流程中被抽象为标准接口,开发者只需按照规范配置和调用即可完成整车网络管理。这极大地方便了复杂车辆网络的开发与维护,使休眠唤醒行为可预测、可管理。
基于NXP S32G平台的实践要点
NXP S32G系列是面向车载网关/域控制的高性能汽车网络处理器。S32G集成了多个Arm核和丰富的车用通信接口,是现代汽车中枢神经般的存在。下面我们结合S32G平台特点,谈谈CAN总线休眠唤醒在其上的应用。
1. 硬件架构:S32G拥有多个FlexCAN控制器(支持CAN FD)以及高速串行外设接口用于连接外部收发器。由于S32G自身为SoC,不内置模拟收发器部分,所以每个CAN通道仍需搭配独立的CAN收发器芯片。NXP提供了与S32G配套的TJA系列收发器(如TJA1145A、TJA1445等)供选择。其中TJA1145A是一款经典的Partial Networking收发器,支持Selective Wake和低功耗,是S32G评估板常用的器件之一。实践中,每个CAN通道通过SPI连接一颗TJA1145收发器,由S32G的一个SPI控制器负责配置多个TJA1145。S32G的供电通常由NXP PF/VR系列PMIC(如VR5510)管理,该PMIC能够接受收发器INH信号实现电源控制。因此,S32G平台硬件完全支持收发器控制MCU上电/断电的休眠方案。
2. 低功耗模式:作为网关,S32G需要在整车下电时进入低功耗待机,但又要能被网络消息唤醒以提供远程访问等功能。典型设计是将S32G配置为常电工作(KL30),利用部分网络唤醒控制其各接口。S32G芯片支持多种低功耗模式,包括核心停工、外设待机等。在S32G的Arm M7核上运行的Real-Time OS(可以是AUTOSAR OS)通常负责处理CAN通信及唤醒事件,而高性能A53核跑的应用处理器(Linux等)在休眠时可能彻底停时钟,需要由M7核或外部唤醒。幸运的是,S32G片上有独立的低延迟通信引擎(LLCE),它是一组专用硬件核,能够在低功耗下处理CAN/LIN收发队列。这意味着即使主核休眠,LLCE也能收集一定数量CAN帧。结合部分网络,S32G可以实现分级唤醒:LLCE侦听总线并缓冲唤醒帧 -> 确认需要主核参与时触发SoC唤醒 -> 主核苏醒处理。NXP在S32G的软件中提供了LLCE驱动示例,如在Standby RAM中驻留一小段LLCE固件用于快速CAN唤醒后发送关键帧。
3. 软件配置(AUTOSAR MCAL):在S32G的AUTOSAR MCAL里,FlexCAN驱动支持Pretended Networking模式(因为S32G延续了NXP CAN模块家族设计)。我们可以通过配置Tool启用某些通道的PN过滤参数。譬如,将CAN0的PN过滤ID设置为0x123,数据0xAA... 等。同时,S32G的SPI驱动与CanTrcv模块一起,用于在初始化时将TJA1145的寄存器写入匹配值。需要注意S32G通常有不止一个CAN网络,有的网络可能要求Partial Networking,有的则不需要。如果某条总线上所有ECU都常电,强烈建议开启PN功能;但若某条总线大部分ECU都是点火供电(KL15),则PN意义不大,可以关闭以简化流程。AUTOSAR配置允许针对每条总线分别设置。CanSM的参数里可定义是否使用PN:当启用时,CanSM在请求Sleep时会额外调用CanTrcv设置唤醒过滤,并在Wakeup时检查唤醒源。
4. 网关协调:作为中央网关,S32G往往连接着多条总线(CAN、LIN、以太网等)。在休眠场景下,网关需要协调不同网络的状态:例如整车下电时,同时令所有CAN网络进入休眠;又如某个以太网请求来了,需要唤醒特定的CAN网络获取数据。S32G上的网络管理逻辑(Network Management)会综合各侧请求。AUTOSAR提供了跨总线网络管理的方案,比如如果以太网ECU要唤醒CAN节点,可以通过网关触发CAN NM唤醒帧发送。S32G可以配置为NM协调节点,监听各网络的NM状态并执行转换。有时,S32G自身不允许完全休眠(因为需要维持与远程的通信,例如OTA唤醒接收),但挂在它下面的某些CAN分支可以休眠。这种情况下,S32G网关会通过控制TJA1145来关闭那些分支,必要时发送WUF重新开启。举例来说:夜深时车辆大部分ECU休眠,但远程诊断通过以太网连上S32G。这时S32G接到诊断命令要求某底盘ECU数据。S32G发现底盘CAN现在是休眠的,它就向那个CAN发送唤醒帧(自己保持清醒状态),使底盘ECU唤醒收集数据。完成后,再让底盘CAN休眠。
5. 寄存器级操作:对于偏底层开发者,可能关心S32G相应寄存器细节。例如FlexCAN的PN相关寄存器,包括CTRL1_PN(控制1)和FLT_ID1/2, FLT_DLC, PL1/2(过滤ID和数据寄存器)等,需要设置匹配模式。其配置内容和我们前述收发器类似:填入ID、掩码、期待的DLC和数据字节。还要注意使能自唤醒禁止(FlexCAN的MCR寄存器有SLFWAK位,应关闭它以让PN掌控唤醒)。另外,TJA1145收发器有一套SPI寄存器,比如模式控制寄存器(MC)、唤醒过滤寄存器等。NXP提供的Application Hints文档(AH1203)中附有寄存器配置表,可以参考以正确设置唤醒帧ID和掩码。在实际使用中,我们通常在CanTrcv_Init阶段通过SPI批量写入这些寄存器。一旦配置完毕,之后就很少需要改动,只在Sleep/Standby切换时通过SPI控制模式(MC=Standby/Sleep等)。需要确保S32G的SPI通信在MCU低功耗时也是可用的——例如MCU Stop模式下一般外设挂起,因此Sleep命令需在进入Stop前发出。同样,在MCU醒来重新初始化SPI前,收发器往往已经在Standby等待,这时MCU应先与收发器同步实际状态,避免误操作。
6. 整车架构适配:最后,从整车网络架构角度看,使用S32G的网关往往承担全车网络管理职责。S32G需要与各功能域ECU的网络管理协同一致。因此在整车配置中,会设计哪些网络采用Partial Networking。通常涉及车身舒适和远程信息处理的网络会启用PN,因为这些域在车辆锁闭时仍可能需要偶尔唤醒(比如无钥匙进入、远程解锁)。而动力底盘等网络可能和点火状态严格绑定,点火OFF即断电,不需要PN。S32G作为网关,需要识别这些差异。例如它可能有2个CAN:一个车身CAN(常电,PN启用),一个动力CAN(随点火断电,PN不适用)。那么S32G的软件就会对车身CAN使用CanSM/CanNm来睡眠唤醒,对动力CAN则简单通过EcuM关断供电。硬件上,S32G对动力CAN可能选用简单的收发器(如TJA1043)通过点火信号控制;对车身CAN则用TJA1145通过INH控制。这样在系统层面实现了不同网络的最优化休眠方案。
总而言之,S32G平台集强大的通信和控制于一身,使其能够灵活运用CAN的休眠唤醒机制。在S32G上实现PN,需要统筹考虑硬件(收发器与电源连接)、软件(AUTOSAR BSW配置)和系统(各网络策略)。一旦设计合理,S32G将大幅降低整车静态功耗,并保障需要时可靠地唤醒各个角落的ECU。
CAN总线唤醒波形与时序分析
理解CAN总线唤醒过程,还需要从信号波形和时间角度剖析。当CAN网络从休眠转入通信时,会经历总线电平变化和特定的时序约束。这里我们结合波形图和标准时序参数进行说明。
1. 总线电平变化:假设总线静止一段时间后,所有收发器都进入Sleep状态。此时总线共模电平可能被拉至0V(如收发器Offline模式)或保留在约2.5V(部分收发器OfflineBias模式未退出)。为了简化,假定总线处于0V偏置。在t=0时刻,某节点开始发送唤醒帧。SOF起始位由显性位“dominant”表示,CAN_H电压上升、CAN_L电压下降,差分电压出现。这一显性电平持续一个位时间(以500kbps为例,2µs)。紧接着可能是仲裁场的隐性位,使总线回到隐性电平(差分0)。然后又是显性位(仲裁场RTR等)。这样总线电压形成了“高-低-高”三段——正是WUP序列。收发器的滤波器会对此作出反应:如果每一段高/低持续超过tFilter(比如取3µs),则标记为有效WUP。
整个WUP通常发生在一个CAN帧开始的几个位内。例如典型125kbps帧,SOF显性持续8µs,满足tFilter>5µs要求,第一个隐性位也有8µs,第二个显性位再8µs——非常容易识别。500kbps帧稍紧凑,但如前述在控制场几个位也可达到>5µs显性。如果某帧内部无法提供两个充分长的显性(比如1Mbps高速且帧格式导致没有连续显性段超过滤波时间),标准规定第二个显性条件可以由下一帧提供。也就是说,如果第一个CAN帧只产生了一个显性段超阈值,那么收发器会进入WUP状态1,等待下一个显性段;随后总线上的第二个帧的开头显性可以作为补充,结合前一帧末尾的EOF空闲(隐性)一起满足WUP跨帧触发。因此,只要有两帧连续发送,哪怕每帧内部单个显性不够长,两帧叠加也能构成WUP。这确保了只要总线上开始正常通信,收发器最终都会检测到WUP,无论帧格式如何。
2. 收发器同步锁定:PN收发器在检测到WUP后,需要对总线比特流进行同步才能正确读取WUF内容。由于收发器内部振荡器有一定误差(±3%容差),它需要通过观测总线连续多个位,调整内部时钟以对齐总线速度。这类似于CAN控制器的同步过程,不过收发器只能“偷看”不能像控制器发送消极应答等。ISO11898-2:2016规定,收发器可以使用后续若干帧来完成这个锁相过程:例如500kbps下最多允许4个CAN帧的时间来锁定位时序,1Mbps下允许8个帧时间。在这个锁定期间,即使帧解码有错误也不要紧,收发器会忽略这些错误,不会因为校验失败就放弃(标准禁止将这些当作错误计数)。一旦收发器调整好时钟,它就能稳定地取样后续帧的ID和数据。
3. 唤醒帧识别:在收发器成功同步后,下一步就是从位流中提取ID和数据,比对配置的唤醒条件。这通常发生在WUP之后的第1~2个帧内。设想理想情况:第一个帧就是目标WUF——收发器锁定过程中可能错过了头几个位,但ISO标准允许忽略第一个帧的解码错误,因此收发器有机会在接收完这个帧时刚好锁定,然后仍然读到了ID和部分数据。如果运气好,这帧校验和CRC也通过,那么收发器即可确认WUF匹配,立即触发唤醒。在大多数情况下,唤醒帧会被重复发送多次以增加可靠度(因为如果首次帧收发器没锁稳,后续重发可确保被识别)。汽车网络通常会将唤醒消息发送例如3次,每次间隔一定周期,以防丢帧。
4. tSilence计时:当唤醒通信完成后,如果总线重新安静下来,收发器会启动静默计时器tSilence。该计时用于决定是否重新进入深度睡眠。举例来说,如果唤醒帧发出后发现其实不需要更多通信,网络又闲置,那么PN收发器不应一直保持偏置和高电流监听,而是在超时后(约1秒)自动切回总线下拉0V的深度睡眠。这一设计主要考虑抗干扰:假如一场噪声引发了错误的WUP但无后续真正通信,收发器会在tSilence后恢复休眠,不会无限等下去。另一方面,如果后续又有新的帧,在tSilence计时之前出现,收发器会认为网络又活跃了,继续保持偏置监听状态。只有彻底静默达到阈值才真正“睡回去”。
5. 总线唤醒信号测量:在实车调试中,工程师有时会用示波器观察CAN唤醒波形。典型看到的是:总线电压在Sleep时接近0V共模,一片平静;当发起唤醒时,CAN_H和CAN_L突然出现一次跃变(那是第一个显性),随后几个快速脉冲——这就是WUP的模样。如果把示波器时间拉大,可以看到随后总线电平保持在2.5V左右的隐性偏置(这是收发器已经进Bias状态)。接着便是一连串正常CAN通信波形(唤醒帧和后续帧)。如果唤醒成功,ECU上电后会开始主动发送报文,此时波形与平常无异,表示网络已全醒。如果唤醒未持续,过一阵子又回到0V静线。通过这种波形观测,可以判断收发器模式转换是否正常:例如如果看到唤醒帧后总线依然没有升到2.5V偏置,可能表明收发器未切换出Offline模式(也许配置有误或收发器故障);反之,偏置起来了但ECU没反应,可能是MCU未被唤醒或者程序未执行正确流程。波形分析是调试CAN唤醒问题的利器之一。
实车调试方法与故障排查技巧
确保CAN休眠/唤醒机制在真实车辆上可靠工作,需要经过细致的调试和测试。以下是一些实用方法和常见问题排查技巧,供参考:
调试方法
静态电流测试:首先在实车上验证各ECU休眠后的电流是否达到要求值。例如断开车辆高压,关闭车门等待一段时间,让车身CAN进入Bus-Sleep,然后使用万用表或电流钳测量蓄电池电流。典型乘用车深度休眠电流要求在几十毫安甚至更低。若测得电流偏高,说明可能有ECU未成功休眠或频繁唤醒。
网络监听:利用CANalyzer、CANoe或Peak等工具监控总线,在熄火后应看到NM报文持续一会儿然后停止,网络进入安静。如果还有ECU周期性发消息,需找出是哪台ECU。例如,有时某节点由于未收到休眠指令,仍周期发送诊断帧,导致全网无法休眠。这时应检查ComM/NM配置或应用逻辑。
唤醒触发测试:人为制造唤醒条件,例如按遥控钥匙、拉门把手、发送OBD诊断请求帧等,观察相应ECU是否如期唤醒。可以在唤醒前用电流表监测某ECU电流,触发唤醒后应看到其电流从微安跳到工作电流。同时用CAN工具看唤醒后总线报文恢复的情况。
分段断电实验:如果怀疑某ECU的唤醒机制问题,可单独对其供电注入/断开进行测试。如断开可疑ECU看整车电流是否恢复正常,以定位问题源。在架构允许时,给ECU供电但断开其CAN收发器(拔下CAN高低引脚)看其单独静态电流,也可判断MCU是否真的进入低功耗。
读取唤醒状态:对于支持读取唤醒原因的ECU,通过诊断服务或调试口获取唤醒日志。例如不少BCM有记录上次唤醒是由于哪条总线或本地事件导致,这对分析误唤醒很有帮助。如果ECU不提供,可考虑在软件中加入调试变量,每次EcuM发生唤醒时把原因写进NVM或RAM供读取。
常见故障与排查
ECU无法进入休眠:表现为熄火后该ECU仍保持工作电流,CAN总线持续有报文。可能原因:
- ECU接收不到休眠指令:检查其ComM配置,确保上层正确请求NoCom;或检查NM网络,是否它一直收到别人的NM唤醒包从未Timeout。
- ECU应用层阻止休眠:有些安全或Comfort功能可能周期运行,即使熄火仍占用总线。需确认无额外任务占用通信。通过CAN总线抓包,如果某ECU熄火后仍发消息,则对症修改软件使其停发。
- 硬件问题:如收发器EN/STB引脚接线错误导致无法切换模式。或者MCU的STOP模式未启用,使其一直运行。可以通过测MCU时钟引脚或者调试接口看MCU是否真的进入了低功耗。
ECU无法被唤醒:表现为发送了唤醒帧但目标ECU毫无响应,仍休眠状态。检查项:
- 唤醒帧是否正确:核实帧ID、数据内容、发送次数。必须与ECU配置匹配(包括标准/扩展ID类型)。可通过读取ECU收发器配置(若支持)或配置表确认。
- 唤醒帧是否到达:排除总线问题,可在ECU CAN脚旁用示波器测量是否看到了那帧电平。如果有中继器或网关也需确认转发正常。
- 收发器配置是否正确:确保ECU收发器的唤醒过滤已启用(例如TJA1145的SW_EN位=1)。如果配置错误(如ID错位、数据掩码不符),收发器当然无视唤醒帧。重新校对配置或直接尝试使用“非选择性唤醒”(即发送几次任意消息看看是否能唤醒),若这样能唤醒则说明过滤条件有问题。
- MCU低功耗配置:在Pretended Networking模式下,需确认MCU允许相应Stop模式下CAN唤醒。例如S32K如果用了STOP1但PN仅支持STOP2,那么MCU就不会醒。调整MCU低功耗等级即可。
- 硬件连线:检查收发器INH/WAKE/RXD与MCU的连接是否正确,万一INH没接对PMIC,收发器虽切换Standby但MCU供电没恢复。用万用表测INH电压变化可验证(Sleep时0V,唤醒时升为电池电压)。
网络频繁误唤醒:即没有明确触发却总有ECU被唤醒。此时症状往往是熄火后隔一段时间又听到继电器声、ECU上电。这种“自醒”通常是噪声或错误引起:
- 总线干扰:如果CAN布线抗扰不佳,外部电磁干扰(如邻近强信号)可能耦合使CAN产生类似WUP的假信号。收发器虽然有滤波,但依然可能被长时间短路或共模噪声所骗。排查可在安静环境下观察是否还有误触发,如没有则考虑改善屏蔽或在收发器前端加共模扼流圈。
- 线束故障:CAN_H或CAN_L与车身电源短路会造成持续显性或毛刺,触发唤醒。特别是CAN_H对电源短会导致终端偏置上拉,表现为总线常显性。可通过分段断开总线节点定位是否某段有短路,修复线路。
- 未授权节点发送帧:某ECU软件bug可能在休眠时错误地发送消息(比如某定时器未停)。这样它自身可能保持唤醒,也唤醒别人。用CAN监视器捕捉休眠期间任何帧出现并识别发送方,就可锁定有问题的节点并分析其软件。
- 门锁等本地扰动:有些车在锁车后会偶尔检测门状态导致某模块Wake引脚抖动,引起唤醒。可在车辆完全无物理扰动情况下测试,看是否依旧唤醒,以区分本地原因还是远程原因。
对误唤醒问题,解决关键在于找到触发源。可以逐个断开可疑模块看是否问题消失,或者在各模块唤醒日志中查看谁先醒。经常发现的“罪魁”包括:车载防盗系统定时发信号、LIN从节点定时唤醒主机、诊断OBD器件误报文等。
节点间唤醒不同步:有时会遇到某些ECU醒了而另一些没醒,全车功能异常。例如网关起来了但某控制器未起来导致数据传不过去。这种多见于部分网络配置不当:
- 可能某ECU设置了PN,但它的伙伴没有,导致伙伴需要NM唤醒却没收到帧,不醒。此时需要调整,要么都用NM,要么都用PN帧,不能一边NM一边Selective。
- 也可能唤醒帧设计不合理:比如A节点唤醒B,但C节点也需要同步工作却没被通知。解决方法可以发送组合唤醒帧或顺序唤醒:A先唤醒B,B起来后由A/B发NM唤醒C。这需要软件配合,AUTOSAR标准NM一般要求同时醒,因此需要定制逻辑。
- 排查这类问题需要梳理唤醒顺序和依赖关系,确保所有关键节点在需要时候都能被涵盖在唤醒序列中。必要时,折中方案是在唤醒初期使用广播NM,保证一网之内都醒,然后个别不需要的再自行休眠。但这违背PN初衷,只能视项目平衡。
其它细节:
- CAN错误帧:一种特殊情况是CAN错误(Error Frame)也可能导致唤醒。一些收发器把持续显性错误(如总线被卡住)视为wake-up。例如Stack Overflow上有提问提到CAN Error Frame能否唤醒ECU。大多数收发器只看物理电平序列,因此长错误帧等同于显性噪声,可能触发WUP。若遇到频繁Bus-Off或错误帧导致的误唤醒,应先解决错误根因。
- 灵敏度调整:部分收发器可能有内部滤波时间档位设置,例如Infineon TLE9351有普通模式和“短滤波”模式。短滤波会对快速短暂活动也唤醒。如果发现自己系统唤醒过于灵敏或迟钝,可以查阅收发器手册,看能否通过寄存器调整滤波窗口。一般默认值已经平衡了可靠性和响应速度,不建议轻易修改。
- 软件延迟:在唤醒时,有些ECU即便硬件已经唤醒,但软件可能需要一点时间初始化。不少车厂规定唤醒后100ms内节点必须可以响应诊断或NM,否则判定唤醒延迟太长。这需要我们优化MCU上电初始化流程,尽量缩短Boot时间,包括把唤醒后的关键任务前置。当然,这更多是系统性能问题,不属于故障,但值得注意以提升用户体验(比如遥控开门时延)。
故障排查流程小结
综合以上,排查CAN休眠/唤醒问题的流程建议如下:
明确症状:是无法休眠(电流偏高)、无法唤醒(功能不起)、误唤醒(睡眠后乱醒)还是不同步。
监控总线:用CAN工具记录熄火后的总线流量,识别异常消息。
隔离定位:如果怀疑某ECU,单独断开它验证情况变化。或者反向,逐个断开ECU看问题何时消失。
检查配置:核对AUTOSAR配置和收发器参数,对照需求是否正确。如Wake ID错误、PN没enable等。
硬件信号:示波器查看唤醒信号和INH、RXD等引脚,确认电平动作符合预期。
软件日志:利用诊断或调试接口读取唤醒原因、错误记录等辅助信息。
通过系统的方法,大部分问题都能找到原因并加以解决。在解决之后,一定要回归测试各个休眠唤醒场景,包括正常锁车->解锁、多次反复锁解、长时间停放后唤醒等,确保问题不再复现。
结语
CAN总线的休眠与唤醒机制涉及协议规范、硬件电路和软件策略的协同,是汽车电子开发中一项复杂而关键的课题。本文从原理到实践,对CAN部分网络唤醒、收发器工作模式、AUTOSAR模块交互以及调试方法做了全面解析。在NXP S32G等平台上,我们看到了如何将这些理论应用于工程,显著降低整车静态功耗的同时,保证车辆能在需要时可靠地被叫醒。
通过部分网络技术,现代汽车实现了“该睡则睡、该醒则醒”的智能电源管理:无关的ECU长眠节能,所需的ECU瞬时唤醒履职。这不仅延长了电瓶驻车续航时间,也为更多24小时在线的功能(如远程监控、无钥进入)奠定了实现基础。在今后的汽车网络架构中,随着OTA和智能化需求增加,休眠唤醒策略会更加精细,可能发展出跨网络域的选择性唤醒、融合更多传感条件的智能唤醒等。
参考资料:
- NXP Semiconductors, High-Speed CAN Transceivers with Partial Networking – Product Info
- Texas Instruments, How Selective Wake Enables Partial Networking – App Note
- CAN in Automation (CiA), The new wake-up pattern for a robust system – iCC2017 Paper
- Microchip Technology, CAN Partial Networking Transceivers Overview
- NXP Application Note, AN5293: Pretended Networking on MPC5748G
- CSDN博客, S32K14x CAN休眠唤醒的实现方案
- 电子工程专辑, CAN网络管理(TJA1145如何实现MCU的休眠唤醒)
