2. CAN总线基础回顾
在深入CAN FD(CAN with Flexible Data-rate)之前,必须扎实地回顾经典CAN 2.0协议。CAN FD并非凭空诞生,它是在CAN 2.0的物理层与数据链路层基础上,针对带宽瓶颈所做的扩展。理解CAN 2.0的帧结构、非破坏性仲裁机制以及分布式错误处理,是后续掌握CAN FD位速率切换、CRC增强和数据场扩展的前提。本章将从协议分层模型出发,逐层拆解CAN 2.0的核心机制,并结合实际总线故障案例,帮助学员建立完整的协议底层认知。
CAN 2.0协议规范由ISO 11898定义,分为物理层和数据链路层。物理层规定了差分信号的电气特性,而数据链路层则负责报文封装、总线访问和错误恢复。对于汽车电子工程师而言,最需要关注的是数据链路层中的帧格式、仲裁机制和错误处理三大模块。这三者共同决定了CAN总线的实时性、可靠性和确定性。
2.1 CAN 2.0帧格式详解
CAN 2.0规范定义了四种帧类型:数据帧、远程帧、错误帧和过载帧。其中数据帧用于节点间实际数据传输,是日常开发中最常打交道的帧类型。数据帧又分为标准帧(CAN 2.0A,11位标识符)和扩展帧(CAN 2.0B,29位标识符)。
标准数据帧结构由以下字段组成:帧起始(SOF,1个显性位)、仲裁场(12位,包含11位ID和RTR位)、控制场(6位,包含IDE位、DLC数据长度代码)、数据场(0-8字节)、CRC场(15位CRC序列+1位CRC界定符)、应答场(ACK槽+ACK界定符)以及帧结束(EOF,7个隐性位)。
扩展数据帧在仲裁场中增加了18位扩展ID,使得标识符空间从2048个扩展到5.36亿个。扩展帧的SRR位(替代远程请求)和IDE位(标识符扩展)在仲裁过程中起到关键作用。当标准帧与扩展帧同时竞争总线时,标准帧的IDE位为显性,因此标准帧优先获得总线访问权。
| 字段名称 | 标准帧 (CAN 2.0A) | 扩展帧 (CAN 2.0B) | 说明 |
|---|---|---|---|
| 帧起始 SOF | 1 bit 显性 | 1 bit 显性 | 同步所有节点 |
| 标识符 ID | 11 bit | 29 bit (11+18) | 决定优先级 |
| RTR/SRR | RTR 1 bit | SRR 1 bit (隐性) | 区分数据帧/远程帧 |
| IDE 位 | 1 bit 显性 | 1 bit 隐性 | 标识帧类型 |
| DLC | 4 bit | 4 bit | 数据长度 0-8 字节 |
| 数据场 | 0-8 字节 | 0-8 字节 | 实际有效载荷 |
| CRC | 15 bit | 15 bit | 校验范围含填充位 |
| ACK | 2 bit | 2 bit | 接收节点应答 |
| EOF | 7 bit 隐性 | 7 bit 隐性 | 帧结束标志 |
位填充规则是CAN协议中容易被忽视但至关重要的机制。在SOF到CRC序列之间,如果连续出现5个相同电平的位,发送节点会自动插入一个反相位的填充位。接收节点在解码时会自动移除这些填充位。位填充的目的是保证足够的电平跳变,从而维持接收节点的时钟同步。需要注意的是,CRC计算覆盖了填充位,因此任何填充错误都会被CRC校验捕获。
2.2 非破坏性仲裁机制
CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制,但与以太网的CSMA/CD不同,CAN的仲裁是非破坏性的。这意味着当多个节点同时发送时,优先级高的报文可以不受干扰地继续传输,而优先级低的节点自动退出发送,转为接收状态。这种机制保证了总线访问的确定性,使得高优先级报文的延迟时间可预测。
仲裁过程基于显性位(逻辑0)和隐性位(逻辑1)的电平特性。在CAN物理层,显性位会覆盖隐性位。当两个节点同时发送时,每个节点在发送每个位的同时回读总线电平。如果发送的是隐性位(1)但回读到显性位(0),说明有其他节点在竞争,该节点立即停止发送并转为接收模式。
仲裁优先级规则:标识符数值越小,优先级越高。这是因为ID的高位先发送,显性位(0)优先。例如,ID=0x100的报文优先级高于ID=0x200的报文。在标准帧与扩展帧混合的总线中,标准帧的IDE位为显性,因此标准帧总是优先于扩展帧。
- 仲裁场比较:从ID的最高位(MSB)开始逐位比较,直到分出胜负。
- RTR位仲裁:对于相同ID的数据帧和远程帧,数据帧的RTR位为显性,因此数据帧优先。
- SRR位处理:扩展帧的SRR位为隐性,标准帧的RTR位为显性,因此标准帧优先。
- 仲裁结束:失败节点自动转为接收状态,不产生错误帧。
仲裁机制对系统设计有直接影响。在动力总成CAN网络中,发动机控制报文(如转速、扭矩)通常分配低ID值(高优先级),而车身舒适性报文(如车窗、空调)分配高ID值(低优先级)。这种设计确保了关键安全报文在总线拥塞时仍能及时传输。
2.3 错误检测与处理机制
CAN协议设计了五层错误检测机制,使得错误帧能够被所有节点快速识别并丢弃。这五层机制分别是:位错误、填充错误、CRC错误、格式错误和应答错误。任何节点只要检测到其中一种错误,就会立即发送错误帧,终止当前报文的传输。
位错误发生在发送节点在发送位的同时回读总线电平,如果回读值与发送值不一致(在仲裁场和应答场除外),则判定为位错误。填充错误是指接收节点在连续6个相同电平的位时检测到填充规则被破坏。CRC错误是接收节点计算出的CRC序列与发送节点不一致。格式错误发生在固定格式字段(如CRC界定符、ACK界定符、EOF)出现非法电平。应答错误是发送节点在ACK槽位未检测到显性位,说明没有节点成功接收。
每个CAN节点维护两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。错误处理遵循以下规则:
- 检测到错误时,错误主动节点发送6个显性位的错误帧,错误被动节点发送6个隐性位的错误帧。
- 发送节点检测到错误,TEC加8;接收节点检测到错误,REC加1。
- 节点成功发送或接收报文时,相应计数器减1。
- 当TEC或REC超过127时,节点进入错误被动状态,只能发送隐性错误帧。
- 当TEC超过255时,节点进入总线关闭状态,完全脱离总线通信。
| 错误类型 | 检测节点 | 错误计数器变化 | 处理方式 |
|---|---|---|---|
| 位错误 | 发送节点 | TEC +8 | 立即发送错误帧 |
| 填充错误 | 所有接收节点 | REC +1 | 发送错误帧 |
| CRC错误 | 所有接收节点 | REC +1 | 发送错误帧 |
| 格式错误 | 所有接收节点 | REC +1 | 发送错误帧 |
| 应答错误 | 发送节点 | TEC +8 | 发送错误帧 |
错误处理机制保证了CAN总线在恶劣电磁环境下的可靠性。即使某个节点出现故障,它也会被自动隔离,不会影响其他节点的正常通信。这种分布式错误管理机制是CAN协议相较于其他现场总线的重要优势。
2.4 案例拆解:总线错误帧风暴的诊断与修复
在某商用车项目开发阶段,测试团队在整车电磁兼容(EMC)试验中发现了严重的CAN通信异常。现象是:当发动机启动且空调压缩机开启时,仪表盘上的CAN报文刷新率明显下降,部分报警灯误亮。使用CANoe记录总线数据后发现,错误帧占比高达总流量的35%,且错误帧类型以位错误和CRC错误为主。
初步分析:错误帧集中在发动机ECU(ID=0x0C0)和车身控制器BCM(ID=0x1A0)之间的通信。通过对比不同工况下的错误帧分布,发现错误帧数量与空调压缩机的启停状态强相关。进一步检查发现,空调压缩机的驱动电机为无刷直流电机(BLDC),其PWM控制频率为20kHz,该频率的谐波分量恰好落在CAN总线信号的频带范围内。
关键数据:在空调开启时,CAN_H对地噪声峰峰值从正常的200mV增加到1.2V,CAN_L对地噪声从180mV增加到1.0V。差分信号虽然仍能保持约2V的摆幅,但共模噪声已经超出了CAN收发器的共模抑制范围(通常为±12V,但高频噪声下性能下降)。
解决步骤:
- 在空调压缩机驱动器的电源线上增加共模电感(型号:TDK ACM7060-701-2P),抑制20kHz及其谐波的传导发射。
- 在CAN总线两端(发动机ECU和BCM处)的终端电阻(120Ω)旁并联一个4.7nF的电容,构成低通滤波器,衰减高频噪声。
- 将CAN总线线束与空调压缩机动力线束的间距从原来的50mm增加到150mm,减少耦合路径。
- 在BCM的CAN收发器电源引脚(VCC)与地之间增加100nF+10μF的去耦电容组合。
结果对比:整改后,错误帧占比从35%降至0.2%以下,仪表盘报文刷新率恢复正常,报警灯误亮现象消失。在后续的EMC复测中,CAN通信在整车辐射抗扰测试(ISO 11452-2)中表现稳定。
复盘经验:CAN总线错误帧风暴往往不是协议配置问题,而是物理层电磁兼容问题。在开发阶段就应该将CAN线束的屏蔽、接地和布线规范纳入设计评审。对于大功率负载(如空调压缩机、雨刮电机),其驱动器的EMC设计必须提前验证。此外,错误帧的分布特征(哪些ID受影响、错误类型比例)是定位干扰源的重要线索。