1. CAN FD 技术概述

各位同学,咱们今天聊聊 CAN FD。说实话,我第一次接触 CAN FD 是在一个车载项目上,客户要求把几十个传感器的数据在一条总线上实时传输。经典 CAN 的 8 字节数据场,根本塞不下。那时候我就意识到——CAN 总线必须得进化了。

1.1 CAN FD 的诞生背景

经典 CAN(Classic CAN)从 80 年代用到现在,稳定、可靠,但有个硬伤:数据场只有 8 字节。你想想看,现在一辆智能汽车里,光一个激光雷达的点云数据就几百 KB,8 字节能传什么?

所以 2012 年,Bosch 牵头推出了 CAN FD(CAN with Flexible Data-Rate)。说白了,就是在不改变物理层的前提下,把数据场撑到 64 字节,同时支持可变速率传输。我当年第一次看到 CAN FD 的帧结构时,第一反应是——嗯,这才对嘛。

核心驱动力:

  • 汽车电子系统复杂度爆炸式增长
  • ECU 之间需要交换更多数据(诊断、OTA、传感器融合)
  • 经典 CAN 带宽瓶颈(最高 1 Mbps)
  • 不想推翻现有物理层,兼容性优先

1.2 CAN FD 与经典 CAN 的区别

我习惯把 CAN FD 看作经典 CAN 的「增强版」。两者在物理层上完全兼容——同一个收发器、同一根双绞线。但协议层上,CAN FD 做了几个关键改动。

对比项 经典 CAN CAN FD
数据场长度 最多 8 字节 最多 64 字节
传输速率 固定(最高 1 Mbps) 仲裁段 1 Mbps,数据段最高 8 Mbps
帧格式 标准帧 / 扩展帧 兼容标准帧 / 扩展帧 + FD 标志
CRC 校验 15 位 / 17 位 17 位 / 21 位(数据场更长,需要更强校验)
BRS 位 无 有(切换速率的关键)
ESI 位 无 有(错误状态指示)

这里有个细节我特别想强调:BRS 位(Bit Rate Switch)。它就像个变速杆——在仲裁段用标准速率(保证所有节点都能参与仲裁),一旦拿到总线控制权,立刻切换到高速模式传输数据。我在项目中调试时,经常用示波器抓这个位,看它有没有正确翻转。

避坑指南:我曾经在一个项目中,因为 BRS 位配置错误,导致数据段速率切换失败,整个总线直接报错。后来发现是 STM32 的 CAN FD 外设初始化时,BRS 位默认是关闭的。记得手动开启。

1.3 CAN FD 的核心优势

咱们一条条说。

1.3.1 数据场 64 字节

这是最直观的优势。经典 CAN 一次只能发 8 字节,传一个 32 位的浮点数加个时间戳就满了。CAN FD 一次能塞 64 字节——你可以把 8 个传感器数据打包成一帧发出去。我做过一个测试:同样传输 512 字节数据,经典 CAN 需要 64 帧,CAN FD 只需要 8 帧。总线负载率直接降了 80%。

1.3.2 可变速率

这个设计很聪明。仲裁段用 500 kbps 或 1 Mbps,保证所有节点都能公平竞争总线。数据段可以飙到 2 Mbps、5 Mbps,甚至 8 Mbps。为什么能做到?因为数据段只有发送节点在讲话,没有其他节点参与仲裁,所以可以跑得更快。

我个人的经验是:STM32 的 CAN FD 外设,配合合适的收发器(比如 TJA1044),数据段跑到 5 Mbps 很稳。再往上就需要仔细调终端电阻和线束了。

1.3.3 向后兼容

CAN FD 节点可以和经典 CAN 节点在同一总线上共存。CAN FD 帧里有个 EDL 位(Extended Data Length),经典 CAN 节点看到这个位后,会忽略后面的数据段——不会报错。这个设计太重要了,不然你没法逐步升级现有系统。

注意:虽然物理层兼容,但 CAN FD 节点不能和经典 CAN 节点混用数据段高速模式。如果总线上有经典 CAN 节点,CAN FD 节点必须降速到经典 CAN 的速率。否则经典 CAN 节点会误判位填充规则,直接报错。

1.4 CAN FD 帧结构速览

咱们用一张图把 CAN FD 的帧结构看清楚。这是我自己画的一个简化版,重点标出了与经典 CAN 不同的地方。

CAN FD 数据帧结构(标准标识符) SOF ID (11 bit) + RTR + IDE EDL BRS ESI DLC (4 bit) + 保留位 数据场 (0~64 字节) 高速传输区 CRC (17/21 bit) + 填充位 ACK EOF IFS 仲裁段:标准速率(如 500 kbps) 数据段:高速模式(如 5 Mbps) 图例说明 帧起始 / 数据场 仲裁段 / CRC EDL / ACK BRS / EOF ESI / IFS 控制段(DLC + 保留位)

看到没?EDL、BRS、ESI 这三个位,是经典 CAN 没有的。EDL 告诉接收方「这是一帧 CAN FD 数据」,BRS 告诉接收方「数据段要加速了」,ESI 则指示发送节点的错误状态。

1.5 什么时候该用 CAN FD?

我个人的判断标准很简单:

  • 数据量超过 8 字节——比如传输固件升级包、诊断日志、传感器原始数据
  • 总线负载率超过 50%——经典 CAN 已经快撑不住了
  • 需要更低的延迟——高速数据段能缩短帧传输时间
  • 系统需要向后兼容——现有经典 CAN 节点不用换

我的建议:如果你正在设计一个新项目,而且 MCU 支持 CAN FD(比如 STM32H7、G4、L5 系列),直接上 CAN FD。即使初期只用 8 字节数据场,也为未来升级留了余地。我吃过亏——当年一个项目用了经典 CAN,后来要加 OTA 功能,只能换芯片重做板子,成本翻了三倍。

1.6 本章小结

CAN FD 不是颠覆性的新技术,它是在经典 CAN 基础上做了三个关键升级:64 字节数据场、可变速率、向后兼容。这三个特性让它既能解决当下的带宽瓶颈,又不会让现有系统作废。