2、CAN数据帧结构:标准帧与扩展帧、仲裁机制、位填充规则、CRC校验原理
好,咱们进入第二章。这一章可以说是CAN通信的“硬核”部分。很多刚入行的工程师,拿着CANoe抓出来的报文,看到ID、DLC、Data这些字段,觉得挺简单。但一旦遇到总线竞争、CRC校验不过、位填充错误,就彻底懵了。
我个人习惯,把CAN帧结构比作一封信。标准帧和扩展帧,就是信封上地址格式的不同。仲裁机制,就是多个邮差同时送信时,谁先走。位填充和CRC,就是信封上的防拆封条和校验码。咱们一个一个拆开看。
2.1 标准帧 vs 扩展帧:到底差在哪?
CAN总线最早用的是标准帧,11位标识符。后来发现11位不够用,就搞了个扩展帧,29位标识符。说白了,就是地址空间从2048个扩展到了5亿多个。
你可能会问:“我平时用标准帧就够了,为啥要学扩展帧?”嗯,我在做商用车项目时遇到过,整车控制器和多个ECU通信,标准帧的ID根本不够分配。最后只能切到扩展帧,才解决了ID冲突的问题。
两种帧的结构差异,我整理了一张表,你一看就明白:
| 字段 | 标准帧 (11位ID) | 扩展帧 (29位ID) |
|---|---|---|
| SOF | 1位,显性 | 1位,显性 |
| 标识符 | 11位 (ID28~ID18) | 29位 (ID28~ID0) |
| RTR | 1位,远程帧标志 | 1位,远程帧标志 |
| IDE | 0 (显性) | 1 (隐性) |
| SRR | 无 | 1位,替代远程请求 |
| 控制场 | 6位 (r0, DLC4位) | 6位 (r1, r0, DLC4位) |
| 数据场 | 0~8字节 | 0~8字节 |
| CRC场 | 15位CRC + 1位界定符 | 15位CRC + 1位界定符 |
| ACK场 | 2位 | 2位 |
| EOF | 7位隐性 | 7位隐性 |
这里有个关键点:IDE位。标准帧的IDE是显性(0),扩展帧的IDE是隐性(1)。仲裁时,标准帧的优先级天然高于扩展帧。为什么?因为IDE位在仲裁场里,显性位会覆盖隐性位。
2.2 仲裁机制:谁先说话?
CAN总线的仲裁机制,说白了就是“谁的数字小,谁先走”。
为什么?因为CAN总线是“线与”逻辑。显性位(0)会覆盖隐性位(1)。多个节点同时发送时,从SOF开始逐位比较。谁的ID位先出现隐性(1),而对方是显性(0),谁就自动退出。
举个例子:
- 节点A发送ID:0x123 (二进制:0001 0010 0011)
- 节点B发送ID:0x456 (二进制:0100 0101 0110)
从最高位开始比:
- 第1位:A是0,B是0 → 继续
- 第2位:A是0,B是1 → B退出,A获胜
你看,A的ID更小,所以A赢得了仲裁。
这里有个细节:RTR位。如果是数据帧,RTR是显性(0);如果是远程帧,RTR是隐性(1)。所以数据帧的优先级高于远程帧。我遇到过有人用远程帧请求数据,结果总线上数据帧太多,远程帧一直发不出去,导致超时。嗯,这个坑我踩过。
2.3 位填充规则:为什么要有这个?
位填充,是CAN协议里一个容易被忽略但极其重要的机制。
它的规则很简单:发送方在连续发送5个相同电平的位后,自动插入一个相反电平的位。接收方收到后,自动把这个填充位去掉。
为什么要这么做?
- 保证时钟同步: CAN总线没有单独的时钟线,靠的是位边沿来同步。如果连续出现太多相同电平,接收方可能丢失同步。
- 防止误判: 连续6个相同电平在CAN协议里是错误标志。如果不做位填充,数据里出现连续6个0或1,就会被误判为错误。
举个例子:
原始数据:11111 00000 11111
填充后: 11111 0 00000 1 11111 0
(每5个相同位后插入一个相反位)
我在调试一个ECU时,发现总线总是莫名其妙地报错。用示波器一看,数据场里出现了连续6个0。原来是发送芯片的位填充功能没使能。打开后,问题消失。
2.4 CRC校验原理:数据到底对不对?
CRC(循环冗余校验)是CAN帧的“防伪标签”。发送方计算一个15位的CRC值,附在帧尾。接收方用同样的算法重新计算,如果结果一致,说明数据没被篡改。
CAN协议用的CRC生成多项式是:
G(x) = x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1
这个多项式对应的二进制是:1100010110011001(16位,最高位x^15隐含)。
计算过程大致是:
- 把待校验的数据(SOF、仲裁场、控制场、数据场)看作一个二进制数。
- 在这个数后面补15个0。
- 用生成多项式做模2除法(异或运算)。
- 得到的余数就是15位CRC值。
接收方收到后,用同样的多项式对数据+CRC做除法。如果余数为0,说明数据正确。否则,报CRC错误。
你可能会问:“15位CRC够用吗?”说实话,在汽车这种高噪声环境里,15位CRC的检错能力已经很强了。它能检测出:
- 所有单比特错误
- 所有双比特错误
- 所有奇数个错误
- 所有长度≤15的突发错误
- 99.997%的其他错误
好了,这一章的内容就到这里。标准帧和扩展帧的区别、仲裁机制、位填充规则、CRC校验原理,这些都是CAN通信的基石。你把这些搞懂了,后面诊断故障时,就能快速定位问题出在哪个环节。
下一章,咱们聊聊CAN错误处理机制。那可是个有意思的话题。