CANFD基础:从传统CAN到CANFD的演进之路
说实话,我刚入行那会儿,车载网络还是CAN的天下。那时候觉得CAN总线挺完美的——简单、可靠、实时性好。直到后来做ADAS项目,发现传统CAN越来越力不从心。数据量大了,带宽不够用;诊断需求多了,报文塞不下。嗯,CANFD就是在这样的背景下应运而生的。
CANFD协议演进:为什么我们需要它?
传统CAN诞生于上世纪80年代,最高速率1Mbps,单帧数据最多8字节。你想想看,现在一个高精地图更新包动不动就几百KB,用CAN传得传到猴年马月?
我在2016年参与过一个L2级自动驾驶项目,那时候用CAN传输摄像头标定参数,一个参数表要拆成几十帧发,接收端还得拼回去。调试起来那叫一个痛苦。后来换了CANFD,单帧能传64字节,效率直接翻了好几倍。
CANFD(CAN with Flexible Data-Rate)是CAN协议的升级版,由Bosch在2012年提出,2015年成为国际标准(ISO 11898-1:2015)。它最大的特点就是——灵活。说白了,就是在保留CAN总线物理层和仲裁机制的基础上,把数据段跑得更快,把数据场装得更多。
核心演进点:
- 传统CAN:最高1Mbps,数据场8字节
- CANFD:仲裁段最高1Mbps,数据段最高8Mbps,数据场64字节
- 向后兼容:CANFD节点可以和CAN节点共存于同一总线
与传统CAN的区别:不只是快那么简单
很多人以为CANFD就是CAN的「加速版」,其实没那么简单。我做个对比你就明白了。
| 对比项 | 传统CAN | CANFD |
|---|---|---|
| 最大速率 | 1 Mbps | 8 Mbps(数据段) |
| 数据场长度 | 8 字节 | 64 字节 |
| 帧格式 | 标准帧/扩展帧 | 标准帧/扩展帧 + FDF标志 |
| CRC校验 | 15位/17位 | 17位/21位(支持更长的数据场) |
| 位填充规则 | 固定 | 数据段可关闭位填充 |
| 兼容性 | — | 可与CAN节点共存 |
这里有个坑我要提醒你。CANFD虽然兼容CAN,但不是说随便接就能用。我曾经在一个项目中,把CANFD节点和老的CAN节点混接,结果发现CANFD发送高速数据时,老CAN节点直接报错。为什么?因为老CAN节点不认识FDF标志位,以为帧格式错了。
避坑指南:我曾经在混接网络中忘记配置CANFD节点的「速率切换」策略,导致数据段速率过高,老CAN节点无法同步。解决办法是:在混合网络中,CANFD节点必须支持「CANFD Passive」模式,即只接收CANFD帧但不发送高速数据。
CANFD帧结构详解:每个位都有讲究
CANFD的帧结构和传统CAN很像,但多了几个关键位。我习惯把帧结构分成三部分看:仲裁段、控制段、数据段。
标准帧结构(11位ID):
SOF + 11位ID + RTR + IDE + r0 + BRS + ESI + DLC + 数据场 + CRC + ACK + EOF
扩展帧结构(29位ID):
SOF + 11位ID + SRR + IDE + 18位ID + RTR + r1 + r0 + BRS + ESI + DLC + 数据场 + CRC + ACK + EOF
这里重点说几个CANFD新增的位:
- FDF(Flexible Data Format):藏在保留位里。传统CAN的r0位在CANFD中变成了FDF位。FDF=0表示传统CAN帧,FDF=1表示CANFD帧。嗯,这就是兼容性的关键。
- BRS(Bit Rate Switch):速率切换位。BRS=1时,从BRS位之后切换到高速模式;BRS=0时,全程用仲裁段速率。我个人习惯在数据场超过4字节时开启BRS,否则没必要。
- ESI(Error State Indicator):错误状态指示位。发送节点处于主动错误状态时ESI=0,被动错误状态时ESI=1。这个位在诊断中很有用,我经常用它来快速定位总线上的问题节点。
小技巧:我在调试CANFD网络时,会先用传统CAN模式发送一帧,确认物理层没问题,再切换到CANFD模式。这样能快速区分是硬件问题还是协议问题。
CANFD速率提升原理:为什么能跑那么快?
你可能会问:同样是两根线,为什么CANFD能跑到8Mbps,而传统CAN只能到1Mbps?
原因其实不复杂。传统CAN为了保证仲裁的可靠性,整个帧都用同一个速率。仲裁嘛,需要所有节点在同一时刻比较ID优先级,速率太高信号反射严重,仲裁就乱套了。
CANFD聪明在哪儿呢?它把帧分成了两段:
- 仲裁段:从SOF到BRS位之前,用标准速率(通常1Mbps或500kbps)。这个阶段完成ID仲裁,保证总线访问的公平性。
- 数据段:从BRS位之后到CRC之前,切换到高速模式(最高8Mbps)。这个阶段没有仲裁,只有数据收发,所以可以跑得飞快。
说白了,就是「该慢的时候慢,该快的时候快」。我打个比方:就像高速公路上的收费站,进站时大家排队(仲裁段),出了收费站就可以撒欢跑(数据段)。
速率提升还离不开另一个技术——取消位填充。传统CAN为了保证时钟同步,每5个相同位就要插入一个相反位。CANFD在数据段可以关闭位填充,这样有效数据传输率就上去了。
实际效果:以8字节数据为例:
- 传统CAN:1Mbps下,传输8字节约需130μs
- CANFD:仲裁段1Mbps + 数据段5Mbps,传输8字节约需70μs
- CANFD:仲裁段1Mbps + 数据段5Mbps,传输64字节约需150μs
你看,传8字节快了近一倍,传64字节也只比传统CAN传8字节多花一点点时间。这就是速率提升的价值。
不过要注意,速率不是越高越好。我在一个项目中把数据段速率设到8Mbps,结果线束稍微长一点(超过5米),信号就失真了。后来降到4Mbps才稳定。所以实际项目中,建议根据线束长度和节点数量来选速率,别一味追求快。
嗯,CANFD的基础知识就聊到这儿。下一章我们聊聊CANFD的配置和实战——怎么搭一个能跑起来的CANFD网络。到时候我会分享一些我在产线调试时踩过的坑,保证实用。