2、CAN协议基础回顾:经典CAN的帧格式、仲裁机制、错误处理、位定时与同步
在深入CAN FD(CAN with Flexible Data-rate)之前,必须扎实掌握经典CAN(CAN 2.0)的核心机制。CAN FD并非另起炉灶,而是在经典CAN的物理层与数据链路层基础上扩展而来,其帧结构、仲裁规则、错误处理逻辑以及位同步机制均与经典CAN一脉相承。本章将系统梳理这四大基石,为后续理解CAN FD的“可变速率”与“更大数据场”奠定基础。
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中该规则被重新定义。
2.2 仲裁机制:非破坏性逐位仲裁的工程智慧
核心原理:CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制,但与传统以太网的冲突检测不同,CAN的仲裁是非破坏性的。当多个节点同时发送时,每个节点在发送每一位的同时监听总线电平。显性位(逻辑0)会覆盖隐性位(逻辑1),因此发送隐性位的节点在检测到总线为显性时,会立即退出仲裁并转为接收状态。这一机制保证了高优先级(ID数值小)的报文无延迟地占用总线。
仲裁流程:
- 所有待发送节点在总线空闲时同时发送SOF。
- 从仲裁场第一位开始,每个节点逐位比较发送电平与总线电平。
- 若发送隐性位(1)但总线上为显性(0),则该节点失去仲裁,立即停止发送并转为接收。
- 胜出的节点继续发送剩余帧内容,整个过程无数据损坏。
案例拆解:假设三个节点同时发送:节点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自动转为接收节点。
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个隐性位)后自动恢复。
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)。
总结复盘:经典CAN的四大机制构成了一个闭环系统:帧格式定义了通信的语法,仲裁机制解决了总线竞争,错误处理保障了可靠性,位定时与同步确保了物理层的一致性。在后续学习CAN FD时,需特别注意:CAN FD保留了经典CAN的仲裁机制(仲裁场仍以标准速率传输),但在数据场阶段切换至更高位速率,且CRC算法升级为17/21位。理解经典CAN的细节,是掌握CAN FD差异化的前提。