2、CAN FD协议详解:CAN FD帧结构、数据场长度编码、位速率切换、CRC优化、与传统CAN的兼容性
2.1 为什么需要CAN FD?
说实话,传统CAN总线在汽车上跑了三十多年,确实有点力不从心了。
我记得2016年做第一个ADAS项目时,光一个前置摄像头的数据量就把CAN总线撑爆了。那时候我就在想,能不能在保留CAN物理层的基础上,把速度提上去?
嗯,CAN FD就是干这个的。它全称是CAN with Flexible Data-Rate,说白了就是「能变速的CAN」。
核心改进点:
- 数据场长度从8字节扩展到64字节
- 数据段支持最高8Mbps的位速率
- CRC校验从15位升级到17位或21位
- 完全兼容传统CAN 2.0网络
2.2 CAN FD帧结构详解
先看帧结构。CAN FD的帧和传统CAN很像,但多了几个关键位。
| 字段 | 传统CAN | CAN FD |
|---|---|---|
| SOF | 1位 | 1位 |
| ID + RTR + IDE | 12/32位 | 12/32位 |
| FDF (FD格式标志) | 无 | 1位 (显性→隐性) |
| BRS (位速率切换) | 无 | 1位 |
| ESI (错误状态指示) | 无 | 1位 |
| DLC | 4位 | 4位 (编码方式不同) |
| 数据场 | 0-8字节 | 0-64字节 |
| CRC | 15位 | 17位/21位 |
| ACK + EOF | 2+7位 | 2+7位 |
这里有个关键点:FDF位。传统CAN的保留位r1是显性(0),而CAN FD把FDF设为隐性(1)。
你想想看,这意味着什么?传统CAN节点看到FDF=1,就知道这不是自己的菜,直接忽略。这就是兼容性的底层逻辑。
2.3 数据场长度编码——DLC的「变形」
传统CAN的DLC只有4位,最大编码15,但数据场最多8字节。说白了就是浪费了7个编码值。
CAN FD不一样。它重新定义了DLC的映射关系:
| DLC值 | 传统CAN数据长度 | CAN FD数据长度 |
|---|---|---|
| 0-8 | 0-8字节 | 0-8字节 |
| 9 | 8字节 | 12字节 |
| 10 | 8字节 | 16字节 |
| 11 | 8字节 | 20字节 |
| 12 | 8字节 | 24字节 |
| 13 | 8字节 | 32字节 |
| 14 | 8字节 | 48字节 |
| 15 | 8字节 | 64字节 |
我的经验:实际项目中,我建议尽量用8、16、32、64这种对齐的字节数。为什么?因为DMA传输时,非对齐长度会多一次内存拷贝。我在一个网关项目里吃过这个亏,后来全部改成对齐长度,CPU占用率降了12%。
2.4 位速率切换——BRS位的妙用
这是CAN FD最核心的改进。传统CAN整个帧都是一个速率,比如500kbps。CAN FD可以做到:仲裁段用500kbps,数据段飙到2Mbps甚至8Mbps。
为什么会这样?因为仲裁段需要多个节点同时发送,必须用低速保证位同步。但数据段只有一个节点在发,完全可以跑高速。
BRS位就是开关:
- BRS = 0(显性):不切换,全程低速
- BRS = 1(隐性):数据段切换到高速
切换时机很讲究。从BRS位之后,一直到CRC分隔符之前,都是高速区。我习惯把这个区域叫做「快车道」。
注意:不是所有CAN FD控制器都支持8Mbps。我见过一些国产芯片,标称支持CAN FD,实际跑到4Mbps就开始丢位了。选型时一定要实测。
2.5 CRC优化——更安全的校验
传统CAN的15位CRC,对于8字节数据来说够用。但CAN FD数据场最长64字节,15位CRC的汉明距离就不够了。
CAN FD用了两种CRC:
- 17位CRC:数据场≤16字节时使用
- 21位CRC:数据场>16字节时使用
而且,CRC的计算范围也变了。传统CAN只算数据场,CAN FD把DLC、数据场、填充位都算进去了。
嗯,这里有个坑。我曾经在一个项目中,发现CAN FD节点偶尔会报CRC错误。查了两天才发现,是收发器的振铃导致采样点偏移,CRC算出来不对。后来在收发器输出端加了RC滤波,问题解决。
2.6 与传统CAN的兼容性
兼容性分两种情况:
- CAN FD节点发,传统CAN节点收:传统CAN节点看到FDF=1,知道不是自己的帧,直接忽略。但要注意,如果总线上有传统CAN节点,CAN FD节点不能发超过8字节的数据,否则传统节点会报错。
- 传统CAN节点发,CAN FD节点收:完全没问题。CAN FD节点向下兼容,能正常接收传统CAN帧。
混合网络设计原则:
- 同一个网段内,要么全是CAN FD,要么全是传统CAN
- 如果必须混用,用网关隔离
- CAN FD节点发传统CAN帧时,DLC不能超过8
我记得有一次,客户要求在一个网段里混用CAN FD和传统CAN节点。我坚决反对,最后用了一个双通道网关解决。为什么?因为传统CAN节点看到CAN FD帧的BRS位切换时,可能会因为位时序差异导致总线错误。这不是理论问题,是我在实验室里亲眼见过的。
2.7 实际项目中的配置建议
最后,给几个实战参数:
| 场景 | 仲裁段速率 | 数据段速率 | 数据场长度 |
|---|---|---|---|
| 动力CAN | 500kbps | 2Mbps | 8-16字节 |
| ADAS传感器 | 500kbps | 4Mbps | 32-64字节 |
| 诊断通信 | 500kbps | 1Mbps | 64字节 |
我的建议:刚开始用CAN FD时,别急着上8Mbps。先从2Mbps开始,跑一个月看看误码率。我见过太多团队一上来就飙高速,结果EMC测试过不了,又降回低速重来。
好了,CAN FD的核心内容就这些。下一章我们讲以太网,那个更刺激——100BASE-T1和1000BASE-T1,带宽直接上两个数量级。