1. CAN总线基础:起源、物理层与差分信号

各位同学,咱们今天聊聊CAN总线。说实话,这玩意儿在嵌入式领域太常见了。汽车、工业控制、机器人,到处都有它的影子。我最早接触CAN总线是在做车载诊断系统的时候,那会儿被CAN的可靠性惊到了——两根线就能在嘈杂的车间里稳定通信,确实有两把刷子。

1.1 CAN总线的起源

CAN的全称是Controller Area Network,控制器局域网。上世纪80年代,德国博世公司为了解决汽车内部电子控制单元(ECU)之间复杂的线束问题,搞出了这个东西。

你想想看,一辆车里有发动机控制器、变速箱控制器、ABS、安全气囊……每个模块都要互相通信。如果用传统的点对点连线,线束比车还重。博世当时的目标很明确:用一对双绞线,让所有节点都能互相说话。

关键时间线:

  • 1986年:博世在SAE大会上正式发布CAN协议
  • 1991年:CAN 2.0规范发布(A/B两部分)
  • 1993年:ISO 11898国际标准发布
  • 2003年:CAN FD(灵活数据速率)开始研发

我记得当年第一次看CAN 2.0规范,厚厚一本英文文档。说实话,硬啃下来挺痛苦的。但后来发现,核心思想其实很简单——多主总线、报文仲裁、错误检测。这三个词基本概括了CAN的精髓。

1.2 CAN总线物理层特性

物理层,说白了就是信号怎么在线上跑。CAN的物理层定义在ISO 11898-2标准里,咱们直接看关键参数。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度(1 Mbps时) 约40米 约500米
显性电平 CAN_H 3.5V / CAN_L 1.5V CAN_H > 3.6V / CAN_L < 1.4V
隐性电平 CAN_H 2.5V / CAN_L 2.5V CAN_H 0V / CAN_L 5V
终端电阻 120Ω(两端各一个) 无严格规定

这里有个坑,我必须要说。很多人以为CAN总线随便接两根线就能用。错!终端电阻必须加。不加终端电阻,信号反射会把波形搞得一塌糊涂。我曾经帮一个客户排查问题,CAN通信时好时坏,折腾了两天。最后发现——总线两端各缺了一个120Ω电阻。加上去,问题立刻消失。

避坑指南:

我曾经见过有人用100Ω代替120Ω终端电阻,短距离通信没问题,但总线一长就丢包。终端电阻的精度直接影响信号质量,建议用1%精度的120Ω电阻。别省这几毛钱。

1.3 CAN总线差分信号原理

为什么CAN总线抗干扰能力强?核心秘密就在差分信号。

普通单端信号,比如UART的TX/RX,信号电压是相对于GND测量的。如果外界有电磁干扰,GND电位一跳,信号就乱了。CAN不一样,它用两根线——CAN_H和CAN_L——传输互补信号。

逻辑怎么判断的?很简单:

  • 显性位(逻辑0): CAN_H = 3.5V,CAN_L = 1.5V,差分电压 = 2V
  • 隐性位(逻辑1): CAN_H = 2.5V,CAN_L = 2.5V,差分电压 = 0V

接收器只看CAN_H和CAN_L的电压差。外界干扰同时作用在两根线上,差分电压基本不变。这就是共模抑制——CAN的看家本领。

个人经验:

我习惯在调试CAN总线时,用示波器同时抓CAN_H和CAN_L的波形,然后看差分信号(用数学通道做CAN_H - CAN_L)。这样一眼就能看出信号质量好不好。如果差分信号的上升沿有毛刺,多半是终端电阻匹配有问题。

1.4 CAN总线拓扑结构

CAN总线是多主总线,所有节点都挂在同一对双绞线上。拓扑结构很简单——直线型,也叫总线型。

CAN总线拓扑结构 CAN_H CAN_L 120Ω 120Ω 节点1 节点2 节点3 节点4 注意: 总线两端必须各接一个 120Ω终端电阻

看到这张图了吗?所有节点都并联在总线上。节点可以随时加入或退出,不影响其他节点通信。这就是CAN的灵活性。

但要注意,总线长度和节点数量有限制。ISO 11898标准建议最多30个节点,实际应用中我见过挂50多个节点的,但速率得降下来。速率和距离的关系大致是:

  • 1 Mbps:最长40米
  • 500 kbps:最长100米
  • 250 kbps:最长200米
  • 125 kbps:最长500米
  • 50 kbps:最长1000米

核心要点总结:

  • CAN总线用差分信号传输,抗干扰能力强
  • 显性位(逻辑0)差分电压约2V,隐性位(逻辑1)差分电压0V
  • 总线两端必须接120Ω终端电阻
  • 拓扑结构为直线型,所有节点并联
  • 速率越高,总线长度越短

嗯,CAN总线的基础就这些。别小看这些物理层知识,我见过太多驱动问题最后都追溯到物理层——线没接好、电阻不对、共模电压超限。搞懂这些,后面写驱动才能心里有底。