1. CAN FD协议基础:CAN与CAN FD的区别、CAN FD帧结构、数据场长度编码(DLC)、位速率切换(BRS)与错误状态指示(ESI)

各位同学,咱们今天聊聊CAN FD协议的基础。说实话,我最早接触CAN FD的时候,心里也犯嘀咕——这不就是CAN的升级版吗?后来踩了几个坑才明白,事情没那么简单。

1.1 CAN与CAN FD:到底差在哪?

先说说最直观的区别。传统CAN,最大数据场只有8个字节。你想想看,现在一辆车上光ECU就几十个,传输个固件升级包,8字节一包得发到猴年马月去?

CAN FD直接把数据场干到了64字节。嗯,8倍提升。我在做某主机厂的BMS项目时,就遇到过CAN总线负载率飙到80%以上的情况。换成CAN FD后,负载率直接降到30%以下。说白了,就是同样的数据量,需要的帧数少了,总线自然就轻松了。

还有一个关键区别——速率。传统CAN最高1Mbps,CAN FD在数据段可以切换到更高的速率,比如2Mbps、5Mbps甚至8Mbps。我个人的习惯是,仲裁段用500kbps,数据段用2Mbps,这样兼容性和性能都能兼顾。

核心差异总结:

  • 数据场长度:CAN最大8字节,CAN FD最大64字节
  • 传输速率:CAN固定速率(最高1Mbps),CAN FD支持双速率(仲裁段+数据段)
  • 帧格式:CAN FD新增了BRS位和ESI位
  • 兼容性:CAN FD控制器可以收发CAN帧,但CAN控制器无法处理CAN FD帧

注意:我曾经在项目里犯过一个低级错误——把CAN FD节点和普通CAN节点混在同一总线上,结果CAN节点看到BRS位为1的帧直接报错。记住,混装时要确保CAN FD节点发送的是兼容CAN格式的帧(即BRS=0)。

1.2 CAN FD帧结构:多出来的那几位

CAN FD的帧结构和CAN大体相似,但多了几个关键位。咱们以标准帧为例,看看数据帧长什么样。

字段 CAN CAN FD 说明
SOF 1位 1位 帧起始,都一样
ID 11位/29位 11位/29位 标识符,没变
RTR/IDE 各1位 各1位 远程帧和扩展标识符
EDL 1位 显性=CAN帧,隐性=CAN FD帧
BRS 1位 显性=不切换速率,隐性=切换高速率
ESI 1位 显性=主动错误,隐性=被动错误
DLC 4位 4位 数据长度编码,编码方式不同
Data 0-8字节 0-64字节 数据场
CRC 15位 17位/21位 CRC校验,长度取决于数据场
ACK/EOF 各2位/7位 各2位/7位 应答和帧结束,没变

你看,关键就是EDL、BRS、ESI这三个位。EDL位告诉接收方:嘿,我这是CAN FD帧,别用CAN那套来解析我。BRS位则说:数据段我要飙车了,你准备好切换速率。

1.3 数据场长度编码(DLC):别被4位骗了

DLC还是4位,但编码方式变了。传统CAN里,DLC值直接等于数据字节数,0-8。CAN FD里,DLC值0-8对应0-8字节,但9-15对应的是12、16、20、24、32、48、64字节。

为什么会这样?说白了,4位二进制最多表示16种状态,但CAN FD支持的数据长度有9种(0-8、12、16、20、24、32、48、64)。所以得用映射表。

DLC值 CAN数据长度(字节) CAN FD数据长度(字节)
0-80-80-8
9812
10816
11820
12824
13832
14848
15864

避坑指南:我曾经在移植协议栈时,直接用了CAN的DLC解码函数来处理CAN FD帧。结果DLC=9时,CAN解码出8字节,但实际CAN FD帧里有12字节。嗯,数据直接错位了。所以写代码时一定要区分帧类型,别偷懒。

1.4 位速率切换(BRS):双速率怎么玩?

BRS位是CAN FD最实用的特性之一。仲裁段用标准速率(比如500kbps),数据段切换到高速率(比如2Mbps)。为什么这么设计?

你想想看,仲裁段需要所有节点参与总线仲裁,速率太高的话,信号传播延迟会导致仲裁失败。但数据段只有发送方和接收方在通信,速率可以提上去。

我个人的经验是,BRS位的切换时机很关键。从仲裁段切换到数据段时,需要留出足够的同步时间。一般建议在BRS位之后插入一个位的同步段。有些芯片会自动处理,但有些需要你在配置时手动设置。

速率切换流程:

  1. 仲裁段:标准速率(如500kbps),所有节点参与
  2. BRS位:发送方置为隐性,通知接收方准备切换
  3. 数据段:切换到高速率(如2Mbps),发送方和接收方通信
  4. CRC段:仍使用高速率
  5. ACK段:切换回标准速率,所有节点参与应答

注意:不是所有CAN FD控制器都支持BRS切换。有些老芯片虽然标称支持CAN FD,但只能工作在固定速率模式。选型时一定要看数据手册里有没有提到「BRS support」。

1.5 错误状态指示(ESI):节点健康状态一目了然

ESI位是CAN FD新增的错误状态指示位。传统CAN里,节点错误状态只能通过错误计数器来间接判断。CAN FD直接在帧里告诉你:我现在的错误状态是什么。

ESI位的含义很简单:

  • 显性(0):发送节点处于主动错误状态(Error Active)
  • 隐性(1):发送节点处于被动错误状态(Error Passive)

嗯,这里要注意,ESI位只在数据帧里有效。远程帧里ESI位是保留位,固定为显性。

我在调试一个多节点系统时,就靠ESI位快速定位了问题节点。当时总线上时不时出现错误帧,我抓了总线日志一看,某个节点的ESI位一直是隐性。查了它的错误计数器,已经超过127了。说白了,这个节点已经处于被动错误状态,随时可能进入Bus Off。后来换了它的收发器,问题就解决了。

实用技巧:在诊断工具里,可以专门监控ESI位的变化。如果某个节点的ESI位频繁从显性切换到隐性,说明它的通信环境有问题,可能是线束接触不良、终端电阻匹配不对,或者受到了电磁干扰。

1.6 小结

这一章咱们把CAN FD的基础过了一遍。说白了,CAN FD就是在CAN的基础上做了三件事:数据场变大、速率可切换、状态可指示。但别小看这三点,它们带来的变化是革命性的。

下一章,咱们会深入CAN FD的物理层,聊聊位时序和采样点配置。嗯,那才是真正考验工程师功底的地方。