1. CAN FD 概述

大家好,我是老周。干 CAN 总线这行快十五年了,从最初的 CAN 2.0 一路摸爬滚打到今天。说起 CAN FD,我印象最深的是 2017 年帮一家车厂做 BMS 项目——那会儿电池包里的数据量已经撑爆了经典 CAN 的 8 字节,硬着头皮上 CAN FD,结果踩了不少坑。这一章咱们先打好基础,聊聊 CAN FD 到底是怎么来的、强在哪、用在哪儿。

1.1 从 CAN 到 CAN FD:一条不得不走的路

经典 CAN(ISO 11898-2,也叫 CAN 2.0)从 90 年代初就统治着汽车通信。它可靠、实时,但有两个硬伤:数据场最多 8 字节,总线速率最高 1 Mbps。十几年前够用,可随着 ADAS、智能座舱出现,一辆车上的节点从几十个涨到上百个,一条动力 CAN 线上光 DBC 信号就几千个——8 字节的包不够塞了,速率也跑不动了。

2012 年,博世发布了 CAN FD(CAN with Flexible Data-Rate)的初版规范。我个人习惯把这看作“CAN 的 Turbo 版”:保留了 CAN 的核心机制——非破坏性仲裁、错误检测、远程帧——但把数据场扩展到 64 字节,并且在数据段切换 更高速率(最高 8 Mbps 甚至更高)。

为什么叫“Flexible”?因为它可以动态调整速率:仲裁段用 500 kbps 保证兼容性,数据段飙到 2 Mbps 以上。我在一个项目中用过 5 Mbps 的 CAN FD(实际上是 500 kbps / 5 Mbps 切换),那酸爽——眼图差点没过,后来靠调整振铃和终端电阻才搞定。

2015 年,ISO 发布了 ISO 11898-1:2015,正式把 CAN FD 纳入国际标准。之后 Bosch 和 NXP 又搞了 CAN FD 的“增强版” CAN FD Light,但主流还是 ISO 标准。嗯,这里要注意:CAN FD 的物理层和 CAN 2.0 完全一样,所以你可以在现有的 CAN 硬件上升级控制器就行——这也是它快速铺开的原因。

指标CAN 2.0CAN FD
最大数据长度8 字节64 字节
仲裁段速率固定(如 500 kbps)固定(与 CAN 2.0 相同)
数据段速率同仲裁段可变(最高 8+ Mbps)
帧格式标准/扩展 ID标准/扩展 ID + BRS + ESI
CRC15 位17 位(≤16 字节数据)或 21 位(≥16 字节数据)
向后兼容—同一物理总线可混合运行

1.2 CAN FD 的技术优势:不只是快

大家最直观的感受是“速率翻倍、数据包变大”,但我觉得 CAN FD 真正的杀手锏是这三个:

  • 载荷提升:一次传输最多 64 字节,对于 ADAS 摄像头、激光雷达这类需要批量传数据的节点,帧数直接降到原来的 1/8,总线负载率大幅降低。
  • 实时性优化:因为数据段跑得更快,同样 8 字节数据在 CAN FD 上的传输时间比 CAN 2.0 更短——高优先级消息的响应延时更小。我曾经在一个测试中发现,把 OTA 升级报文换成 CAN FD 后,整包下载时间缩短了 60%。
  • 向后兼容不丢老资产:CAN FD 控制器可以发送和接收经典 CAN 帧,老节点不需要换。你想想看,一条新总线同时跑着旧 BMS 的 CAN 2.0 报文和新域控的 CAN FD 报文,这得多省事。

关键指标对比(实战视角):

一条 500 kbps 的经典 CAN 总线,满载约 8000 帧/秒(8 字节数据)。换成 CAN FD(仲裁 500 kbps,数据 2 Mbps,64 字节),理论吞吐量可以到 约 10,000 字节/毫秒,是原来的 8 倍以上。当然,实际要考虑帧间隔、 stuffing bit 等损耗,但提升非常明显。

1.3 应用场景:从汽车到工业

说几个我亲自跟过的项目场景:

  • 汽车电子(大头):ADAS 摄像头(每帧 64 字节的 YUV 数据)、域控制器之间的高速数据交换、OTA 升级(一个 30 MB 的固件包用 CAN FD 能在 3 分钟内传完,经典 CAN 得 30 多分钟)。
  • 工业伺服驱动:多轴机器人需要同步位置、速度、力矩信息,64 字节足够把三个轴的数据塞进一帧,省掉四分之一的帧数。
  • 医疗影像:超声探头的原始数据流用 CAN FD 传输,比 CAN 2.0 少一半帧,还能保持实时。

我的避坑指南:我曾经在一条混合总线上同时运行 CAN 2.0 和 CAN FD 节点,结果发现有老节点会误把 CAN FD 帧的 BRS 位当成错误位而发送主动错误标志。后来给所有 CAN 2.0 节点加了硬件滤波器,只接收标准帧——这事告诉我:混搭时要确认老节点固件是否真的“忽略” CAN FD 帧,光说“支持混合”是不够的。

1.4 CAN FD 帧结构——为后续分析打底

要理解 EMI 干扰下为什么会出现某种错误帧,得先看清 CAN FD 帧长什么样。下图是经典 CAN 帧和 CAN FD 帧的结构对比,重点看多了哪几个位:

CAN FD 帧结构概览(与经典 CAN 对比) 经典 CAN 帧: SOF 仲裁段 (11/29 bits) 控制段 (6 bits) 数据段 (0~8 bytes) CRC (15 bits) ACK + EOF CAN FD 帧: SOF 仲裁段 (11/29 bits) 控制段 (8 bits) 数据段 (0~64 bytes) CRC (17/21 bits) ACK + EOF 控制段多了 BRS、ESI 两位 BRS=1 : 数据段高速率

从图上能看出,CAN FD 的控制段多了两个位:BRS(Bit Rate Switch)和 ESI(Error State Indicator)。BRS 为 1 时,数据段和 CRC 段使用高速率;ESI 表示发送节点的错误状态。哦对了,CRC 也升级了——数据小于等于 16 字节用 17 位 CRC,超过 16 字节用 21 位 CRC。这层改动直接影响了 EMI 干扰下的错误检测能力,后面的章节我们会拿示波器实际抓波形来看。

警告:CAN FD 帧在数据段切换高速率时,总线上的信号边沿更陡,振铃和反射更容易出现。如果 PCB 布局没做好,一个 EMI 脉冲就可能让 BRS 位误翻转,导致接收节点把整个帧当成错误。我在一个充电桩项目上就遇到过这种问题——后来加了共模扼流圈才压住。