CAN总线的BusOff状态通常源于错误帧的不断积累。错误帧本身是一个接收节点认为数据有误,从而故意打断通信以使发送节点感知并重发报文的设计。这里存在一个“接收方认为发送方有错”的主观认知环节,使得CAN总线的故障诊断有时颇具挑战性。本文将分享一种方法,通过分析CAN总线波形的幅度、脉宽及电流等多维度信息,来精确定位错误帧的产生根源。
一、CAN节点基础构成
典型的CAN节点由微控制器(MCU)、CAN控制器和CAN收发器(Transceiver)组成。MCU内置CAN控制器,负责将应用数据封装为标准CAN帧格式,同时也进行帧校验和错误处理。控制器处理好的逻辑报文通过TX(发送)和RX(接收)引脚传送至CAN收发器。收发器的核心作用是进行电平转换,将控制器的单端逻辑电平信号转变为在物理总线上传输的差分信号(CANH与CANL),并通过双绞线进行通信。
在物理层,一个典型的双节点CAN网络等效电路包含两个CAN收发器和匹配的终端电阻。总线静默时,收发器内部的电路将CAN-H和CAN-L都拉至约2.5V,这个状态称为“隐性”,对应逻辑电平1。当节点需要驱动总线时(TX=0),它会导通内部电路,在总线上产生一个显著的差分电压(CAN-H升高,CAN-L降低),这个状态称为“显性”,对应逻辑电平0。
这里有几点关键的反直觉知识:
- 逻辑反相:总线无人驱动(隐性)时,TX/RX逻辑电平为1;总线被驱动(显性)时,对应逻辑电平0。这种设计类似于开集电极逻辑,增强了抗干扰能力,但也要求特别注意MCU与收发器之间的上下电时序,避免出现MCU已断电(TX输出不确定)而收发器仍在工作的状态。
- 电压容错:理论上,CAN_L短接到地或CAN_H短接到12V,由于终端电阻的分压作用,总线仍可能维持基本通信,但误码率会升高。如果观察到CAN通信电压不以2.5V为中心对称,也可能是多条CAN线缆交叉错接所致。
- 终端电阻:一个CAN网络中,120Ω终端电阻在1到4颗之间都能工作。数量过少会影响远端节点的抗扰度,过多则可能导致显性差分电压无法达到接收阈值。
- 分支匹配:对于较长的CAN分支线,可以添加1KΩ至4.7KΩ的支线电阻来改善抗扰度。
二、CAN链路层与帧结构
CAN控制器负责链路层协议。一帧标准CAN报文包含几个关键字段:仲裁段、控制段、数据段、CRC段和ACK段。
- 仲裁段:主要包含报文ID,并实际执行优先级仲裁功能。当两个节点同时开始发送时,它们会逐位比较ID。发送显性位(0)的节点会覆盖发送隐性位(1)的节点,ID值更小(二进制中0优先)的报文赢得总线使用权,失败的节点会自动退出发送并等待重试。这意味着CAN网络是对等的,优先级取决于报文ID本身,而非发送节点。
- 控制段:包含如IDE(标识符扩展)、R0(保留位,在CAN-FD中用作FDF帧格式标志)、DLC(数据长度码)等控制信息。CAN-FD协议仅在数据段切换至更高的波特率(如2Mbps),仲裁段和控制段仍保持基础速率(如500kbps)。
- CRC段:对从帧起始到数据段结束的所有位进行计算校验,确保数据完整性。
- ACK段:这是一个由接收方确认的时隙。发送节点在此位发送隐性位(1),而所有正确接收到该帧(仅校验链路层格式正确)的节点会同时回应一个显性位(0)。因此,ACK位在总线上会呈现出较高的电压,因为多个节点在同时驱动。
三、真实CAN总线波形解析
通过示波器观察实际总线,可以获得丰富的信息。例如,在一个多节点网络中观测到的一帧完整报文波形显示:
- 在报文起始的仲裁阶段,如果波形出现高于单节点驱动时的电压台阶,表明有多个节点在同时竞争总线。
- 在ACK位,电压通常会达到最高,因为此时除了发送节点自身,所有正确接收的节点都在同时驱动显性位。
- 一个节点的逻辑侧TX信号(绿色)在自身为接收方时,通常保持高电平(隐性),仅在需要发送(如竞争总线或回应ACK)时拉低。当它想发送隐性但总线被其他节点驱动为显性时(例如仲裁失败),其TX仍为高,但总线波形为低。
四、错误帧的产生机理与“位填充”规则
错误帧并非由某个节点单独发出,而是由某个接收节点认为总线出错后,故意驱动总线来打断发送方,从而在总线上形成的一个特殊序列。
理解错误帧的关键在于CAN协议的“位填充”规则:逢五补一。即发送节点在发送连续5个相同的显性位(0)或隐性位(1)后,必须自动插入一个相反极性的补位(填充位)。例如,连续5个0后必须插1个1。
如果发送节点违反了此规则(漏插补位),或者补位在传输中被干扰,接收节点就会检测到“位填充错误”。作为响应,该接收节点会立即向总线发送一个“主动错误标志”——连续6个显性位(0)。这个6连0本身也违反了“逢五补一”规则,从而能够被总线上所有节点识别为一个错误信号。
五、通过波形幅度与脉宽定位错误源
当发生错误时,示波器捕捉到的波形包含多维信息:
-
错误标志的脉宽:主动错误标志是6个连续显性位。在500kbps速率下,1个位宽2us,因此错误标志理论长度为12us。设置示波器触发条件为大于11us的显性脉宽,可以快速捕捉到错误帧,无需依赖复杂的协议解码。
-
电压台阶分析(升维打击):
- 在错误标志持续期间,如果波形出现电压起伏的“台阶”,表明有多个节点在不同时间点开始或结束驱动错误标志。
- 结合欧姆定律分析:总线上差分电压是驱动电流在并联终端电阻上的压降。驱动节点越多,等效电阻越小,在相同驱动能力下电压越高。因此,电压台阶的高度变化直接反映了同时驱动总线节点数量的变化。
- 通过分析错误标志内电压台阶的数量、高度和时序,可以反推有哪些节点、在何时参与驱动了错误帧。
-
驱动能力差异:不同型号或品牌的CAN收发器驱动能力可能有细微差别。在错误波形中,如果某个电压台阶明显低于其他,可能对应着一个驱动能力较弱的节点,这有助于区分不同设备。
六、实战案例分析:CRC错误帧
在一个案例中,错误发生在报文的CRC段。放大后的波形显示,错误标志(连续显性)期间出现了三个明显的电压台阶。
- 第一个台阶:电压最高,推测是节点A(认为CRC错误)和节点B(报文发送方)同时在驱动错误标志。
- 第二个台阶:电压略微下降,可能是节点B停止驱动,仅剩节点A在驱动。
- 第三个台阶:电压再次略微升高并持续,推测节点C也识别到错误(可能由于位填充规则被违反)加入驱动,与节点A共同形成。
通过这种“12us间隔拆分电压台阶”的方法,可以推断出:节点A率先因认为CRC错误而发出主动错误标志,节点B(发送方)随后因回读不一致也发出错误标志,最后节点C加入。故障根源可能在于节点A的采样点设置不佳或所在分支线路过长导致信号质量差,使其误判了CRC。
七、CAN-FD错误排查的特殊性
CAN-FD的错误排查原理相同,但更复杂:
- 速率切换:CAN-FD报文在数据段会切换到更高波特率(如2Mbps)。错误可能发生在高速率段。
- 填充规则跟随速率:“逢五补一”的规则在高速率段同样适用,但判断连续位的宽度以高速率的位时间为准。
- 错误标志速率固定:无论错误发生在哪个速率段,节点输出的“主动错误标志”总是以基础速率(如500kbps)发送,即固定为12us长的6个显性位。
一个典型CAN-FD错误案例:节点C发送FD报文,但在高速数据段受到干扰,自身回读失败。它首先以500kbps发出12us的主动错误标志。节点A和B在高速率段检测到连续6个显性位(违反了高速率的位填充规则),随后也发出500kbps的错误标志。在示波器上,会先看到一段高速率的连续显性(例如3us,对应6个2Mbps的位),紧接着是叠加的、带有电压台阶的12us长错误标志。
八、总结与故障定位流程
利用示波器进行CAN错误帧深度排查,可遵循以下思路:
- 初步定位:结合通信矩阵(知道ID对应发送节点),逐个拔除非关键节点,同时用示波器观察错误帧是否消失,模糊定位问题节点。
- 信号观测:如果条件允许,测量疑似问题节点的
逻辑电平信号(TX),看其何时拉低(发出错误标志),这能最直观地揭示是哪个节点“认为”总线出错。
- 电流探测:使用电流探头测量节点CAN_H或CAN_L引脚的电流。输出正电流表示该节点在驱动总线,输入负电流表示其他节点在驱动它。通过观察错误帧期间电流方向,可以清晰定位是谁在主动驱动错误标志。
- 波形分析:当无法接入逻辑或电流信号时,专注于分析差分电压波形。仔细测量错误标志区域(>11us显性)内的电压台阶数量、高度和
布线时序,利用多节点驱动电压升高的原理,拆解错误标志的构成,推断故障源头。
- 参数校验:检查所有节点的波特率、采样点、同步跳转宽度(SJW)等参数是否一致,尤其是在CAN-FD网络中,参数不匹配是导致错误帧的常见原因。
通过上述多维度的波形分析,工程师可以超越简单的协议解码,深入物理层和链路层交互的细节,从而精准定位导致CAN总线错误帧乃至BusOff的根源,提升网络/系统级运维 & 测试的效率与准确性。
参考资料
[1] 示波器排查CAN错误帧,没几个月消化不了!建议收藏!, 微信公众号:mp.weixin.qq.com/s/bJMHYQYE4lT_E9FulCMQHQ
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。