第一章 CAN FD 协议基础:帧格式、速率与 CAN 2.0 区别
干这行十几年,我最常被问到的一个问题是:“CAN FD 和普通 CAN 到底差在哪?”说实话,刚接触 CAN FD 那会儿我也一头雾水。那时候项目急着要升级通信带宽,我拿了一堆芯片手册来回翻,最后发现——其实说白了,CAN FD 就是在 CAN 2.0 的框架上打了两个补丁:更长的数据段 + 更快的速率。
但这两个补丁牵一发而动全身,帧格式、位时序、硬件选型全得跟着改。这一章咱们就把地基打牢,把 CAN FD 的帧结构、速率变化和与传统 CAN 的区别彻底捋清楚。
1.1 为什么需要 CAN FD?—— 一个真实场景
先讲个我自己的踩坑经历。几年前做一台新能源车的 BMS 项目,CAN 2.0 每帧只能带 8 字节数据,电池包状态要拆成几十帧来回发,总线负载飙到 80% 以上,还经常丢帧。我当时在示波器上盯着波形,头都大了。
后来换成 CAN FD,一帧就能扔进去 64 字节,数据段还能跑 5 Mbps,整个通信瞬间清爽了。你想想看,假设同样要传 64 字节:
- CAN 2.0:拆 8 帧,每帧 125 µs(1 Mbps),共 1 ms
- CAN FD:1 帧,数据段 5 Mbps,总时长约 200 µs
效率差了 5 倍。这就是为什么现在汽车、工业通信、机器人领域都在往 CAN FD 迁移。
1.2 CAN FD 帧格式 —— 到底改了哪些字段?
CAN FD 的帧结构和 CAN 2.0 很像,但多了几个关键位。咱们从 SOF(起始帧) 开始,一路往后看:
BRS(位速率切换)和 ESI(错误状态指示)两个位,把 DLC(数据长度码)从 4 位扩展到可以表示 0~64 字节,同时改用了更强的 CRC(循环冗余校验)多项式。
下面这个 SVG 图是我手画的 CAN FD 帧结构,重点标出了 BRS 位的位置和速率切换的关系:
从图里可以直观看到:控制场里多了 BRS 和 ESI 两个位,数据场的宽度也从原来的 8 字节扩展到最大 64 字节。另外 CRC 场在数据超过 16 字节时改用 21 位 CRC (CAN FD 无填充位校验),安全性更高。
1.3 速率与位时序 —— 为什么能跑两套速率?
我个人习惯把 CAN FD 的通信拆成两段来看:
- 仲裁段:与 CAN 2.0 完全兼容,使用标称位速率(常见 500kbps、1Mbps)。
- 数据段:一旦 BRS 位被判为显性,从此之后所有位(包括数据场、CRC、ACK delimiter)都按高速位时序运行,直到 CRC delimiter 结束再切换回来。
为什么要这么设计?因为仲裁需要位同步和优先级判定, 如果一上来就跑 8Mbps,总线上的位时间很短,容差小,很容易因为节点晶振偏差或信号反射导致仲裁出错。所以先慢速仲裁,赢家独占总线后再加速传数据。
我曾经在调试一款外置 CAN FD 收发器时,忽略了 采样点 的配置。仲裁段采样点设成了 80%,数据段却沿用同一参数,结果高速段总是采样错误。后来我把数据段采样点调到 70%,问题就解决了。
1.4 CAN 2.0 vs CAN FD 横向对比
下面这张表是我在培训新同事时常用来总结的,把关键差异摆在一起看特别清楚:
| 对比项 | CAN 2.0 (经典CAN) | CAN FD |
|---|---|---|
| 最大数据长度 | 8 字节 | 64 字节 |
| 位速率 | 固定速率(≤1 Mbps) | 仲裁段 ≤1 Mbps,数据段 ≤8 Mbps (部分芯片支持更高) |
| 帧控制位 | 无 BRS/ESI | 有 BRS 和 ESI |
| DLC 编码 | 4 位对应 0~8 字节 | 4 位但经过二次映射可表示 12、16、20…64 字节 |
| CRC 多项式 | 15 位 CRC (用于 ≤8 字节) | 17 位 CRC (≤16 字节) 或 21 位 CRC (>16 字节) |
| 位填充 | 从 SOF 到 CRC 都填充 | 数据段不填充(减少填充位干扰,提高带宽) |
| 物理层兼容性 | 标准 ISO 11898-2 | 需 CAN FD 收发器(如 TJA1044GT、SN65HVD255) |
你可以看到,帧格式上最直观的变化就是 控制场和 CRC 场的复杂度增加了,但换来的是传输效率飞跃。
1.5 避坑指南 —— 那些年我在 CAN FD 上摔过的跤
第一章快结束时,我整理几个最坑的地方,你遇到了可以直接过来查:
我曾经在一个项目里把 MCU 里的 CAN 控制器当普通 CAN 用,结果固件里配了 FD 帧格式发送。对方是一块工业控制器,根本听不懂 FD 帧里的额外位,导致整个网络陷入总线关闭。后来我养成了习惯:选型时一定确认 CAN 控制器和收发器都明确标注 "CAN FD ready"。
有一次我在测试中把 BRS 位始终置为 1,但数据段速率配置错误(写成了 10 Mbps,而收发器最高只支持 5 Mbps)。结果总线接收节点在采样时频繁报错,总线错误计数器蹭蹭上涨。解决方法是:先跑 2 Mbps 数据段,等时序稳定后再逐步提升。
前面提到了,仲裁段和数据段要用不同的位时序参数。如果你只配了一组参数给仲裁段,数据段高速运行时采样点可能落在位边缘。我建议用 CAN 分析仪抓波形,分别测量两段 bit time 的实际长度,再用公式
采样点 = (TSEG1 + 1) / (TSEG1 + TSEG2 + 1) 验证。
1.6 本章要点速记
- CAN FD 帧比 CAN 2.0 多了 BRS(速率切换)和 ESI(错误指示)两个位。
- 数据段长度可从 8 字节扩展到 64 字节,DLC 映射规则变了。
- 仲裁段和数据段可以使用不同速率,BRS=1 时切换。
- CRC 多项式根据数据长度选用 17 位或 21 位,安全裕度更大。
- 物理层必须搭配 CAN FD 收发器,传统 CAN 收发器无法处理高速段。