第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个场。每个场都有明确的职责。调试干扰问题时,我建议按这个顺序排查:
- 先看SOF边沿是否陡峭
- 再看仲裁场有没有ID冲突
- 然后看数据场有没有位错误
- 最后看ACK场有没有应答
下一章我们聊CAN控制器的硬件设计,包括收发器选型、隔离方案、终端电阻布局。这些可都是实战干货,到时候见。