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聪明在哪儿呢?它把帧分成了两段:

  1. 仲裁段:从SOF到BRS位之前,用标准速率(通常1Mbps或500kbps)。这个阶段完成ID仲裁,保证总线访问的公平性。
  2. 数据段:从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网络。到时候我会分享一些我在产线调试时踩过的坑,保证实用。