1. CAN FD 协议概述:从经典 CAN 到 CAN FD 的进化

大家好,我是你们的嵌入式系统讲师。今天咱们来聊聊 CAN FD 协议。说实话,我在汽车电子这行摸爬滚打了十几年,从最早的 CAN 2.0 一直做到现在的 CAN FD,亲眼见证了这条总线的进化史。

你可能会问:CAN 不是用得挺好的吗?为什么还要搞个 CAN FD?嗯,这个问题问到了点子上。咱们先看看经典 CAN 的痛点,你就明白了。

1.1 CAN 与 CAN FD 的核心区别

经典 CAN(CAN 2.0)从 1986 年诞生到现在,已经跑了快 40 年。它最大的问题是:速度上不去,数据量也上不去。CAN 2.0 最高只能跑到 1 Mbps,一帧数据最多带 8 个字节。这在当年够用,但现在?你想想看,一辆高端汽车上有上百个 ECU,OTA 升级、ADAS 数据、高精地图……8 个字节?塞牙缝都不够。

CAN FD 就是来解决这个问题的。FD 全称是 Flexible Data-rate,说白了就是「灵活数据速率」。它保留了 CAN 的物理层和仲裁机制,但在数据段把速率提了上去,同时把数据长度也翻了 8 倍。

一句话总结:CAN FD 向下兼容 CAN,但跑得更快、装得更多。

我直接给你列个对比表,一目了然:

对比项 经典 CAN (CAN 2.0) CAN FD
最大数据速率 1 Mbps 最高 8 Mbps(数据段)
每帧最大数据长度 8 字节 64 字节
帧格式 标准帧 / 扩展帧 标准帧 / 扩展帧 + FD 帧
CRC 校验 15 位 CRC 17 位 / 21 位 CRC(更强)
兼容性 — 向下兼容 CAN 2.0
典型应用 传统动力、车身控制 ADAS、OTA、域控制器

看到没?数据段速率从 1 Mbps 飙到 8 Mbps,数据长度从 8 字节跳到 64 字节。这意味着什么?原来要发 8 帧才能传完的数据,现在一帧搞定。原来要等 1 毫秒才能发完的报文,现在 125 微秒就完事。

我的经验:我在做某款国产新能源车的 BMS(电池管理系统)时,经典 CAN 传电池单体电压数据,一帧只能传 4 个电芯的数据,64 个电芯要发 16 帧。换成 CAN FD 后,一帧 64 字节直接搞定,总线负载从 45% 降到了 12%。这个差距,谁用谁知道。

1.2 CAN FD 的诞生背景

为什么会有 CAN FD?说白了,是被需求逼出来的。

2010 年左右,汽车电子开始爆发。ADAS 摄像头、激光雷达、高精度地图、OTA 远程升级……这些新功能对总线带宽的需求呈指数级增长。经典 CAN 的 1 Mbps / 8 字节,已经成了瓶颈。

我记得当时有个项目,客户要求在一条 CAN 总线上同时跑 3 路摄像头数据、2 路雷达数据和 1 路 GPS 数据。我算了一下总线负载,直接爆表——超过 90%。这根本没法用。最后只能拆成 3 条 CAN 总线,成本翻了三倍。

2012 年,博世和几个主流芯片厂商(NXP、TI、ST)坐在一起,开始讨论下一代 CAN 总线。他们定了几条目标:

  • 速度要快:数据段至少 5 Mbps 以上
  • 数据要多:每帧至少 64 字节
  • 要兼容:不能把现有的 CAN 设备全废了
  • 要可靠:CRC 校验必须加强

2015 年,CAN FD 正式成为 ISO 11898-1:2015 标准。从此,汽车电子进入 CAN FD 时代。

注意:CAN FD 虽然向下兼容 CAN 2.0,但并不是所有 CAN 控制器都支持 CAN FD。选型时一定要确认芯片是否支持 CAN FD 模式。我曾经踩过这个坑——买了 1000 片 STM32F103,结果发现它只支持经典 CAN,不支持 CAN FD。后来全换成了 STM32G4 系列,多花了好几万。

1.3 CAN FD 的技术优势

咱们来细数一下 CAN FD 到底强在哪:

  1. 带宽翻倍:数据段速率最高 8 Mbps,仲裁段仍用 500 kbps 或 1 Mbps,保证兼容性。
  2. 有效载荷提升 8 倍:从 8 字节到 64 字节,减少帧数量,降低总线负载。
  3. 更强的 CRC 校验:17 位 CRC(数据长度 ≤ 16 字节)或 21 位 CRC(数据长度 20-64 字节),误检率更低。
  4. 向后兼容:CAN FD 节点可以和经典 CAN 节点共存于同一条总线。
  5. 更低的延迟:同样数据量,CAN FD 需要的帧数更少,传输延迟更低。

我画了一张图,帮你理解 CAN FD 的帧结构变化:

CAN FD 帧结构 vs 经典 CAN 帧结构 经典 CAN 帧: 仲裁段 控制 数据段 (0-8B) CRC ACK 速率:全程 1 Mbps(固定) 数据长度:最多 8 字节 CAN FD 帧: 仲裁段 控制 数据段 (0-64B) CRC ACK 速率:仲裁段 500kbps / 1 Mbps,数据段最高 8 Mbps 数据长度:最多 64 字节 速率提升 ↑ 数据量提升 ↑ 关键变化: 1. 控制段新增 EDL 位(扩展数据长度标志),用于区分 CAN FD 帧和经典 CAN 帧 2. 数据段速率可切换(BRS 位控制),仲裁段保持原速率保证兼容性

1.4 CAN FD 的应用场景

CAN FD 现在主要用在两个领域:汽车电子和工业控制。我分别说说。

汽车电子领域

  • ADAS 系统:摄像头、毫米波雷达、激光雷达的数据量都很大。CAN FD 可以承载这些传感器数据,减少总线负载。
  • OTA 远程升级:整车 OTA 需要传输大量固件数据。CAN FD 的 64 字节/帧,比经典 CAN 快 8 倍。
  • 域控制器通信:智能座舱域、自动驾驶域、车身域之间的高速数据交换。
  • BMS 电池管理:电池单体电压、温度、SOC 等数据,一帧就能传完。
避坑指南:我曾经在一个 ADAS 项目中,用 CAN FD 传摄像头原始数据。结果发现,虽然 CAN FD 数据段能跑到 8 Mbps,但仲裁段只有 500 kbps。如果总线上有大量高优先级报文,数据段的速率优势会被仲裁段的等待时间抵消。所以,CAN FD 不是万能药,总线设计时还是要做负载分析。

工业控制领域

  • 伺服驱动器:多轴伺服系统的实时控制数据,CAN FD 可以承载更多轴的状态信息。
  • PLC 与远程 IO:分布式 IO 系统的数据采集,一帧可以传更多通道的数据。
  • 机器人关节控制:每个关节的位置、速度、力矩数据,CAN FD 一帧搞定。
  • 工程车辆:挖掘机、起重机等大型设备的传感器数据采集。

我去年帮一家工业机器人公司做控制器升级,原来用经典 CAN 传 6 个关节的数据,每帧只能传 2 个关节,3 帧才能传完。换成 CAN FD 后,一帧 64 字节,6 个关节的数据全塞进去,还富余 16 个字节。总线负载从 60% 降到了 15%。

一句话总结:CAN FD 不是革命,是进化。它保留了 CAN 的可靠性,解决了 CAN 的带宽瓶颈。如果你还在用经典 CAN 做新项目,我建议你认真考虑一下 CAN FD——尤其是数据量大的场景。