第2章:CAN总线数据链路层——帧结构深度解析

各位工程师朋友,咱们接着聊CAN总线。上一章我们把物理层的那些事儿捋了一遍,这一章要深入数据链路层了。说白了,就是看看CAN报文到底长什么样,每个位是干什么用的。

我个人习惯把CAN帧结构比作一封信。有信封、有正文、有签名。你想想看,如果信写得不规范,收信人就看不懂。CAN总线也一样,帧结构不对,整个网络就乱套了。

2.1 CAN帧的七段结构

一个标准的CAN数据帧,由7个场组成。我当年刚接触CAN时,总觉得这7个场记不住。后来在项目里调试过几次干扰问题,就再也忘不掉了。

场名称 位数 作用
SOF(帧起始) 1位 同步所有节点
仲裁场 12或32位 决定谁有发送权
控制场 6位 标识数据长度
数据场 0-64位 真正要传的数据
CRC场 16位 校验数据完整性
ACK场 2位 确认接收成功
EOF(帧结束) 7位 标志帧结束

2.2 SOF——一切从这里开始

SOF只有1位,固定为显性(逻辑0)。

为什么是显性?因为总线空闲时是隐性(逻辑1)。SOF从隐性跳变到显性,所有节点都能检测到这个下降沿。这就是同步信号。

关键点:SOF的下降沿是所有节点重新同步的基准。我在项目中遇到过,如果SOF边沿不够陡峭,远端节点可能同步失败,导致整个报文丢失。

2.3 仲裁场——谁说了算?

仲裁场包含两部分:标识符(ID)和RTR位。

  • 标准帧:11位ID + 1位RTR = 12位
  • 扩展帧:29位ID + 1位SRR + 1位IDE + 1位RTR = 32位

仲裁机制很有意思。多个节点同时发送时,谁先发隐性位谁就退出。说白了,ID值越小,优先级越高。

我记得有一次调试,两个ECU老是丢报文。抓波形一看,好家伙,两个节点的ID居然一样。CAN总线仲裁机制遇到相同ID,直接就乱套了。

避坑指南:我曾经在项目里犯过这个错——两个节点用了相同的ID。结果总线冲突不断,数据根本传不出去。记住:CAN总线上每个节点的ID必须唯一。

2.4 控制场——数据有多长?

控制场6位,结构如下:

  • IDE位(1位):标识是标准帧还是扩展帧
  • 保留位(1位):留给未来扩展
  • DLC(4位):数据长度代码

DLC的取值范围是0到8,对应数据场0到8字节。为什么是8?这是CAN协议设计时的考量。8字节对于大多数控制信号足够了,太长反而影响实时性。

2.5 数据场——真正的干货

数据场0到8字节,这是我们要传的核心信息。

在信号完整性调试中,数据场最容易出问题。为什么?因为数据场长度可变,位填充规则会插入额外的位,导致时序抖动。

调试技巧:我建议在排查干扰时,先看数据场有没有位错误。如果数据场频繁出错,大概率是物理层有问题——终端电阻、线缆长度、共模干扰,这些都要查一遍。

2.6 CRC场——数据对不对?

CRC场15位CRC序列 + 1位CRC界定符。

CRC校验覆盖SOF、仲裁场、控制场和数据场。接收节点重新计算CRC,如果和发送的不一致,就说明数据被破坏了。

嗯,这里要注意。CRC校验能检测出大部分错误,但不是100%。不过对于汽车电子来说,15位CRC的检错能力已经足够了。

2.7 ACK场——收到了吗?

ACK场2位:ACK槽 + ACK界定符。

发送节点在ACK槽发送隐性位。如果接收节点正确收到了报文,就会在ACK槽发送显性位。发送节点检测到这个显性位,就知道报文被成功接收了。

你想想看,如果总线上只有一个节点,那ACK槽永远是隐性的。发送节点会一直重发,直到超时。这就是所谓的“无应答错误”。

2.8 EOF——到此为止

EOF固定7位隐性位。为什么是7位?因为位填充规则最多连续5个相同位,7位隐性位足够让所有节点确认帧结束了。

2.9 数据帧 vs 远程帧

这两者的区别,说白了就是:数据帧是“我发给你”,远程帧是“你发给我”。

对比项 数据帧 远程帧
RTR位 显性(0) 隐性(1)
数据场 有数据 无数据
用途 发送数据 请求数据
DLC 实际数据长度 请求的数据长度

远程帧没有数据场,但DLC字段必须填写,告诉对方你要多少字节数据。

实战经验:我在一个项目中遇到过,某个传感器节点一直发远程帧,但数据节点就是不响应。抓波形一看,远程帧的ID写错了。这种问题最难查,因为波形看起来是正常的,就是没数据回来。

2.10 位填充——隐藏的干扰源

CAN协议有个位填充规则:连续5个相同位后,自动插入一个相反位。

为什么要这么做?为了保证时钟同步。如果没有位填充,长时间没有跳变沿,节点的时钟就会漂移。

但位填充也带来了问题。它会改变帧的实际长度,导致时序不确定性。在高速CAN(1Mbps)下,位填充可能引入额外的抖动。

注意:CRC场、ACK场和EOF不参与位填充。这是协议规定的,别搞错了。

2.11 总结

CAN帧结构看似复杂,其实就7个场。每个场都有明确的职责。调试干扰问题时,我建议按这个顺序排查:

  1. 先看SOF边沿是否陡峭
  2. 再看仲裁场有没有ID冲突
  3. 然后看数据场有没有位错误
  4. 最后看ACK场有没有应答

下一章我们聊CAN控制器的硬件设计,包括收发器选型、隔离方案、终端电阻布局。这些可都是实战干货,到时候见。