3、CAN数据链路层:CAN帧结构(标准帧与扩展帧)、数据帧、远程帧、错误帧、过载帧、帧间隔

各位同学,咱们今天聊聊CAN的数据链路层。说白了,这一层就是CAN协议最核心的部分——帧结构。你想想看,总线上的节点怎么交流?就是靠这些帧。我刚开始接触CAN的时候,觉得帧类型太多,容易搞混。后来发现,只要抓住几个关键点,其实没那么复杂。

3.1 标准帧与扩展帧:ID的两种玩法

CAN总线上的每个消息都有一个标识符,也就是ID。这个ID决定了消息的优先级——ID越小,优先级越高。标准帧用的是11位ID,扩展帧用的是29位ID。

我个人习惯把标准帧叫“短ID”,扩展帧叫“长ID”。为什么要有两种?说白了,早期CAN总线节点少,11位ID够用了。后来车上的电子设备越来越多,11位ID不够分,就搞出了29位的扩展帧。

关键区别:

  • 标准帧:11位ID,帧头更短,传输效率高
  • 扩展帧:29位ID,帧头更长,但ID空间更大

我在项目中遇到过一个问题:某个ECU只支持标准帧,结果新换的传感器发的是扩展帧,总线直接报错。嗯,这里要注意——标准帧和扩展帧可以在同一条总线上共存,但节点必须明确知道自己该收哪种帧。

3.2 数据帧:真正干活的主力

数据帧是CAN总线最常用的帧类型。它负责把数据从一个节点传到另一个节点。数据帧的结构是这样的:

SOF + 仲裁场 + 控制场 + 数据场 + CRC场 + ACK场 + EOF

每个字段都有它的作用。我挑几个重点说说:

  • SOF(帧起始):一个显性位,告诉总线“我要发消息了”
  • 仲裁场:包含ID和RTR位,决定谁能抢到总线
  • 控制场:包含IDE位和DLC(数据长度码),DLC告诉你数据场有几个字节
  • 数据场:0到8个字节,真正要传的数据
  • CRC场:15位CRC校验,保证数据没被篡改
  • ACK场:接收节点确认收到
  • EOF:7个隐性位,表示帧结束

你想想看,数据帧最多只能带8个字节。为什么是8个?因为CAN总线设计的时候,考虑到实时性要求,数据量不能太大。后来CAN FD出来了,才把数据场扩展到64字节。

我的经验:调试的时候,先看DLC对不对。有一次我排查了半天,发现是DLC设错了,接收方只读了2个字节,但发送方发了8个字节,后面的数据全丢了。

3.3 远程帧:只问不拿

远程帧,说白了就是“请求数据”。一个节点发远程帧,另一个节点收到后,就会发一个对应的数据帧回来。

远程帧的结构和数据帧很像,区别在于:

  • 远程帧的RTR位是隐性(1),数据帧的RTR位是显性(0)
  • 远程帧没有数据场

我曾经踩过一个坑:远程帧的DLC必须和对应数据帧的DLC一致。比如你请求一个8字节的数据帧,远程帧的DLC就得设成8。否则,接收节点可能不知道要发多少数据。

注意:远程帧用得不多,因为大部分场景都是节点主动发数据。但如果你需要轮询某个传感器,远程帧就派上用场了。

3.4 错误帧:总线的“交警”

错误帧是CAN总线自我纠错的机制。当节点检测到错误时,就会发错误帧,通知其他节点“刚才那帧有问题,别用了”。

错误帧由两部分组成:

  • 错误标志:6个连续相同极性的位(显性或隐性)
  • 错误界定符:8个隐性位

CAN总线有5种错误类型:

错误类型 说明
位错误 发送节点发现总线上的位和自己发的不一致
填充错误 连续6个相同极性的位出现(违反位填充规则)
CRC错误 接收节点计算的CRC和发送的不一致
形式错误 帧格式不符合规范
ACK错误 发送节点没收到ACK确认

我记得有一次在台架上测试,总线一直报错。查了半天,发现是某个节点的晶振频率偏了,导致位时序不对。嗯,硬件问题有时候比软件问题更难排查。

3.5 过载帧:总线的“慢点,我跟不上”

过载帧,说白了就是节点说“我忙不过来了,你慢点发”。它和错误帧结构类似,但触发条件不同。

过载帧的触发条件:

  • 节点内部缓冲区满了,来不及处理
  • 帧间隔期间,节点需要额外时间准备

过载帧由过载标志(6个显性位)和过载界定符(8个隐性位)组成。我个人觉得,过载帧在实际项目中出现的频率不高,因为现在的MCU处理能力都够强。但在一些老旧的CAN控制器上,还是有可能遇到的。

3.6 帧间隔:总线的“呼吸时间”

帧间隔,就是两帧之间的空闲时间。它让总线上的节点有时间准备接收下一帧。

帧间隔由三部分组成:

  • 间歇场:3个隐性位
  • 总线空闲:任意长度的隐性位
  • 暂停发送场:8个隐性位(仅被动错误节点需要)

你想想看,如果没有帧间隔,节点刚发完一帧,下一帧马上就来,接收节点根本来不及处理。所以帧间隔是必须的。

总结一下:

  • 数据帧:传数据
  • 远程帧:请求数据
  • 错误帧:报告错误
  • 过载帧:请求慢点发
  • 帧间隔:两帧之间的休息时间

好了,这一章的内容就到这里。下一章咱们聊聊CAN的位时序和同步机制,那才是真正考验功底的地方。