3、CAN总线基础回顾:CAN 2.0与CAN FD区别、CAN报文帧结构、位填充与CRC校验
好,咱们进入第三讲。说实话,每次讲UDS之前,我都得花点时间带大家回顾一下CAN总线。为什么?因为UDS是跑在CAN上面的应用层协议,底层CAN要是搞不清楚,后面诊断那一堆逻辑你根本没法理解。
我见过不少工程师,上来就啃UDS规范,结果连CAN报文ID和数据场怎么划分都搞混。嗯,这其实挺耽误事的。今天咱们就把CAN 2.0和CAN FD的区别、报文帧结构、位填充和CRC校验这几个硬骨头啃下来。
3.1 CAN 2.0与CAN FD:到底差在哪?
先问大家一个问题:你手头的新能源车型,现在用的是CAN 2.0还是CAN FD?我猜大部分是CAN FD,至少网关和域控制器之间肯定是。
CAN 2.0,也叫经典CAN,数据场最多8个字节。这个限制在传统动力总成上够用,但到了新能源车上,一个电池包BMS报文动不动就要传几十个参数,8个字节根本塞不下。所以就有了CAN FD(Flexible Data-Rate)。
我个人习惯把CAN FD理解为「经典CAN的升级版」,核心变化就两点:
- 数据场长度可变:从8字节扩展到最多64字节。你想想看,一个BMS报文里同时塞入单体电压、温度、SOC、SOH,8字节怎么够?64字节就从容多了。
- 速率可切换:仲裁段还是用原来的速率(比如500kbps),但数据段可以切换到更高的速率(比如2Mbps甚至5Mbps)。这个设计很聪明——仲裁段慢一点保证总线稳定,数据段快一点提升吞吐量。
我在项目中遇到过一件事:某款新车型的OTA升级,用经典CAN刷写一个ECU固件要40分钟,换成CAN FD后直接缩短到12分钟。这就是数据场变大+速率提升带来的实际收益。
关键区别速览:
| 特性 | CAN 2.0(经典CAN) | CAN FD |
|---|---|---|
| 数据场长度 | 固定8字节 | 1~64字节可变 |
| 最大传输速率 | 1 Mbps | 数据段可达5 Mbps |
| 帧格式 | 标准帧/扩展帧 | 兼容标准帧/扩展帧,新增FDF标志 |
| CRC校验 | 15位CRC | 17位或21位CRC(根据数据场长度) |
| 向后兼容 | — | 可与经典CAN混用,但需网关桥接 |
注意一点:CAN FD的控制器可以发送和接收经典CAN报文,但反过来不行。所以现在很多新设计的ECU都直接上CAN FD控制器,向下兼容。
3.2 CAN报文帧结构:从SOF到EOF
咱们来看一个标准CAN 2.0数据帧的结构。我习惯把它分成三段:头部、数据区、尾部。
头部包括:
- SOF(Start of Frame):1个显性位,告诉所有节点「我要发报文了」。
- 仲裁场:11位ID(标准帧)或29位ID(扩展帧),加上RTR位。这里决定了报文的优先级——ID越小,优先级越高。
- 控制场:IDE位、保留位、DLC(数据长度码)。DLC告诉你数据场有几个字节。
数据区就是0~8个字节的数据,UDS诊断报文就塞在这里面。
尾部包括:
- CRC场:15位CRC校验码,后面跟一个CRC分隔符。
- ACK场:接收节点在ACK槽位发送显性位,表示「我收到了」。
- EOF(End of Frame):7个隐性位,表示帧结束。
CAN FD的帧结构基本类似,但有几点不同:
- 控制场里多了FDF标志位(显性表示经典CAN,隐性表示CAN FD)。
- 数据场长度用DLC编码表示,但CAN FD的DLC可以编码到64字节(经典CAN最多8字节)。
- CRC场更长,数据段速率切换后,CRC也跟着变。
我建议你记住一个口诀:SOF开头,ID定优先级,DLC定长度,CRC保安全,EOF收尾。做诊断的时候,你主要关注ID和DLC,因为UDS的请求和响应就是通过特定ID和DLC来识别的。
3.3 位填充:为什么要有这个机制?
位填充(Bit Stuffing)是CAN总线里一个容易被忽略但极其重要的机制。说白了,就是为了保证时钟同步。
CAN总线用的是NRZ编码,也就是电平不变表示连续相同的位。如果连续出现5个以上的相同电平,接收节点的时钟就可能漂移,导致采样点错位。
所以CAN协议规定:发送节点在连续发送5个相同位后,必须插入一个相反电平的位。接收节点收到后,会自动把这个填充位去掉。
举个例子:你要发送的数据是 11111 00000,经过位填充后变成 11111 0 00000 1。中间插入了两个填充位。
我曾经在调试一个CAN通信故障时,发现某个节点总是报错。查了半天,原来是该节点的晶振精度不够,加上总线负载高导致连续相同位太多,位填充后时序乱了。换了个高精度晶振就解决了。
避坑指南: 位填充会增加总线负载。如果你发现总线利用率接近100%,可以检查一下是不是数据场里连续相同位太多。虽然这种情况不常见,但我在高负载的网关项目里遇到过。
CAN FD在位填充上做了优化:数据段高速传输时,位填充的规则可以调整,减少填充位数量,进一步提升效率。
3.4 CRC校验:数据完整性的最后防线
CRC(循环冗余校验)是CAN总线保证数据完整性的核心手段。发送节点根据数据场和部分控制场计算出一个校验码,接收节点用同样的算法重新计算,如果结果不一致,就说明数据在传输过程中被破坏了。
经典CAN用的是15位CRC,生成多项式是:
x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1
这个多项式能检测出所有单比特错误、双比特错误、奇数个错误,以及大部分突发错误。对于8字节的数据场来说,够用了。
但CAN FD的数据场最大64字节,15位CRC的检错能力就不够了。所以CAN FD引入了17位CRC(数据场≤16字节时)和21位CRC(数据场>16字节时)。
我举个例子说明CRC的重要性:
假设你通过UDS向ECU写入一个标定参数,数据在CAN总线上传输时受到电磁干扰,某一位发生了翻转。如果没有CRC,ECU会把这个错误参数写进去,后果可能是车辆功能异常甚至安全风险。有了CRC,接收节点发现校验不通过,直接丢弃报文并请求重传。
注意: CRC只能检测错误,不能纠正错误。检测到错误后,CAN控制器会自动发送错误帧,通知发送节点重传。在UDS诊断中,如果连续多次CRC错误,诊断仪可能会超时退出,这时候你需要检查总线物理层——终端电阻、线缆屏蔽、节点接地等。
好了,这一讲的内容就到这里。总结一下:CAN 2.0和CAN FD的核心区别在于数据场长度和速率;报文帧结构要记住SOF、ID、DLC、CRC、EOF这几个关键字段;位填充是为了时钟同步;CRC是数据完整性的保障。
下一讲我们会把这些知识串起来,看看UDS诊断报文具体是怎么封装到CAN帧里的。到时候你会明白,为什么我说「不懂CAN就学不好UDS」。