1. CAN协议基础:CAN总线起源、物理层特性、差分信号与总线电平

各位同学,咱们今天正式开讲CAN总线。说实话,我最早接触CAN是在做汽车电控项目的时候,那时候被一堆术语搞得头大。后来摸爬滚打几年,才真正理解这东西的精髓。咱们今天就从根儿上聊起。

1.1 CAN总线从哪来?

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、车窗……每个模块都自己拉一堆线。你想想看,一辆车光线束就有几十公斤重,故障率还高。

1986年,德国博世公司搞出了CAN总线——Controller Area Network。说白了,就是让车上各个电子单元共用两根线通信。我当年拆过一台老款宝马,那线束粗得跟手臂似的,再看看现在的车,两根双绞线搞定一切,差距太大了。

CAN的核心设计目标:

  • 多主通信——任何节点都能主动发数据
  • 实时性强——优先级高的报文不等待
  • 可靠性高——错误检测和重发机制完善
  • 成本低——两根线就能跑

1.2 物理层长什么样?

CAN总线的物理层,说白了就是一对双绞线。一根叫CAN_H,一根叫CAN_L。终端各接一个120欧姆电阻。就这么简单。

但简单背后有门道。我遇到过不少新手,上来就问:为什么非要双绞线?为什么终端电阻必须是120Ω?

双绞线是为了抗共模干扰。两根线绞在一起,外部电磁场对两根线的干扰几乎一样,差分接收一减,干扰就抵消了。至于120Ω,那是跟电缆的特性阻抗匹配的,防止信号反射。

参数 典型值 说明
总线长度 ≤40m(1Mbps时) 速率越高,距离越短
终端电阻 120Ω 每端各一个
最大节点数 110个(标准) 受驱动能力限制
线缆类型 双绞线 屏蔽或非屏蔽

1.3 差分信号——CAN的看家本领

为什么CAN要用差分信号?我直接说结论:抗干扰能力极强。

单端信号,比如UART的TX/RX,信号对地测量。如果地线上有噪声,信号就跟着抖。CAN不一样,它看的是CAN_H和CAN_L之间的电压差。

举个例子:CAN_H是3.5V,CAN_L是1.5V,差值是2V。这时候来了个干扰,两根线同时被抬高了0.5V。CAN_H变成4.0V,CAN_L变成2.0V,差值还是2V。你看,干扰被抵消了。

我的经验:在电机驱动项目里,强电开关会产生巨大的电磁干扰。用单端通信经常丢包,换成CAN之后,问题基本消失。差分信号在这种环境下就是降维打击。

1.4 总线电平——显性与隐性

CAN总线有两种逻辑状态:显性(Dominant)和隐性(Recessive)。

  • 隐性电平:CAN_H≈2.5V,CAN_L≈2.5V,差值为0V。逻辑上代表"1"。
  • 显性电平:CAN_H≈3.5V,CAN_L≈1.5V,差值为2V。逻辑上代表"0"。

这里有个关键点:显性电平会覆盖隐性电平。也就是说,如果多个节点同时发送,只要有一个节点发显性位,总线上就是显性。这就是CAN总线仲裁的基础。

避坑提醒:我曾经在一个项目里,CAN_H和CAN_L接反了。结果总线死活不通,查了两天才发现。CAN_H和CAN_L不能互换,否则差分信号极性反了,接收端读到的数据全是错的。

1.5 知识结构总览

下面这张图把CAN协议基础的核心脉络画出来了。我建议你把它存下来,后面学仲裁、帧格式、错误处理的时候,随时回来对照。

CAN协议基础知识结构图 CAN协议基础核心脉络 CAN总线 起源与背景 物理层特性 差分信号 总线电平 博世1986年提出 解决汽车线束过多问题 双绞线 + 120Ω终端电阻 CAN_H / CAN_L 两根线 抗共模干扰能力强 电压差 = CAN_H - CAN_L 显性(0) / 隐性(1) 显性覆盖隐性 → 仲裁基础 💡 核心要点:差分信号 + 显性/隐性电平 是理解CAN总线仲裁、错误检测、位填充的基石

1.6 小结

这一章咱们把CAN的根儿刨清楚了。从博世为什么搞CAN,到物理层两根线怎么接,再到差分信号怎么抗干扰,最后是显性隐性电平怎么区分。这些都是后面所有内容的基础。

我个人建议你动手做个小实验:拿个CAN收发器(比如TJA1050),用示波器看看CAN_H和CAN_L的波形。亲眼看到显性位时两根线分开、隐性位时合在一起,比看十遍书都管用。