2、CAN FD数据帧结构:帧起始、仲裁场、控制场、数据场、CRC场、ACK场、帧结束

好,咱们直接进入正题。CAN FD的数据帧,说白了就是一条消息在总线上的完整“旅行记录”。我习惯把它拆成七个部分来看:帧起始、仲裁场、控制场、数据场、CRC场、ACK场、帧结束。每个部分都有自己的职责,少一个都不行。

2.1 帧起始(SOF)

帧起始就是一个显性位(逻辑0)。它告诉所有节点:“嘿,我要开始发消息了!”

这个位很重要。为什么?因为它负责同步。总线上所有节点的采样点,都得靠这个边沿来对齐。我记得刚做CAN FD项目时,有个同事没注意SOF的同步作用,结果采样点偏移,导致整个网络丢帧。嗯,后来我们花了整整两天排查,才发现是晶振误差累积的问题。

关键点:SOF必须是显性位。如果总线上同时有多个节点发送,SOF的边沿会触发所有节点的硬同步。

2.2 仲裁场

仲裁场包含两部分:11位标识符(标准帧)或29位标识符(扩展帧),再加上RTR位(远程帧请求位)。

说白了,这就是消息的“身份证”和“优先级”。标识符越小,优先级越高。你想想看,如果两个节点同时发消息,总线怎么决定谁先发?就是靠仲裁场逐位比较,显性位(0)会覆盖隐性位(1)。

我在项目中遇到过一个问题:某ECU的标识符设成了0x7FF,结果每次跟其他节点抢总线都抢不过。后来我建议把标识符改小一点,问题就解决了。避坑指南:标识符分配一定要全局规划,别让高优先级消息被低优先级消息堵住。

帧类型 标识符长度 RTR位
标准帧 11位 1位
扩展帧 29位 1位

2.3 控制场

控制场在CAN FD里比传统CAN复杂一些。它包含:

  • IDE位:标识符扩展位。显性表示标准帧,隐性表示扩展帧。
  • ESI位:错误状态指示位。发送节点是主动错误还是被动错误,就看这个位。
  • DLC:数据长度码。4个位,表示数据场有多少字节。CAN FD支持0-8字节(传统CAN)和12、16、20、24、32、48、64字节(CAN FD模式)。
  • BRS位:位速率切换位。这是CAN FD的核心特性之一。隐性表示切换到高速数据段,显性表示保持原速率。

我个人习惯把控制场看作“消息的配置区”。你告诉接收方:“我要发多少数据?要不要切高速?”全在这里。

小技巧:DLC的值不是直接对应字节数。比如DLC=9表示12字节,DLC=15表示64字节。查表最靠谱。

2.4 数据场

数据场就是实际要传输的数据。0到64字节,按需填充。

这里有个坑:CAN FD的数据场长度可以是0字节吗?可以。但我在项目中见过有人发0字节数据帧,结果接收方不知道该怎么处理。我建议:除非有特殊协议约定,否则数据场至少放1个字节,哪怕是个填充值。

数据场的字节顺序呢?一般是MSB(最高有效字节)先发。但有些芯片厂商会搞小端模式。嗯,这个一定要看芯片手册,别想当然。

2.5 CRC场

CRC场是CAN FD的“安全卫士”。它包含:

  • CRC序列:传统CAN是15位CRC,CAN FD是17位(数据场≤16字节)或21位(数据场>16字节)。
  • CRC分隔符:1个隐性位。

为什么CAN FD要加长CRC?因为数据场变大了,错误检测能力必须跟上。我记得有一次,一个客户反馈说他们的CAN FD网络偶尔出现数据错误。我们抓了波形一看,CRC校验失败率高达0.1%。后来发现是终端电阻匹配问题,导致信号反射影响了CRC计算。

警告:CRC计算是硬件自动完成的,但如果你自己实现CAN FD协议栈,一定要确认CRC多项式是否正确。CAN FD的CRC多项式跟传统CAN不一样!

2.6 ACK场

ACK场包含两个位:

  • ACK槽:发送节点发隐性位,接收节点如果正确接收,就拉成显性位。这就是“确认”信号。
  • ACK分隔符:1个隐性位。

说白了,ACK场就是接收方给发送方的“回执”。如果发送方没收到显性位,就知道消息没被正确接收,然后重发。

我在调试时遇到过一种情况:总线上只有一个节点在发消息,没有其他节点接收。结果ACK槽一直是隐性位,发送节点不断重发,总线负载瞬间飙升。避坑指南:测试时一定要确保至少有一个节点在监听,否则你会看到莫名其妙的重发风暴。

2.7 帧结束(EOF)

帧结束是7个隐性位。它告诉所有节点:“消息发完了,总线可以空闲了。”

EOF的长度是固定的7位。为什么是7位?这是CAN协议的设计冗余,用来防止误判。如果某个节点因为干扰把EOF误判成其他东西,7位的长度能保证错误检测机制有时间介入。

嗯,这里要注意:EOF之后,总线会进入间歇场(3个隐性位),然后才是空闲状态。间歇场是CAN协议的一部分,但很多初学者会忽略它。

总结一下:CAN FD数据帧的七个部分,每个都有明确的功能。SOF负责同步,仲裁场决定优先级,控制场配置参数,数据场承载信息,CRC场保证完整性,ACK场提供确认,EOF标记结束。你想想看,少了任何一个,整个通信机制就玩不转了。

我个人建议:在分析CAN FD总线负载时,一定要把帧结构中的每个位都算进去。很多人只算数据场,忽略了控制场、CRC场和ACK场的开销。结果算出来的负载率偏低,实际测试时总线就爆了。嗯,下一节我会详细讲负载率怎么算,这里先留个悬念。