3. CAN FD协议:CAN FD与CAN的区别、CAN FD帧结构、数据场长度、传输速率、应用场景
好,咱们今天聊聊CAN FD。说实话,我刚入行那会儿,CAN总线还是绝对的主流。但后来做车载项目,发现传统CAN越来越吃力——尤其是现在车上那些OTA升级、大数据量诊断,动不动就几百个字节的数据包,CAN那8字节的数据场,真的不够用。
嗯,CAN FD就是来解决这个痛点的。它全称是CAN with Flexible Data-Rate,说白了就是“能灵活变速的CAN”。我最早接触它是在一个Tier 1的网关项目里,当时客户要求支持高速诊断,传统CAN根本跑不动,换了CAN FD之后,效率直接翻了好几倍。
3.1 CAN FD与CAN的区别
很多人问我,CAN FD和CAN到底差在哪?我一般会从三个核心维度去讲:
- 数据场长度不同:传统CAN最多8字节,CAN FD一口气能到64字节。你想想看,以前传一个完整的UDS诊断响应,可能要拆成七八帧,现在一帧搞定。
- 传输速率不同:CAN FD最牛的地方在于“双速率”。仲裁段还是用原来的速率(比如500kbps),但数据段可以飙到2Mbps甚至更高。为什么这么设计?因为仲裁段需要所有节点同步,速率不能太高;但数据段是点对点传输,可以放开跑。
- 帧格式不同:CAN FD引入了新的DLC编码方式,还有额外的控制位。这个后面细说。
核心区别一句话总结:CAN FD向下兼容CAN,但CAN节点看不懂CAN FD的帧。我在项目中就踩过这个坑——混装的时候,一定要确保所有节点都支持CAN FD,否则会报错。
3.2 CAN FD帧结构
CAN FD的帧结构,其实是在CAN标准帧基础上做了“外科手术式”的改造。我习惯把它分成三个部分来看:
3.2.1 仲裁段
这部分和CAN基本一样,包含SOF、11位ID(或29位扩展ID)、RTR、IDE等。唯一的变化是——CAN FD把RTR位改成了EDL位(Extended Data Length)。EDL=1表示这是CAN FD帧,EDL=0就是传统CAN帧。嗯,这里要注意,CAN FD帧里没有RTR位,所以不支持远程帧。
3.2.2 控制段
这是改动最大的地方。传统CAN的控制段只有IDE、保留位、DLC。CAN FD则变成了:
- EDL:标识CAN FD帧
- BRS:位速率切换标志。BRS=1时,数据段切换到高速模式;BRS=0时,全程用仲裁段速率
- ESI:错误状态指示。发送节点处于主动错误状态时置0,被动错误状态时置1
- DLC:数据长度码。但编码方式变了——传统CAN的DLC只能表示0-8,CAN FD的DLC可以表示0-64,具体映射关系我后面用表格给你看
3.2.3 数据段和CRC段
数据段就是实际传输的数据,最多64字节。CRC段也变了——传统CAN是15位CRC,CAN FD根据数据长度不同,使用17位或21位CRC。为什么?因为数据长了,误码率会上升,需要更强的校验能力。
我个人习惯:在设计CAN FD节点时,一定要把BRS位用好。比如在网关内部转发时,全程用高速模式;但经过线束较长的分支时,我会把BRS置0,用低速模式保证可靠性。这个取舍,我在一个商用车项目里反复调过。
3.3 数据场长度
CAN FD的数据场长度,从0到64字节,步长不是连续的。我整理了一个常用映射表:
| 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 |
你看,DLC=9到15在传统CAN里都表示8字节,但在CAN FD里分别对应12、16、20……一直到64。我曾经在调试一个OTA升级模块时,发现DLC设置错了,导致接收端解析出来的数据全是乱的。后来查了半天,才发现是DLC编码没按CAN FD的规范来。
避坑指南:千万不要在CAN FD帧里设置DLC=9但只发9字节数据!CAN FD的DLC是“容量声明”,不是实际长度。实际数据长度必须严格等于DLC映射的值,否则接收端会认为数据不完整,直接丢帧。我曾经因为这个被客户投诉过……
3.4 传输速率
CAN FD的速率,我一般分两段来说:
- 仲裁段速率:和传统CAN一样,通常用125kbps、250kbps、500kbps。这个速率决定了总线能挂多少个节点,以及总线长度。
- 数据段速率:可以飙到2Mbps、5Mbps,甚至更高(取决于收发器)。但要注意,速率越高,总线长度越短。2Mbps时,总线长度一般不超过10米。
为什么会这样?因为高速率下,信号上升沿和下降沿的时间变短,反射和振铃会更严重。我做过一个实验:在5米长的总线上跑5Mbps,结果误码率高达10%。后来把速率降到2Mbps,一切正常。
我的建议:实际项目中,仲裁段用500kbps,数据段用2Mbps,这是一个比较稳妥的搭配。既能保证总线节点数量,又能提升数据传输效率。
3.5 应用场景
CAN FD到底用在哪些地方?我总结了几类典型场景:
- OTA远程升级:这是最刚需的场景。一个固件包动辄几十MB,用传统CAN传的话,光拆包组包就能把人搞疯。CAN FD一帧64字节,效率提升8倍。
- 高级驾驶辅助系统(ADAS):摄像头、雷达的数据量很大,传统CAN的带宽根本扛不住。CAN FD可以承载更多的传感器数据,而且延迟更低。
- 车载诊断(UDS on CAN FD):诊断仪读取DTC、刷写ECU时,数据量通常很大。CAN FD能显著缩短诊断时间。我记得有一次帮客户优化产线刷写流程,换成CAN FD后,单台ECU的刷写时间从90秒降到了15秒。
- 网关路由:现在的车载网关要处理多个CAN、CAN FD、LIN、以太网之间的数据路由。CAN FD作为中间桥梁,既能兼容传统CAN节点,又能提供更高的吞吐量。
嗯,总的来说,CAN FD不是革命性的技术,但它是在现有CAN生态上最平滑的升级路径。你想想看,不用换线束、不用改物理层,只升级控制器和收发器,就能获得数倍的性能提升——这笔账,怎么算都划算。
最后说一句:如果你现在还在用传统CAN做新项目,我建议直接上CAN FD。成本增加不多,但给未来留足了空间。别像我当年一样,等项目做完了才发现带宽不够,又回头改设计……那滋味,真不好受。