3. CAN FD 协议:从经典 CAN 到 CAN FD 的进化

好,咱们今天聊聊 CAN FD。说实话,我刚入行那会儿,车载网络还是经典 CAN 的天下。后来项目越做越大,数据量蹭蹭往上涨,经典 CAN 那 1 Mbps 的速率和 8 字节的数据场,真的有点捉襟见肘了。CAN FD 就是为解决这个问题来的。

3.1 CAN FD 与经典 CAN 的区别

经典 CAN 和 CAN FD,说白了就是「够用」和「好用」的区别。我最早接触 CAN FD 是在一个 ADAS 项目上,雷达和摄像头的数据量特别大,经典 CAN 根本塞不下。那时候我就意识到,升级是必然的。

它们最核心的区别,我列了个表,你一看就明白:

对比项 经典 CAN CAN FD
最大数据场 8 字节 64 字节
最大速率 1 Mbps 数据段最高 8 Mbps(典型 2-5 Mbps)
帧格式 标准帧 / 扩展帧 兼容经典帧 + FD 帧(新增 FDF 标志位)
CRC 校验 15 位 CRC 17 位(数据场 ≤16 字节)或 21 位(数据场 >16 字节)
总线利用率 较低 更高,单帧可传更多数据
向后兼容 — 与经典 CAN 节点可共存于同一总线

嗯,这里要注意:CAN FD 的物理层和经典 CAN 是一样的,所以它们可以混跑。但前提是,你得保证总线上没有节点因为收到 FD 帧而报错。我见过有人直接把 CAN FD 节点怼到经典 CAN 总线上,结果一堆错误帧——那场面,挺尴尬的。

3.2 CAN FD 帧结构

CAN FD 的帧结构,其实是在经典 CAN 帧的基础上「打了几个补丁」。咱们拿数据帧来说,它的结构是这样的:

SOF + 11/29位ID + 控制场 + 数据场 + CRC + ACK + EOF

关键变化在控制场。经典 CAN 的控制场里有个 DLC(数据长度码),CAN FD 把它扩展了,可以表示 0-64 字节。另外,控制场里多了两个标志位:

  • FDF(FD Format):1 表示这是 CAN FD 帧,0 表示经典 CAN 帧。
  • BRS(Bit Rate Switch):1 表示数据段切换到高速率,0 表示全程用仲裁段速率。

我个人习惯把 CAN FD 帧分成两段来看:

  1. 仲裁段:速率跟经典 CAN 一样(比如 500 kbps),负责总线仲裁。
  2. 数据段:如果 BRS=1,就切换到高速率(比如 2 Mbps),传完数据再切回来。

这样做的好处很明显——仲裁的时候大家慢慢来,不丢报文;传数据的时候一脚油门踩到底,效率拉满。

核心要点:CAN FD 帧的兼容性设计,让新旧节点可以在同一条总线上共存。新节点发 FD 帧时,老节点会忽略数据段的高速部分,只认到 CRC 为止。但前提是 CRC 不能算错,否则老节点会主动报错。

3.3 CAN FD 速率提升原理

为什么 CAN FD 能跑得更快?说白了,就是「分段变速」。经典 CAN 整条报文都是一个速率,而 CAN FD 只在数据段加速。

你想想看,仲裁段为什么要慢?因为多个节点同时发数据时,需要靠 ID 的显隐性电平来决出胜负。如果速率太高,信号在总线上的传播延迟会导致仲裁失败。所以仲裁段必须慢,这是物理定律决定的。

但数据段不一样。数据段只有一个节点在发,没有竞争。这时候把速率提上去,只要收发器能扛住,总线长度和终端匹配没问题,就能跑得飞快。

我举个例子:

  • 仲裁段:500 kbps,用于 ID 仲裁和帧起始。
  • 数据段:2 Mbps,用于传输数据场和 CRC。

这样一来,同样传 64 字节数据,CAN FD 比经典 CAN 快了不止 8 倍。我在一个动力域的项目里实测过,总线负载从 70% 直接降到了 20% 以下,效果非常明显。

避坑指南:我曾经在一个项目里把数据段速率设到了 5 Mbps,结果发现总线长度超过 40 米后,信号反射严重,误码率飙升。后来老老实实降到 2 Mbps,问题解决。所以速率不是越高越好,得看你的总线拓扑和线束质量。

3.4 CAN FD 应用场景

CAN FD 不是万能的,但在某些场景下,它确实比经典 CAN 和以太网都更合适。我根据自己的项目经验,总结了几个典型场景:

应用场景 为什么用 CAN FD 我遇到的案例
ADAS 传感器数据 雷达、摄像头需要传输大量目标列表和点云数据,经典 CAN 8 字节根本不够用 一个前向雷达项目,用 CAN FD 单帧传 48 字节目标数据,总线负载降低 60%
动力域控 发动机、变速箱、电池管理需要高实时性的大数据交互 BMS 用 CAN FD 上报电芯电压和温度,一帧搞定原来 6 帧的内容
OTA 升级 刷写 Bootloader 或应用软件时,数据量动辄几 MB,CAN FD 能大幅缩短刷写时间 某次 OTA 刷写,用 CAN FD 比经典 CAN 快了 4 倍,从 20 分钟缩到 5 分钟
车载诊断(UDS on CAN FD) 诊断请求和响应通常包含大量数据,CAN FD 可以减少多帧传输的握手开销 用 CAN FD 做 34/36 服务(数据上传/下载),效率提升非常明显

不过我也得提醒一句:CAN FD 不是用来替代以太网的。如果你需要传输视频流或大容量日志,还是老老实实上以太网。CAN FD 的定位,是「经典 CAN 的升级版」,而不是「以太网的替代品」。

重要提醒:CAN FD 的物理层虽然和经典 CAN 一样,但收发器有讲究。老式的 TJA1040 不支持 CAN FD 的高速数据段,必须用 TJA1044 或 TJA1463 这类支持 CAN FD 的收发器。我曾经因为没注意这个细节,焊完板子才发现通信不稳定,白白浪费了两天时间。

3.5 CAN FD 知识结构图

下面这张图,我把 CAN FD 的核心知识点串起来了。你可以把它当作本章的「思维导图」:

CAN FD 知识结构图 CAN FD 协议 与经典 CAN 区别 帧结构 速率提升原理 应用场景 数据场 64 字节 速率最高 8 Mbps CRC 增强 FDF 标志位 BRS 标志位 DLC 扩展 分段变速 仲裁段低速 数据段高速 ADAS 传感器 动力域控 OTA 升级 UDS 诊断 CAN FD 是经典 CAN 的进化,不是革命 兼容性设计让新旧节点可以平滑过渡

嗯,这张图基本把 CAN FD 的骨架画出来了。你顺着中心节点往外看,四个方向分别对应我们刚才讲的四个知识点。每个知识点下面又拆了 3-4 个关键子项,这样复习的时候一目了然。