2、CAN协议基础回顾:经典CAN的帧格式、仲裁机制、错误处理、位定时与同步

在深入CAN FD(CAN with Flexible Data-rate)之前,必须扎实掌握经典CAN(CAN 2.0)的核心机制。CAN FD并非另起炉灶,而是在经典CAN的物理层与数据链路层基础上扩展而来,其帧结构、仲裁规则、错误处理逻辑以及位同步机制均与经典CAN一脉相承。本章将系统梳理这四大基石,为后续理解CAN FD的“可变速率”与“更大数据场”奠定基础。

经典CAN核心机制总览 帧格式 SOF + ID + RTR + IDE DLC + Data + CRC + ACK EOF + IFS 标准帧11位ID / 扩展帧29位ID 仲裁机制 CSMA/CA + 非破坏性逐位仲裁 显性(0) 优先于 隐性(1) ID越小优先级越高 发送节点同时监听总线电平 错误处理 5种错误检测机制 错误主动 / 错误被动 / 总线关闭 TEC / REC 计数器管理 错误帧由6个显性位触发 位定时与同步 同步段 + 传播段 + 相位缓冲 硬同步 / 重同步 SJW 同步跳转宽度 采样点位置决定可靠性 四大机制协同工作 帧格式定义通信语言 → 仲裁机制决定总线使用权 → 错误处理保证数据完整性 → 位同步确保采样准确 CAN FD 的演进基础 保留经典CAN的仲裁与错误处理框架 在数据场阶段切换更高位速率,并扩展DLC至64字节

2.1 经典CAN的帧格式:从SOF到EOF的完整解剖

核心原理:经典CAN 2.0规范定义了两种帧格式:标准帧(CAN 2.0A,11位标识符)与扩展帧(CAN 2.0B,29位标识符)。无论哪种格式,数据帧均由七个字段构成:帧起始(SOF)、仲裁场、控制场、数据场、CRC场、ACK场、帧结束(EOF)。理解每个字段的位序与功能,是分析总线报文的基础。

字段 标准帧(CAN 2.0A) 扩展帧(CAN 2.0B) 关键说明
SOF 1位显性 1位显性 标志帧起始,同步所有节点
仲裁场 11位ID + RTR 29位ID(11位基础+18位扩展)+ SRR + IDE + RTR 决定优先级;RTR=0为数据帧,RTR=1为远程帧
控制场 IDE(1) + r0(1) + DLC(4) r1(1) + r0(1) + DLC(4) DLC表示数据长度(0-8字节)
数据场 0-8字节 0-8字节 实际载荷,MSB先行
CRC场 15位CRC + 1位CRC界定符 15位CRC + 1位CRC界定符 覆盖SOF至数据场,生成多项式为x^15+x^14+x^10+x^8+x^7+x^4+x^3+1
ACK场 1位ACK槽 + 1位ACK界定符 1位ACK槽 + 1位ACK界定符 发送节点发送隐性位,接收节点在ACK槽拉低为显性
EOF 7位隐性 7位隐性 帧结束标志,之后是IFS(帧间空间)

判断方法:解析CAN报文时,首先检查SOF是否为显性(逻辑0),然后读取仲裁场。若IDE位为显性,则为标准帧;若IDE为隐性且SRR为隐性,则为扩展帧。DLC字段需注意:当DLC值大于8时(如9-15),实际数据长度仍为8字节,这是经典CAN的保留定义,但在CAN FD中该规则被重新定义。

实战场景:某ECU发送标准帧报文ID=0x123,DLC=8,数据为0x01 0x02 ... 0x08。在CAN总线上抓取波形时,可观察到:SOF显性位后紧跟11位ID(0x123的二进制为00100010011),随后RTR=0表示数据帧,IDE=0确认标准帧格式。CRC场由硬件自动计算,无需软件干预。
常见误区:初学者常将DLC与数据长度混淆。DLC是4位控制字段,其值0-8直接对应数据字节数,但值9-15在经典CAN中均表示8字节。此外,远程帧(RTR=1)没有数据场,但DLC仍表示请求的数据长度。

2.2 仲裁机制:非破坏性逐位仲裁的工程智慧

核心原理:CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制,但与传统以太网的冲突检测不同,CAN的仲裁是非破坏性的。当多个节点同时发送时,每个节点在发送每一位的同时监听总线电平。显性位(逻辑0)会覆盖隐性位(逻辑1),因此发送隐性位的节点在检测到总线为显性时,会立即退出仲裁并转为接收状态。这一机制保证了高优先级(ID数值小)的报文无延迟地占用总线。

仲裁流程:

  1. 所有待发送节点在总线空闲时同时发送SOF。
  2. 从仲裁场第一位开始,每个节点逐位比较发送电平与总线电平。
  3. 若发送隐性位(1)但总线上为显性(0),则该节点失去仲裁,立即停止发送并转为接收。
  4. 胜出的节点继续发送剩余帧内容,整个过程无数据损坏。

案例拆解:假设三个节点同时发送:节点A发送ID=0x100(二进制00100000000),节点B发送ID=0x200(01000000000),节点C发送ID=0x300(01100000000)。仲裁过程如下:

  • 第1位:三者均发送0(显性),总线为显性,均继续。
  • 第2位:A发送0,B发送1,C发送1。A保持显性,B和C发送隐性但检测到显性,退出仲裁。
  • 最终A获得总线使用权,B和C自动转为接收节点。
经验提醒:在实际工程中,ID分配策略直接影响实时性。通常将最高优先级(最小ID)分配给安全关键报文(如安全气囊触发、制动控制),将诊断类报文设为较低优先级。同时需注意,扩展帧的29位ID仲裁时,基础ID部分(11位)先参与仲裁,若相同再比较扩展ID。
常见误区:仲裁机制依赖所有节点具有相同的位时序参数。若节点间波特率偏差过大,可能导致仲裁错误。此外,远程帧与数据帧的优先级比较中,RTR位为显性的数据帧优先于RTR为隐性的远程帧(当ID相同时)。

2.3 错误处理:五类错误检测与状态机管理

核心原理:CAN协议定义了五种错误检测机制,任何节点检测到错误都会立即发送错误帧(6个显性位),终止当前传输。错误处理的核心是每个节点维护两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。根据计数值,节点处于三种状态之一:错误主动(Error Active)、错误被动(Error Passive)、总线关闭(Bus Off)。

错误类型 检测机制 错误帧行为
位错误 发送节点比较发送电平与总线电平 发送节点立即报错
填充错误 检测到连续6个相同电平(违反位填充规则) 所有节点报错
CRC错误 接收节点计算CRC与接收到的CRC不匹配 接收节点报错
格式错误 检测到固定隐性位字段(如EOF、CRC界定符)为显性 所有节点报错
ACK错误 发送节点在ACK槽未检测到显性位 发送节点报错

状态转换规则:

  • 错误主动:TEC<128且REC<128。节点可正常发送/接收,检测到错误时发送主动错误帧(6个显性位)。
  • 错误被动:TEC≥128或REC≥128。节点不能发送主动错误帧,只能发送被动错误帧(6个隐性位),且发送前需等待8个隐性位(暂停发送)。
  • 总线关闭:TEC>255。节点完全脱离总线,不参与任何通信,需等待128次总线空闲(11个隐性位)后自动恢复。
排障实战:某车辆CAN总线出现间歇性通信中断。通过CANalyzer抓取错误帧发现,节点A频繁发送错误帧,且TEC持续增长。分析波形发现,节点A的位时序配置中,采样点设置过晚(85%),导致在总线较长时采样到错误电平。将采样点调整为75%后,错误帧消失。此案例说明,错误处理机制不仅是协议层面的保护,更是诊断总线物理层问题的关键入口。
常见误区:错误被动节点发送的被动错误帧为6个隐性位,不会破坏总线上的显性电平,因此其他节点可能无法感知该错误。此外,总线关闭状态不会自动清除REC,需通过硬件复位或诊断命令恢复。

2.4 位定时与同步:采样点的精确控制

核心原理:CAN总线采用不归零(NRZ)编码,没有独立的时钟线,因此接收节点必须从数据流中恢复时钟。位定时将每一位时间划分为四个段:同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段1(PHASE_SEG1)、相位缓冲段2(PHASE_SEG2)。采样点位于PHASE_SEG1与PHASE_SEG2的交界处。同步机制分为硬同步(帧起始时)和重同步(帧内边沿时),通过调整PHASE_SEG1或PHASE_SEG2的长度来补偿时钟偏差。

位时间计算:

位时间 = 1 / 波特率
同步段 = 1 TQ(时间量子)
传播段 = 1-8 TQ(通常设为2×物理延迟)
相位缓冲段1 = 1-8 TQ
相位缓冲段2 = 1-8 TQ
SJW(同步跳转宽度)= 1-4 TQ(≤ PHASE_SEG1)

采样点 = (SYNC_SEG + PROP_SEG + PHASE_SEG1) / 总TQ × 100%

同步规则:

  • 硬同步:在帧起始SOF的下降沿触发,所有节点将位时间重新对齐,SYNC_SEG后的边沿即为采样基准。
  • 重同步:在帧内检测到隐性到显性的边沿时,若边沿落在SYNC_SEG之后,则延长PHASE_SEG1(最多SJW);若边沿落在SYNC_SEG之前,则缩短PHASE_SEG2(最多SJW)。
工程建议:采样点推荐设置在75%-85%之间。对于高速CAN(500kbps),典型配置为:TQ=16,SYNC_SEG=1,PROP_SEG=3,PHASE_SEG1=8,PHASE_SEG2=4,SJW=4,采样点=75%。对于低速CAN(125kbps),可适当增加PROP_SEG以覆盖更长的总线延迟。
参数调优案例:某工业设备CAN总线长度50米,波特率500kbps,初始配置采样点80%,但通信误码率高达0.1%。分析发现,总线传播延迟(5ns/m×50m=250ns)加上收发器延迟(约200ns),总延迟450ns,而位时间为2000ns。传播段仅配置为2TQ(250ns),无法覆盖延迟。将PROP_SEG调整为4TQ(500ns),采样点调整为70%,误码率降至0.001%以下。
常见误区:SJW设置过大可能导致过度补偿,引发振荡;设置过小则无法有效同步。此外,所有节点的位时序参数必须一致,否则仲裁机制可能失效。使用CAN控制器时,需根据晶振频率和预分频器精确计算TQ值,避免四舍五入误差累积。

总结复盘:经典CAN的四大机制构成了一个闭环系统:帧格式定义了通信的语法,仲裁机制解决了总线竞争,错误处理保障了可靠性,位定时与同步确保了物理层的一致性。在后续学习CAN FD时,需特别注意:CAN FD保留了经典CAN的仲裁机制(仲裁场仍以标准速率传输),但在数据场阶段切换至更高位速率,且CRC算法升级为17/21位。理解经典CAN的细节,是掌握CAN FD差异化的前提。