3. CAN总线基础回顾:CAN 2.0与CAN FD的区别、CAN报文帧结构、物理层与数据链路层要点

各位同学,咱们正式开始UDS诊断开发的学习之前,我得先带大家把CAN总线的基础再过一遍。你想想看,UDS诊断协议是跑在CAN总线上的,如果CAN总线的基本功不扎实,后面调试起来会非常痛苦。我个人习惯是,不管学员基础怎么样,这一节必须讲透。

今天咱们重点聊三个事儿:CAN 2.0和CAN FD到底差在哪、CAN报文里每个字段是干嘛的、以及物理层和数据链路层那些容易踩坑的地方。

3.1 CAN 2.0与CAN FD:老将与新秀

先说CAN 2.0。这是目前最普及的版本,也叫经典CAN。它的数据段最多只能带8个字节。嗯,8个字节,在十几年前够用了。但现在车上ECU越来越多,动不动就要刷写几百KB的固件,8字节一包数据传起来太慢了。

于是就有了CAN FD(Flexible Data-rate)。我最早接触CAN FD是在2018年做的一个网关项目上,当时主机厂要求支持高速刷写,经典CAN根本跑不动。说白了,CAN FD就是在CAN 2.0的基础上做了两个核心改进:

  • 数据长度扩展:从8字节直接干到64字节。你想想看,同样传64字节数据,CAN FD只需要1帧,经典CAN得发8帧,效率差距一目了然。
  • 可变速率:仲裁段还是用原来的速率(比如500kbps),但数据段可以切换到更高的速率(比如2Mbps甚至5Mbps)。为什么这么做?因为仲裁段需要所有节点都能听到,速率不能太高;数据段是点对点传输,可以跑快一点。

我在项目中遇到过一个问题:某供应商的CAN FD控制器在数据段速率切换时,位时序配置没调好,导致高速传输时采样点偏移,偶尔丢帧。查了两天才找到原因。所以大家记住,CAN FD不是简单地把速率提上去就完事了,位时序的匹配非常关键。

核心区别总结

  • CAN 2.0:最大8字节数据场,固定速率(如500kbps)
  • CAN FD:最大64字节数据场,数据段可变速(最高5Mbps+)
  • CAN FD向下兼容CAN 2.0,但CAN 2.0控制器收不到CAN FD报文

3.2 CAN报文帧结构:从SOF到CRC,一个都不能少

咱们来看一个标准数据帧的结构。我习惯把它分成三段:起始段、仲裁段、数据段。每一段都有它的使命。

字段长度说明
SOF1 bit帧起始,显性电平,同步所有节点
ID11 bit(标准)或29 bit(扩展)标识符,决定优先级,数值越小优先级越高
RTR1 bit远程帧标志,数据帧为显性,远程帧为隐性
IDE1 bit扩展标识符标志,标准帧为显性,扩展帧为隐性
DLC4 bit数据长度代码,0~8(CAN 2.0)或0~15(CAN FD)
Data0~64 Byte实际数据,UDS诊断报文就放在这里
CRC15 bit(CAN 2.0)或17/21 bit(CAN FD)循环冗余校验,检测传输错误
ACK2 bit应答场,发送节点发隐性,接收节点拉显性表示收到
EOF7 bit帧结束,全部为隐性电平

这里我特别想强调两个点:

第一,ID的优先级问题。 你想想看,总线上多个节点同时发数据怎么办?CAN总线通过“线与”机制仲裁,ID数值最小的节点获胜。所以UDS诊断请求的ID通常设得比较低,确保诊断报文能优先通过。我曾经见过一个项目,诊断ID设得比某些关键控制报文还高,结果导致正常控制功能被诊断报文干扰,后来紧急改了ID分配策略。

第二,DLC和Data的关系。 很多新手以为DLC必须等于实际数据长度,其实不是。DLC告诉接收方“我打算发多少字节”,但实际数据可以少于DLC。不过我个人建议,DLC和实际数据长度保持一致,否则容易引起解析混乱。特别是做UDS诊断时,如果DLC和实际数据长度不匹配,诊断仪那边可能直接报错。

避坑指南:我曾经在调试CAN FD时,DLC设置成了15(表示64字节),但实际只发了32字节数据。结果接收方一直等后面的32字节,导致超时。后来我养成了一个习惯:DLC必须精确匹配实际数据长度,绝不偷懒。

3.3 物理层与数据链路层要点

物理层和数据链路层,说白了就是CAN总线能跑起来的底层保障。很多工程师只关注应用层,忽略了这两层,结果出了问题怎么都查不到原因。

3.3.1 物理层:电平、终端电阻、线束

CAN总线物理层用的是差分信号,CAN_H和CAN_L两根线。显性电平对应逻辑0,隐性电平对应逻辑1。这个大家应该都知道,但有几个细节我得提醒一下:

  • 终端电阻:CAN总线两端必须各接一个120Ω的电阻。为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω,匹配电阻可以消除信号反射。我见过一个案例,某项目CAN总线通信时好时坏,查了半天发现有一端的终端电阻焊错了,焊成了100Ω。换回120Ω后问题立刻消失。
  • 共模电压:CAN收发器要求CAN_H和CAN_L的共模电压在-2V到+7V之间(具体看芯片规格)。如果共模电压超出范围,收发器可能无法正确识别差分信号。特别是在做电源地线设计时,要确保各个节点的地电位差不要太大。
  • 线束长度:速率越高,允许的线束长度越短。500kbps时最长可以到几百米,但到了2Mbps,最好控制在几十米以内。我建议做CAN FD设计时,线束长度不要超过40米,否则信号质量很难保证。

3.3.2 数据链路层:位填充、错误检测、帧格式

数据链路层负责把物理层的比特流组织成有意义的帧。这里有几个关键机制:

  • 位填充:连续发送5个相同电平后,自动插入一个相反电平。为什么?为了保证接收方能从信号边沿中提取时钟。如果长时间没有电平跳变,接收方的时钟同步会漂移。嗯,这个机制在CAN FD的高速数据段中尤其重要,因为速率高了,时钟同步要求更严格。
  • 错误检测:CAN总线有5种错误检测机制:位错误、填充错误、CRC错误、格式错误、应答错误。任何一个节点检测到错误,就会发送错误帧,强制总线进入错误状态。我遇到过最头疼的是“位错误”——发送节点发送显性电平,但回读时发现总线上是隐性电平,说明有其他节点在同时发送。这种问题通常是因为ID冲突或者总线负载过高。
  • 帧格式:标准帧和扩展帧的区别在于ID长度。标准帧11位ID,扩展帧29位ID。UDS诊断通常使用扩展帧,因为29位ID可以携带更多信息(比如源地址、目标地址)。但要注意,扩展帧的仲裁场更长,传输效率略低于标准帧。

重要提醒:CAN FD的数据链路层和CAN 2.0不完全兼容。CAN FD的CRC算法更复杂(17位或21位),而且数据段没有位填充(改用其他同步机制)。所以CAN 2.0的控制器收到CAN FD帧时,CRC校验会失败,直接丢弃。这也是为什么CAN FD和CAN 2.0不能混用在同一网络中的原因。

3.4 小结:这些基础决定了UDS诊断的成败

好了,这一节的内容就这么多。总结一下:

  • CAN 2.0和CAN FD的核心区别在于数据长度和速率,选型时要根据实际需求来
  • 报文帧结构里,ID、DLC、CRC这三个字段最容易出问题,调试时优先检查
  • 物理层的终端电阻和共模电压,数据链路层的位填充和错误检测,都是底层保障,不能忽视

下一节咱们开始正式进入UDS诊断协议,我会从诊断会话控制讲起。到时候你会看到,今天讲的CAN帧结构知识会反复用到。嗯,打好基础,后面才能跑得快。