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 帧分成两段来看:
- 仲裁段:速率跟经典 CAN 一样(比如 500 kbps),负责总线仲裁。
- 数据段:如果 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 的骨架画出来了。你顺着中心节点往外看,四个方向分别对应我们刚才讲的四个知识点。每个知识点下面又拆了 3-4 个关键子项,这样复习的时候一目了然。