2. CAN协议标准(CAN 2.0A/B,CAN FD)归纳总结

做CAN总线开发,绕不开协议标准。我最早接触的是CAN 2.0A,后来发现汽车电子里基本都用2.0B。近几年CAN FD越来越多,刚开始还觉得“不就是加长数据段嘛”,真正调过几次才知道里面坑不少。先理清几个核心概念,免得后面踩坑。

2.1 CAN 2.0A 与 CAN 2.0B

CAN 2.0A和2.0B本质上是一套协议,区别在于报文ID的长度。2.0A只支持11位标识符(标准帧),2.0B兼容11位之外还支持29位标识符(扩展帧)。说白了,早期芯片资源紧张,11位够用就只做2.0A,后来挂的节点多了,才把ID扩展到29位。

我遇到过一些老设备,控制器只支持2.0A,你发个扩展帧过去,它直接丢帧或者报错。这就很头疼。所以多节点混用时,兼容性必须提前确认。

特性 CAN 2.0A CAN 2.0B(被动) CAN 2.0B(主动)
标识符长度 11位 11位(可忽略扩展帧) 11位/29位
扩展帧处理 不收不发 接收但不应答 正常收发
典型应用 简单传感器 旧款ECU 现代汽车、工控
小经验:设计新系统尽量用2.0B主动型控制器,兼容性最好。我记得有次把2.0A的收发器装在29位网络里,结果一直出错误帧,查了两天才发现是控制器不认扩展帧。

2.2 标准帧与扩展帧格式

两种帧结构几乎一样,只有仲裁场不同。标准帧的ID占11位,紧跟RTR位和IDE位。扩展帧把ID拆成两部分:基础ID(11位)和扩展ID(18位),中间用SRR和IDE隔开。你想想看,为什么这样做?为了和标准帧兼容的同时扩展地址空间。

// 标准帧(11位 ID)
| SOF | 11位 ID | RTR | IDE | r0 | DLC | 0…8 Byte Data | CRC | ACK | EOF |

// 扩展帧(29位 ID)
| SOF | 11位 Base ID | SRR | IDE | 18位 Ext ID | RTR | r1 | r0 | DLC | Data | CRC | ACK | EOF |

注意IDE位的作用:标准帧里IDE=0(显性),扩展帧里IDE=1(隐性)。仲裁时,标准帧优先级更高。我调试过一个多主站系统,就是因为某个节点发了扩展帧,结果仲裁输给标准帧,导致发送延迟,后来改配了优先级才解决。

2.3 CAN FD 核心变化

CAN FD(Flexible Data-Rate)是BOSCH在2012年推出的升级版,主要解决两个痛点:数据载荷太小(8字节),和总线速率上不去(最高1 Mbps)。

  • 数据段长度:从8字节扩展为最多64字节。这个提升很实在,比如刷写固件,原来要拆几十帧,现在一帧搞定。
  • 可变速率:仲裁段仍用原速率(比如500kbps),数据段可以切换到更高速度(2Mbps、5Mbps甚至8Mbps)。这么做是因为仲裁段需要所有节点同步,数据段则由发送节点独占,可以快一些。
  • 新的CRC算法:帧长了,CRC也得升级。CAN FD引入17位和21位CRC,安全系数更高。

我曾经把CAN FD节点接到一个传统CAN网络上,数据段速率调到2Mbps,结果对方节点直接退出总线。因为传统CAN控制器根本不认识FD帧的额外位和高速率,会当成错误帧处理。所以混用时要设置好支持CAN FD的收发器和控制器。

关键差异一览:

项目 传统CAN (2.0A/B) CAN FD
最大数据长度 8字节 64字节
数据段速率 固定(同仲裁速率) 可切换(最高8Mbps)
CRC长度 15位 17/21位
BRS(Bit Rate Switch) 无此位 有,控制速率切换
ESI(Error State Indicator) 无 有,指示发送节点错误状态

2.4 CAN FD 帧结构变化

CAN FD在控制场里多了一个BRS位和一个ESI位,DLC编码也变了(用来表示超过8字节的长度)。举个例子:DLC=9~15对应12、16、20、24、32、48、64字节,不是线性的,需要查表。

// CAN FD 帧(标准ID为例)
| SOF | 11位 ID | RTR | IDE | r0 | BRS | ESI | DLC | 0…64 Byte Data | CRC | CRC_Delim | ACK | EOF |

BRS位决定是否切换速率:BRS=1(隐性)表示进入高速数据段,BRS=0(显性)则全程用原速率。CRC场之后必须切回原速率以完成ACK和EOF。这个切换时刻很关键,采样点偏差容易被总线错误。

⚠ 踩坑提醒:我曾经在一条CAN FD总线上混用了不同厂家的收发器,结果数据段速率较高时出现大量CRC错误。后来发现是有些收发器的环路延迟跟不上高速切换。建议统一使用支持CAN FD的收发器,且走线尽量短。

2.5 协议演进脉络

为了让你直观理解这几个版本的关系,我画了一张图。把CAN 2.0A、2.0B、CAN FD放在一起,对比它们的帧结构和兼容性。

CAN协议标准演进与帧结构对比 CAN 2.0A 标准帧 11位ID 数据8字节 固定速率 ≤1Mbps 无扩展帧 CAN 2.0B 标准/扩展帧 11或29位ID 数据8字节 兼容2.0A CAN FD 数据≤64字节 可变速率 新CRC 向后兼容 帧结构关键差异 标准帧 (2.0A/B): SOF 11位ID RTR IDE DLC 0-8B数据 CRC 扩展帧 (2.0B): SOF Base ID SRR IDE Ext ID RTR DLC 0-8B数据 CRC CAN FD帧: SOF Base ID BRS ESI DLC 0-64B数据 CRC(17/21) 说明:CAN FD在控制场增加了BRS和ESI,DLC支持更大数据长度,CRC使用17或21位。速率在BRS后切换。

这张图从左到右展示了CAN版本的演进,底部的帧结构对比能帮你一眼看出差异。特别注意CAN FD多了BRS和ESI,数据段可以很长。实际项目中,如果你需要传输大数据包(比如固件升级、高精度定位数据),CAN FD是最好的选择。

2.6 实际选型建议

我个人习惯这么判断:

  • 如果系统里只有几个传感器,数据量小,选CAN 2.0B就够,成本低。
  • 如果涉及OTA升级或大量诊断数据,强烈建议上CAN FD,节省时间不说,还能减少总线负载。
  • 注意检查芯片手册,有些MCU宣称支持CAN FD,但收发器可能不支持高速(比如最高只有2Mbps),实际只能降到1Mbps用。我踩过这个坑,买了5Mbps的收发器才发现MCU的CAN FD模块只支持到2Mbps。

一点心得:做CAN FD设计时,先确定数据段目标速率,然后根据线缆长度和节点数算好采样点,再选收发器。不要盲目追求高速度,稳定性更重要。

2.7 总结