3. CAN帧结构解析
在CAN总线故障定位中,示波器或CAN分析仪抓到的“异常波形”最终都要落到帧结构上解释。只有把数据帧、远程帧、错误帧、过载帧的字段边界、位时序和场功能看清楚,才能判断是仲裁丢失、CRC错误、ACK缺失,还是节点主动报错。本节从帧类型出发,逐场拆解数据帧,并说明各场在诊断中的实际意义。
一、四种帧类型与总体格式
CAN 2.0B协议定义了四种帧类型,它们共享相同的位填充规则和帧间隔结构,但用途和字段组成不同:
- 数据帧:发送节点向总线广播数据,是正常通信的主体,包含仲裁场、控制场、数据场、CRC场、ACK场和帧结束。
- 远程帧:请求其他节点发送指定ID的数据,不含数据场,RTR位为隐性(1),用于“按需拉取”而非周期广播。
- 错误帧:任一节点检测到错误后立即发送,由错误标志和错误界定符组成,用于破坏总线上的错误帧并通知全网。
- 过载帧:接收节点因内部处理能力不足,需要延迟下一帧时发送,结构与错误帧类似,但只能由接收节点在帧间隔期间发出。
下图给出四种帧在同一总线上的结构对比,重点标出数据帧各场的位置与作用,便于与后续波形对照。
二、数据帧各场作用详解
数据帧是诊断中最常分析的帧型,其字段按顺序依次为:
| 场名 | 长度 | 关键位 | 作用 | 故障关联 |
|---|---|---|---|---|
| 帧起始 SOF | 1位 | 显性(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缺失表示无节点接收 |
| 帧结束 EOF | 7位 | 全隐性(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分析仪记录到大量错误帧,但总线负载仅35%。按帧结构逐场排查:
- 观察错误帧位置:错误帧均出现在某电机控制器报文之后,且错误标志为主动错误(6显性)。
- 检查该报文CRC场:发现CRC序列与接收端计算结果不一致,说明发送或传输过程位翻转。
- 用示波器测量该节点CAN_H/CAN_L:发现下降沿有明显振铃,采样点附近电平未稳定。
- 调整该节点位时序:将采样点从75%后移至80%,并增加同步跳转宽度,错误帧消失。
该案例说明,错误帧不是“孤立故障”,而是帧结构中某一字段校验失败的信号。定位时应从错误帧类型反推是CRC场、ACK场还是格式场出错,再结合波形确认是物理层还是协议层问题。
五、常见误区与复盘
- 误区一:把远程帧当数据帧。远程帧RTR为隐性,若分析仪未正确解析RTR,会把请求帧误判为数据帧,导致“数据长度不符”的假象。
- 误区二:忽略DLC与实际长度差异。DLC只声明长度,不校验内容。若DLC=8而数据场只有4字节,通常是位填充或采样错误,而非节点故意发送。
- 误区三:把过载帧当错误帧。过载帧由接收节点发出,表示处理延迟;错误帧由检测到错误的节点发出。两者标志位相同但触发条件不同,需结合帧间隔位置判断。
- 误区四:只看ID不看场。仲裁场只决定优先级,CRC场和ACK场才反映通信质量。丢帧问题往往出在CRC场或ACK场,而非ID本身。