1. 课程导入
各位工程师朋友,咱们直接进入正题。CAN FD 这玩意儿,说白了就是 CAN 2.0 的「涡轮增压版」。我在 2015 年第一次接触它时,心里还嘀咕:好好的 CAN 2.0 用了二十年,干嘛要折腾?直到后来做 OTA 升级,才发现传统 CAN 那 1Mbps 的速率和 8 字节的数据场,真是让人抓狂。
1.1 CAN FD 与 CAN 2.0 的核心区别
先看一张对比表,把差异摆到桌面上:
| 对比项 | CAN 2.0 (经典 CAN) | CAN FD |
|---|---|---|
| 最大数据场长度 | 8 字节 | 64 字节 |
| 最高位速率 | 1 Mbps | 数据段最高 8 Mbps(典型 2-5 Mbps) |
| 位速率切换 | 不支持 | 支持(仲裁段与数据段不同速率) |
| 帧格式 | 标准帧/扩展帧 | 兼容 CAN 2.0,新增 FDF 标志位 |
| CRC 校验 | 15 位 CRC | 17 位或 21 位 CRC(根据数据长度) |
| 向后兼容 | - | 物理层兼容,需控制器支持 |
关键点:CAN FD 不是推翻重来,而是在 CAN 2.0 的骨架上做了「外科手术式」升级。你现有的 CAN 收发器、线束、终端电阻基本都能复用。
1.2 CAN FD 帧结构详解
咱们拿一个标准数据帧来拆解。我个人习惯把 CAN FD 帧分成三个区段来看:
- 仲裁段:和 CAN 2.0 完全一样,包含 SOF、ID、RTR/IDE 等。这里速率不能高,因为多个节点要在这里竞争总线。
- 控制段:关键变化来了!新增了 FDF(FD Format)标志位和 BRS(Bit Rate Switch)位。FDF=1 表示这是 CAN FD 帧,BRS=1 表示后面要切高速。
- 数据段:从 8 字节扩展到 64 字节,而且可以跑高速。数据场长度编码(DLC)也变了,后面细说。
嗯,这里要注意:CAN FD 帧的 EOF(帧结束) 和 ACK 槽 必须回到仲裁段的速率。为什么?因为接收节点要用这个速率来确认,保证兼容性。
避坑指南:我曾经在一个项目中,把 BRS 位设置错了,导致数据段速率切换后,某个老旧的收发器直接罢工。后来排查了三天才发现——那款收发器标称支持 CAN FD,但实际最高只能到 2 Mbps。所以选型时一定要看收发器的 CAN FD 能力等级。
1.3 位速率切换(BRS)机制
为什么需要位速率切换?你想想看,仲裁段如果跑 5 Mbps,多个节点同时发数据时,位仲裁根本来不及稳定。所以 CAN FD 的设计思路是:
- 仲裁段:用标准速率(比如 500 kbps),保证总线仲裁可靠。
- 数据段:切到高速(比如 2-5 Mbps),快速把 64 字节倒腾完。
- CRC 段 + ACK:切回标准速率,让所有节点都能正确校验和应答。
这个切换动作由发送节点在 BRS 位发出信号。接收节点检测到 BRS=1 后,立即调整自己的采样点。我建议你在设计时,把仲裁段和数据段的 采样点位置 都算清楚,否则容易出位错误。
警告:位速率切换不是瞬间完成的!收发器需要一定的 PLL 锁定时间。如果数据段太短(比如只有 1-2 字节),切换开销可能抵消掉高速优势。我一般建议数据段至少 8 字节以上才启用 BRS。
1.4 数据场长度编码(DLC)
CAN 2.0 的 DLC 是 4 位,只能表示 0-8。CAN FD 虽然还是 4 位,但编码方式变了:
| DLC 值 | CAN 2.0 数据长度 | CAN FD 数据长度 |
|---|---|---|
| 0-8 | 0-8 字节 | 0-8 字节 |
| 9 | 8 字节 | 12 字节 |
| 10 | 8 字节 | 16 字节 |
| 11 | 8 字节 | 20 字节 |
| 12 | 8 字节 | 24 字节 |
| 13 | 8 字节 | 32 字节 |
| 14 | 8 字节 | 48 字节 |
| 15 | 8 字节 | 64 字节 |
看到了吗?DLC=9 到 15 在 CAN 2.0 里都是 8 字节,但在 CAN FD 里对应 12、16、20... 直到 64 字节。这个设计是为了兼容旧控制器——老设备看到 DLC=9 时,仍然按 8 字节处理,不会报错。
实战经验:我在做 Bootloader 升级时,通常把 DLC 固定为 15(64 字节)。因为升级文件动辄几百 KB,用 64 字节一包,比 8 字节快了整整 8 倍。但要注意:数据场越大,CRC 校验越重要。CAN FD 对超过 16 字节的数据使用 21 位 CRC,安全性比 CAN 2.0 高一个量级。
1.5 CAN FD 帧结构全景图
下面这张 SVG 图把整个帧结构串起来了,建议你保存下来对照着看:
1.6 实际应用中的考量
讲完理论,说点实在的。你在做 Bootloader 升级时,CAN FD 能带来什么好处?
- 单帧数据量提升 8 倍:64 字节 vs 8 字节,意味着同样大小的固件,传输次数减少到 1/8。
- 有效吞吐量翻几番:数据段跑 2-5 Mbps,加上 64 字节载荷,实际有效速率能到 1.5-3 Mbps。相比 CAN 2.0 的 500 kbps(实际有效约 300 kbps),快了 5-10 倍。
- CRC 更安全:21 位 CRC 对 64 字节数据的检错能力,远强于 15 位 CRC 对 8 字节。升级过程中少了很多「校验失败重传」的烦恼。
注意:别以为换了 CAN FD 就万事大吉。我遇到过一个问题:某款 MCU 的 CAN FD 控制器在数据段跑 5 Mbps 时,采样点设置不当,导致连续丢帧。后来把采样点从 75% 调到 80%,问题解决。所以 位时序配置 是 CAN FD 调试中的硬骨头,后面章节我会专门讲。