2、CAN总线基础重温:CAN 2.0与CAN FD的区别,CAN总线物理层与数据链路层要点,CAN报文帧结构详解

各位同学,咱们今天聊点实在的。CAN总线这东西,做汽车电子的没人敢说不会。但说实话,很多人只是会用,真问到CAN 2.0和CAN FD到底差在哪,物理层那些电平细节,报文里每个位是干嘛的——能讲清楚的不多。

我个人习惯是,不管多熟的技术,每隔一段时间都要回头看看基础。尤其是CAN总线,它太重要了。从OBD诊断到动力域控,从门窗控制到ADAS传感器,底层全是CAN在跑。今天咱们就把CAN 2.0和CAN FD的区别、物理层与数据链路层的要点、报文帧结构,一次性理清楚。

2.1 CAN 2.0与CAN FD:到底差在哪?

先问一个问题:为什么要有CAN FD?

答案很简单——CAN 2.0不够用了。我在2016年做某国产SUV的网关项目时,就遇到了这个瓶颈。当时车上挂了三路CAN,每路500kbps,但诊断刷写一个ECU要等十几分钟。客户投诉说“这车刷个软件比加油还慢”。嗯,这就是CAN 2.0的痛:带宽只有1Mbps,数据场最多8字节。

CAN FD(Flexible Data-Rate)就是来解决这个问题的。它保留了CAN 2.0的仲裁机制,但做了两个关键升级:

  • 可变速率:仲裁段用标准速率(比如500kbps),数据段可以切换到高速率(比如2Mbps甚至5Mbps)。说白了,就是“抢车道时慢慢开,上了高速就飙起来”。
  • 更大的数据场:从8字节扩展到最多64字节。你想想看,一次发64字节和分8次发,效率差了多少?

我给大家整理了一个对比表,一目了然:

特性 CAN 2.0 CAN FD
最大数据场 8字节 64字节
最大波特率 1 Mbps 数据段可达5 Mbps+
速率切换 不支持 支持(仲裁段/数据段不同速率)
CRC校验 15位 CRC 17位或21位 CRC(更强)
帧格式 标准帧/扩展帧 兼容CAN 2.0,新增FDF标志位
向后兼容 CAN FD控制器可收CAN 2.0报文

关键点:CAN FD的控制器可以接收CAN 2.0报文,但反过来不行。所以混合网络中,CAN FD节点必须能识别并处理CAN 2.0帧。

我曾经在调试一个混动车型的BMS时,发现CAN FD节点偶尔会丢帧。查了两天才找到原因——CAN FD节点的接收滤波器没配好,把CAN 2.0的远程帧当成了错误帧给滤掉了。所以这里提醒大家:混合网络中,滤波器配置一定要覆盖所有帧类型

2.2 CAN总线物理层要点

物理层这东西,很多人觉得“不就是两根线嘛”。但我在现场被坑过好几次,所以必须讲清楚。

CAN总线物理层用的是差分信号,两条线分别叫CAN_H和CAN_L。为什么用差分?抗干扰。你想想看,车上的电磁环境多恶劣,电机、点火线圈、大功率灯,全是干扰源。差分信号共模抑制,能把干扰抵消掉。

电平逻辑是这样的:

  • 显性电平(Dominant):CAN_H比CAN_L高约2V(CAN_H≈3.5V,CAN_L≈1.5V),逻辑上代表“0”。
  • 隐性电平(Recessive):CAN_H和CAN_L都约2.5V,逻辑上代表“1”。

这里有个重要规则:显性位会覆盖隐性位。这就是CAN总线仲裁的基础——谁先发“0”,谁就赢。

避坑指南:我曾经在实验室里用示波器量CAN波形,发现显性电平只有1.2V的压差。查了半天,发现是终端电阻没接对。CAN总线两端必须各接一个120Ω电阻,否则信号反射会导致通信失败。记住:没有终端电阻,CAN就是一根天线

物理层还有几个参数要注意:

  • 总线长度:和波特率成反比。500kbps时最长约100米,1Mbps时建议不超过40米。我见过有人用1Mbps拉了200米线,结果全是错误帧。
  • 节点数:标准CAN最多110个节点(取决于收发器驱动能力)。但实际项目中我建议不超过30个,节点多了总线负载一高,延迟就上去了。
  • 共模电压:CAN收发器通常支持-2V到+7V的共模范围。但车上12V/24V系统,地偏移可能很大。所以选型时要注意共模抑制比。

2.3 CAN总线数据链路层要点

数据链路层,说白了就是“怎么把数据组织成帧,怎么保证不出错”。CAN的数据链路层非常巧妙,它把很多事都做在了硬件里。

核心机制有三个:

  1. CSMA/CA + 非破坏性仲裁:节点想发数据就监听总线,空闲就发。如果多个节点同时发,仲裁场里ID小的(显性位多)获胜。输了的节点自动退出发送,转为接收。整个过程不丢数据,不浪费带宽。
  2. 错误检测与自动重发:CAN有5种错误检测机制(位错误、填充错误、CRC错误、形式错误、应答错误)。发现错误后,节点会发一个“错误帧”通知所有人,然后发送节点自动重发。这个机制非常可靠,但也会导致“错误风暴”——如果一个节点坏了,它会不停发错误帧,把整个总线拖垮。
  3. 填充位机制:连续5个相同电平后,自动插入一个相反电平。目的是保证时钟同步。CAN FD对这个机制做了优化,数据段可以关闭填充位以提高效率。

个人经验:我在做某款T-Box时,遇到过一种奇怪的现象——总线偶尔会卡死几毫秒。用CAN分析仪抓波形,发现是某个节点在发送时产生了位错误,然后反复重发。最后定位到是那个节点的晶振精度不够,时钟漂移导致采样点偏移。所以,CAN节点的时钟精度至少要在±0.5%以内,否则别怪总线不稳定。

2.4 CAN报文帧结构详解

好了,到了最核心的部分——报文帧结构。我建议大家把这个结构背下来,因为调试时你要对着波形看每一位。

CAN 2.0有四种帧类型:数据帧、远程帧、错误帧、过载帧。咱们重点讲数据帧,它最常用。

一个标准数据帧(11位ID)的结构如下:

SOF | 11位ID | RTR | IDE | r0 | DLC | 0~8字节数据 | CRC | ACK | EOF | IFS

咱们逐段拆解:

  • SOF(Start of Frame):1位显性。告诉所有节点“我要发数据了”。
  • 仲裁场(11位ID + RTR):ID决定优先级,越小越高。RTR位:数据帧为显性(0),远程帧为隐性(1)。
  • 控制场(IDE + r0 + DLC):IDE=0表示标准帧,IDE=1表示扩展帧。r0是保留位。DLC是数据长度码,4位,表示数据场有多少字节(0~8)。
  • 数据场:0~8字节,就是你要传的实际数据。CAN FD可以到64字节。
  • CRC场:15位CRC + 1位CRC分隔符(隐性)。用于校验数据完整性。
  • ACK场:2位。发送节点发隐性,接收节点如果正确收到,就在ACK Slot位拉显性。这就是“应答”机制。
  • EOF(End of Frame):7位隐性。表示帧结束。
  • IFS(Inter Frame Space):3位隐性。帧间间隔,给控制器一点处理时间。

扩展帧(29位ID)的区别在于:仲裁场变成了11位基本ID + SRR + IDE + 18位扩展ID。SRR位替代了RTR的位置,IDE=1表示这是扩展帧。

重点记忆:CAN FD的帧结构和CAN 2.0基本一致,但多了几个标志位:

  • FDF位:在控制场的r0位置,FDF=1表示这是CAN FD帧。
  • BRS位:在FDF之后,BRS=1表示数据段切换到高速率。
  • ESI位:在BRS之后,表示发送节点的错误状态。

另外,CAN FD的CRC场更长(17位或21位),因为数据场大了,需要更强的校验。

我给大家一个实际抓到的CAN FD报文例子(十六进制):

ID: 0x123
DLC: 0x08 (实际数据8字节)
Data: 01 02 03 04 05 06 07 08
FDF: 1 (CAN FD帧)
BRS: 1 (数据段高速率)
CRC: 0x1A2B (17位CRC)

这个报文在示波器上看起来,仲裁段是500kbps的波形,到了数据段突然变密了(2Mbps),然后CRC段又变回500kbps。如果你用普通CAN分析仪去抓,可能会报错——因为它不认识BRS位。

避坑指南:我曾经在测试CAN FD节点时,用了一个不支持CAN FD的USB-CAN工具去监听总线。结果工具一直报“格式错误”,我还以为是节点有问题。后来换了支持CAN FD的分析仪,一切正常。所以,调试CAN FD网络,一定要用支持CAN FD的工具,否则你会被假象误导。

最后,关于远程帧(RTR=1),我多说一句。远程帧是用来请求数据的——节点A发一个远程帧,节点B收到后发一个数据帧回应。但实际项目中,我很少用远程帧。为什么?因为远程帧的优先级和对应的数据帧ID相同,容易造成总线冲突。我个人习惯用周期性发送+事件触发的方式,更可控。

好了,CAN总线的基础就重温到这里。下一章咱们要进入实战——如何在同一个网络中,让CAN 2.0节点和CAN FD节点和平共处。嗯,那才是真正考验功力的时候。