4. CAN FD 协议:从 CAN 2.0 到 CAN FD 的进化

CAN FD 这玩意儿,说白了就是 CAN 2.0 的升级版。我最早接触它是在 2015 年,那时候刚有样片,大家还不太敢用。现在?新车型基本都标配了。

为什么要有 CAN FD?因为传统 CAN 2.0 的 8 字节数据场和 1 Mbps 速率,在 OTA 升级、大数据诊断面前,实在太慢了。你想想看,一个固件包几十兆,用 CAN 2.0 传,得等到天荒地老。

4.1 CAN FD 与 CAN 2.0 的核心区别

先看一张对比表,一目了然:

对比项 CAN 2.0 CAN FD
数据场长度 最多 8 字节 最多 64 字节
最大速率 1 Mbps 数据段最高 8 Mbps
帧格式 标准帧 / 扩展帧 兼容 CAN 2.0 + FD 特有格式
CRC 校验 15 位 / 17 位 17 位 / 21 位(含填充位)
速率切换 不支持 支持仲裁段与数据段不同速率
向后兼容 — 可与 CAN 2.0 节点共存

关键点:CAN FD 不是取代 CAN 2.0,而是扩展。同一个总线上,CAN FD 节点和 CAN 2.0 节点可以混跑。但 CAN FD 节点发 FD 帧时,CAN 2.0 节点会报错——所以实际部署时,要么全换 FD,要么加网关隔离。

4.2 CAN FD 数据帧结构

CAN FD 的帧结构,跟 CAN 2.0 很像,但多了几个关键位。我画了张图,帮你理清结构:

CAN FD 数据帧结构 SOF 仲裁段 ID + RTR + IDE 控制段 DLC + EDL + BRS + ESI 数据段 0~64 字节 CRC 段 17/21 位 + 填充 ACK 2 位 EOF 各字段说明: • SOF(Start of Frame):1 位显性位,同步所有节点。 • 仲裁段:11 位 ID(标准)或 29 位 ID(扩展),决定优先级。 • 控制段:DLC 表示数据长度(0~64 字节),EDL=1 表示 FD 帧,BRS=1 表示速率切换。 • 数据段:0~64 字节,CAN FD 的核心优势所在。 • CRC 段:17 位(数据≤16 字节)或 21 位(数据>16 字节),含填充位计数。 • ACK 段:发送方发隐性位,接收方拉显性位确认。 • EOF:7 位隐性位,帧结束标志。 • 注意:CAN FD 帧的 EDL 位为 1,CAN 2.0 节点看到后会触发错误帧——所以混跑时要小心。

我的经验:刚开始看 CAN FD 帧时,最容易搞混的是 BRS 位和 EDL 位。EDL 决定是不是 FD 帧,BRS 决定要不要切速率。我见过有人把 BRS 置 1 但没切速率,结果接收方 CRC 算不对,直接丢帧。

4.3 CAN FD 速率切换机制

速率切换,是 CAN FD 最亮眼的功能。为什么能切?因为仲裁段需要所有节点一起参与,必须用统一的速率(通常是 500 kbps)。但数据段只有发送方和接收方在通信,其他节点只听不发,所以可以跑得更快。

切换时机就在 BRS 位之后:

  1. 仲裁段:所有节点以标准速率(如 500 kbps)参与总线仲裁。
  2. BRS 位:发送方将 BRS 置 1,通知所有节点:我要切速率了。
  3. 数据段 + CRC 段:切换到高速率(如 2 Mbps 或 5 Mbps)传输。
  4. CRC 分隔符:切回标准速率,完成 ACK 和 EOF。

速率切换的约束:

  • 高速率不能超过收发器的物理能力。常见的 CAN FD 收发器支持 2 Mbps、5 Mbps,少数支持 8 Mbps。
  • 总线长度越长,高速率越受限。5 Mbps 时,总线长度建议不超过 10 米。
  • 所有节点必须支持 CAN FD,否则 BRS=1 的帧会被 CAN 2.0 节点当成错误帧。

我遇到过一个问题:某项目把速率切到 8 Mbps,结果总线只有 3 米长,但线束质量差,信号反射严重,导致数据段 CRC 错误率高达 30%。后来降到 5 Mbps,问题解决。所以速率不是越高越好,得看物理层质量。

4.4 CAN FD 应用场景

CAN FD 不是为所有场景设计的。我个人觉得,以下场景最适合:

场景 为什么用 CAN FD 典型数据量
OTA 远程升级 64 字节/帧,速率 2~5 Mbps,比 CAN 2.0 快 5~10 倍 几十 MB 到几百 MB
ADAS 传感器数据 雷达、摄像头原始数据量大,8 字节不够用 每帧 32~64 字节
UDS 诊断 多字节响应(如读取 DTC 快照)不再需要多帧传输 单帧最多 64 字节
日志记录与大数据采集 车辆运行数据批量上传,减少总线负载 每帧 64 字节,连续发送
网关路由 CAN FD 到 CAN FD 或 CAN FD 到 CAN 2.0 的转换 视源端而定

避坑指南:我曾经在 OTA 项目中,直接用 CAN FD 传完整固件包,结果发现 ECU 的 Flash 写入速度跟不上总线速率。数据发过去了,但 ECU 来不及写,导致丢包重传。后来加了流控机制,每发 10 帧等一个 ACK。所以 CAN FD 快是快,但接收端处理能力也得跟上。

4.5 向后兼容与混跑策略

实际项目中,很少能一次性把所有节点都换成 CAN FD。混跑是常态。怎么混?

  • 方案一:纯 CAN FD 帧 + 网关隔离。CAN FD 节点之间用 FD 帧通信,CAN 2.0 节点之间用经典帧,中间加网关转换。
  • 方案二:混合帧类型。同一个总线上,CAN FD 节点发 FD 帧时,CAN 2.0 节点必须能识别并忽略。但 CAN 2.0 节点看到 EDL=1 会报错,所以这个方案只适用于所有节点都支持 CAN FD 的情况。
  • 方案三:只发经典帧。所有节点都配置为只发 CAN 2.0 帧,但 CAN FD 节点可以收 FD 帧。这样兼容性最好,但浪费了 FD 的带宽优势。

我个人推荐方案一。虽然多了网关成本,但隔离了故障域,调试也方便。方案二看着简单,实际坑很多——我见过一个项目,CAN 2.0 节点没做错误帧过滤,结果 FD 帧一出现,总线就被错误帧淹没了。

测试建议:混跑环境下,一定要用 CAN FD 分析仪抓总线波形。重点看 BRS 位切换时刻的波形质量——有没有毛刺、振铃、幅值不足。这些物理层问题,在高速率下会被放大。

4.6 小结

CAN FD 不是颠覆性技术,它是在 CAN 2.0 基础上做了精准的增强。64 字节数据场 + 速率切换,解决了车载网络带宽不足的核心痛点。但引入它也带来了新的挑战:物理层质量要求更高、兼容性需要仔细设计、测试工具也得升级。

嗯,这一章的内容就到这里。记住一句话:CAN FD 是工具,不是银弹。用对场景,事半功倍;用错场景,反而添乱。