第一章 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(起始帧) 开始,一路往后看:

核心区别点: CAN FD 在控制场里塞进了 BRS(位速率切换)和 ESI(错误状态指示)两个位,把 DLC(数据长度码)从 4 位扩展到可以表示 0~64 字节,同时改用了更强的 CRC(循环冗余校验)多项式。

下面这个 SVG 图是我手画的 CAN FD 帧结构,重点标出了 BRS 位的位置和速率切换的关系:

CAN FD 帧结构及 BRS 位切换示意 SOF 仲裁场 控制场 BRS ESI 数据场 (0~64字节) CRC场 ACK EOF BRS=1 → 数据段高速 ⚠️ 速率切换规则 仲裁段始终使用标称速率(如 500kbps),BRS=1 后数据段切换到 2Mbps~8Mbps。 这样既能兼容 CAN 2.0 的仲裁机制,又能把大数据量用高速传输。

从图里可以直观看到:控制场里多了 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%,问题就解决了。

💡 项目经验: 多数 CAN FD 控制器允许为仲裁段和数据段分别配置位时序寄存器(TSEG1、TSEG2、SJW)。建议先算好两套参数,写死在初始化代码里,避免运行时动态切换带来的时序抖动。

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 上摔过的跤

第一章快结束时,我整理几个最坑的地方,你遇到了可以直接过来查:

⚠️ 陷阱 1:硬件不支持 CAN FD 却发了 FD 帧
我曾经在一个项目里把 MCU 里的 CAN 控制器当普通 CAN 用,结果固件里配了 FD 帧格式发送。对方是一块工业控制器,根本听不懂 FD 帧里的额外位,导致整个网络陷入总线关闭。后来我养成了习惯:选型时一定确认 CAN 控制器和收发器都明确标注 "CAN FD ready"。
⚠️ 陷阱 2:BRS 位误设导致通信中断
有一次我在测试中把 BRS 位始终置为 1,但数据段速率配置错误(写成了 10 Mbps,而收发器最高只支持 5 Mbps)。结果总线接收节点在采样时频繁报错,总线错误计数器蹭蹭上涨。解决方法是:先跑 2 Mbps 数据段,等时序稳定后再逐步提升。
⚠️ 陷阱 3:采样点位置没单独调
前面提到了,仲裁段和数据段要用不同的位时序参数。如果你只配了一组参数给仲裁段,数据段高速运行时采样点可能落在位边缘。我建议用 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 收发器无法处理高速段。