3. CAN帧结构解析

在CAN总线故障定位中,示波器或CAN分析仪抓到的“异常波形”最终都要落到帧结构上解释。只有把数据帧、远程帧、错误帧、过载帧的字段边界、位时序和场功能看清楚,才能判断是仲裁丢失、CRC错误、ACK缺失,还是节点主动报错。本节从帧类型出发,逐场拆解数据帧,并说明各场在诊断中的实际意义。

一、四种帧类型与总体格式

CAN 2.0B协议定义了四种帧类型,它们共享相同的位填充规则和帧间隔结构,但用途和字段组成不同:

  • 数据帧:发送节点向总线广播数据,是正常通信的主体,包含仲裁场、控制场、数据场、CRC场、ACK场和帧结束。
  • 远程帧:请求其他节点发送指定ID的数据,不含数据场,RTR位为隐性(1),用于“按需拉取”而非周期广播。
  • 错误帧:任一节点检测到错误后立即发送,由错误标志和错误界定符组成,用于破坏总线上的错误帧并通知全网。
  • 过载帧:接收节点因内部处理能力不足,需要延迟下一帧时发送,结构与错误帧类似,但只能由接收节点在帧间隔期间发出。

下图给出四种帧在同一总线上的结构对比,重点标出数据帧各场的位置与作用,便于与后续波形对照。

CAN 2.0B 四类帧结构对比 数据帧(Data Frame) 帧起始 SOF 仲裁场 11/29位ID + RTR 控制场 IDE/r0/DLC 数据场 0~8字节 CRC场 15位+界定符 ACK场 槽+界定符 远程帧(Remote Frame) 帧起始 SOF 仲裁场 RTR = 隐性(1) 控制场 无数据场 CRC场 ACK场 错误帧(Error Frame) 错误标志 主动6位显性 / 被动6位隐性 错误界定符(8位隐性) 帧间隔 / 重传 过载帧(Overload Frame) 过载标志 6位显性(仅接收节点) 过载界定符(8位隐性) 帧间隔 / 延迟 位填充规则:SOF至CRC序列之间,连续5个相同位后自动插入1个相反位;接收端自动去除。 仲裁场决定优先级,控制场决定数据长度,CRC场负责检错,ACK场确认接收,错误/过载帧用于异常与流控。

二、数据帧各场作用详解

数据帧是诊断中最常分析的帧型,其字段按顺序依次为:

场名长度关键位作用故障关联
帧起始 SOF1位显性(0)同步所有节点,标志帧开始SOF畸变导致同步失败
仲裁场12/32位ID、RTR、IDE、SRR决定优先级与帧类型ID冲突、仲裁丢失
控制场6位IDE、r0、DLC声明数据长度与格式DLC与实际字节不符
数据场0~64位Data0~Data7承载实际应用数据数据错位、字节序错误
CRC场16位CRC序列+界定符循环冗余校验,检错CRC错误触发错误帧
ACK场2位ACK槽+界定符接收节点确认收到ACK缺失表示无节点接收
帧结束 EOF7位全隐性(1)标志帧结束EOF位错误

仲裁场是数据帧的“身份与优先级”所在。标准帧使用11位标识符,扩展帧使用29位标识符,IDE位区分两者。RTR位在数据帧中为显性(0),在远程帧中为隐性(1),这是区分数据帧与远程帧的关键。仲裁采用“显性覆盖隐性”的线与机制,ID数值越小优先级越高,因此高优先级报文在总线竞争中胜出。

控制场中的DLC(Data Length Code)为4位,取值0~8,表示数据场字节数。需要特别注意的是,DLC只表示长度,不保证数据内容正确;在CAN FD中DLC还可映射到12~64字节,但经典CAN中超过8的DLC属于非法或保留值。诊断时若发现DLC=8但实际只收到4字节,往往意味着位填充错误或采样点偏移。

CRC场由15位CRC序列和1位CRC界定符组成。发送节点根据SOF到数据场的所有位计算CRC,接收节点独立计算并比对。若不一致,接收节点在ACK界定符之后发出错误帧,强制发送节点重传。CRC错误是总线干扰、终端电阻不匹配、位时序偏差最常见的表征之一。

三、远程帧、错误帧与过载帧的格式要点

远程帧与数据帧结构相似,但RTR位为隐性,且没有数据场。它常用于请求某个ID的数据,例如诊断仪向ECU请求故障码。远程帧的DLC表示期望返回的数据长度,但实际返回长度由发送节点决定。若总线上长期只有远程帧而无数据帧响应,说明被请求节点未上线或未正确配置。

错误帧由错误标志和错误界定符组成。主动错误标志为6个连续显性位,会破坏总线上的位填充规则,使其他节点立即检测到错误;被动错误标志为6个连续隐性位,不会破坏总线。错误界定符为8个隐性位。错误帧的发送会触发发送节点重传,因此错误帧过多会显著降低总线有效带宽。

过载帧结构与错误帧类似,由6位显性过载标志和8位隐性过载界定符组成,但只能由接收节点在帧间隔期间发出,用于请求延迟下一帧。过载帧不应与错误帧混淆:过载帧表示“我还没准备好”,错误帧表示“我检测到错误”。

诊断提示:在CAN分析仪中,错误帧通常以红色标记,过载帧以黄色标记。若错误帧集中出现在某个ID附近,优先检查该节点的供电、接地和终端电阻;若过载帧频繁出现,检查接收节点CPU负载或中断响应时间。

四、案例:用帧结构定位“间歇性丢帧”

某新能源整车在路试中出现偶发丢帧,CAN分析仪记录到大量错误帧,但总线负载仅35%。按帧结构逐场排查:

  1. 观察错误帧位置:错误帧均出现在某电机控制器报文之后,且错误标志为主动错误(6显性)。
  2. 检查该报文CRC场:发现CRC序列与接收端计算结果不一致,说明发送或传输过程位翻转。
  3. 用示波器测量该节点CAN_H/CAN_L:发现下降沿有明显振铃,采样点附近电平未稳定。
  4. 调整该节点位时序:将采样点从75%后移至80%,并增加同步跳转宽度,错误帧消失。

该案例说明,错误帧不是“孤立故障”,而是帧结构中某一字段校验失败的信号。定位时应从错误帧类型反推是CRC场、ACK场还是格式场出错,再结合波形确认是物理层还是协议层问题。

五、常见误区与复盘

  • 误区一:把远程帧当数据帧。远程帧RTR为隐性,若分析仪未正确解析RTR,会把请求帧误判为数据帧,导致“数据长度不符”的假象。
  • 误区二:忽略DLC与实际长度差异。DLC只声明长度,不校验内容。若DLC=8而数据场只有4字节,通常是位填充或采样错误,而非节点故意发送。
  • 误区三:把过载帧当错误帧。过载帧由接收节点发出,表示处理延迟;错误帧由检测到错误的节点发出。两者标志位相同但触发条件不同,需结合帧间隔位置判断。
  • 误区四:只看ID不看场。仲裁场只决定优先级,CRC场和ACK场才反映通信质量。丢帧问题往往出在CRC场或ACK场,而非ID本身。
复盘结论:数据帧的仲裁场、控制场、数据场、CRC场、ACK场各有明确职责。仲裁场管优先级,控制场管长度,数据场管内容,CRC场管检错,ACK场管确认。错误帧和过载帧是总线健康的“报警器”,其出现位置和类型直接指向故障节点与故障场。掌握帧结构,才能把波形上的位跳变翻译成可执行的诊断结论。