4、CAN FD协议:CAN FD与经典CAN的区别、CAN FD数据场扩展、CAN FD兼容性设计

好,咱们今天聊聊CAN FD。说实话,我刚入行那会儿,经典CAN还是绝对的主流。但后来随着车上摄像头、雷达、大屏这些东西越来越多,经典CAN那1Mbps的速率和8字节的数据场,真的有点捉襟见肘了。于是CAN FD就应运而生。

CAN FD,全称是CAN with Flexible Data-Rate。说白了,就是给经典CAN打了一针强心剂。它保留了CAN总线那套优秀的仲裁机制,但在数据传输上做了大手术。我个人习惯把CAN FD看作是经典CAN的「性能升级版」,而不是一个全新的协议。

4.1 CAN FD与经典CAN的核心区别

这两者的区别,我总结下来,最核心的就两点:速率可变数据场扩展。其他的都是围绕这两点做的优化。

对比项 经典CAN (Classic CAN) CAN FD
最大数据场长度 8 字节 64 字节
最大传输速率 1 Mbps (固定) 仲裁段1Mbps,数据段最高8Mbps
帧格式 标准帧/扩展帧 兼容经典帧,新增FD帧格式
CRC校验 15位 CRC 17位/21位 CRC (更强)
位填充规则 标准填充 数据场部分采用改进填充
硬件兼容性 所有CAN节点 需CAN FD控制器,部分兼容经典CAN

你看这个表,最直观的就是数据场从8字节跳到了64字节。为什么会这样?因为现在一个ADAS摄像头的一帧数据,动不动就几十上百字节,用经典CAN你得拆成七八帧甚至更多来发,效率太低了。

另一个关键点是速率。经典CAN的速率是固定的,整个报文从ID到场结束都是一个速率。CAN FD不一样,它在仲裁段(也就是ID和RTR位那部分)还是用经典CAN的速率,比如500kbps。但一旦仲裁赢了,进入数据场,它就会「一脚油门」切换到高速模式,比如2Mbps甚至5Mbps。等数据场发完,再降回原来的速率发CRC和ACK。

核心理解: CAN FD的「灵活」就体现在这里——仲裁用低速保证公平性,数据传输用高速保证吞吐量。这是它最聪明的地方。

4.2 CAN FD数据场扩展详解

数据场从8字节扩展到64字节,这可不是简单地把寄存器改大一点就完事了。它带来了一系列连锁反应。

首先,是DLC编码的变化。 经典CAN里,DLC(数据长度码)用4位表示,最大就是8。CAN FD里,这4位被重新定义了。比如DLC=9,在经典CAN里是非法的,但在CAN FD里,它代表12字节。DLC=15代表64字节。具体的映射关系,我建议你直接查芯片手册,不同厂家可能略有差异,但大方向是一致的。

其次,是CRC校验的增强。 数据量大了,出错的概率也大了。经典CAN的15位CRC在64字节面前有点力不从心。所以CAN FD引入了17位和21位CRC。当数据场长度小于等于16字节时,用17位CRC;大于16字节时,用21位CRC。嗯,这里要注意,CRC的生成多项式也变了,硬件上需要重新实现。

最后,是位填充规则的调整。 经典CAN的位填充规则是每5个相同位插入一个相反位。但在高速数据段,这种填充会引入额外的抖动。CAN FD在数据段采用了「改进的位填充」机制,简单说就是填充的间隔更灵活了,能有效降低EMI(电磁干扰)。

个人经验: 我在调试一个车载网关项目时,遇到过一个问题:CAN FD报文在数据场超过48字节后,偶尔会出现CRC错误。查了很久才发现,是PCB布局上数据线走得太长,导致高速信号反射。后来在终端匹配上做了调整,问题就解决了。所以,上CAN FD,硬件设计一定要跟上,尤其是信号完整性。

4.3 CAN FD兼容性设计

这是实际项目中绕不开的坎。你想想看,一辆车上不可能一夜之间全换成CAN FD节点。经典CAN节点和CAN FD节点必然要共存一段时间。怎么让它们好好相处?

CAN FD协议在设计之初就考虑到了这一点。它定义了几种兼容模式:

  • 经典CAN节点发送,CAN FD节点接收: 这没问题。CAN FD控制器完全向下兼容,能正常接收经典CAN报文。
  • CAN FD节点发送,经典CAN节点接收: 这就有问题了。经典CAN节点不认识CAN FD帧格式,会直接报错。怎么办?

解决方案是:CAN FD节点在发送时,必须知道对方是不是CAN FD节点。 如果对方是经典CAN节点,CAN FD节点就不能发送FD帧,只能发送经典CAN帧。这通常通过一个叫「BRS (Bit Rate Switch)」的标志位来控制。

具体来说,CAN FD帧里有一个EDL位(Extended Data Length),用来区分是经典帧还是FD帧。经典CAN节点看到EDL位为显性(0),就知道这是经典帧。如果EDL位为隐性(1),经典CAN节点就会认为这是一个错误帧,然后主动发送错误标志。

避坑指南: 我曾经在一个项目中,把CAN FD节点的速率配成了2Mbps,但忘了检查总线上的一个老式传感器节点。结果一上电,那个传感器节点疯狂报错,整个总线都被拉死了。后来我加了一个网关,专门做速率和协议的转换,才解决了问题。所以,千万不要假设所有节点都支持CAN FD,一定要做兼容性测试。

在实际的网关设计中,我建议的做法是:

  1. 划分域: 把支持CAN FD的节点放在同一个域内,比如ADAS域、信息娱乐域。这些域内部跑高速CAN FD。
  2. 网关做桥接: 网关在CAN FD域和经典CAN域之间做路由。当CAN FD域的报文需要转发到经典CAN域时,网关负责把64字节的数据拆分成多个8字节的经典CAN帧,并重新封装。
  3. 配置管理: 在系统设计阶段,就要明确每个节点的能力。通过诊断服务或者网络管理报文,让CAN FD节点知道哪些节点是「老古董」,从而自动降级为经典CAN模式。

最后,说一个我个人觉得挺有意思的点。CAN FD的物理层和经典CAN是完全一样的,都是差分双绞线。这意味着你不需要换线束,只需要换控制器和收发器。对于整车厂来说,这大大降低了升级成本。但要注意,速率越高,对线束的阻抗匹配和终端电阻的要求也越高。我曾经见过一个案例,因为用了劣质的线束,导致2Mbps的CAN FD通信误码率高达1%。所以,别省那点线束钱。

好了,关于CAN FD的核心区别、数据场扩展和兼容性设计,我就讲这么多。下一节,我们会深入网关的路由表设计,看看这些CAN FD报文到底是怎么在网关里被转发和处理的。