3、CAN总线物理层:CAN收发器原理、CAN总线电平标准、终端电阻与线束设计、CAN总线故障模式

各位同学,咱们今天聊聊CAN总线的物理层。说实话,很多做上层软件的朋友容易忽略这一块,觉得不就是两根线嘛。但我得说,物理层要是没搞明白,你上层协议写得再漂亮,车跑起来照样出幺蛾子。我在项目里见过太多「软件没问题,硬件在打架」的案例了。

3.1 CAN收发器原理

CAN收发器,说白了就是控制器和总线之间的「翻译官」。控制器出来的是逻辑电平——0和1,但总线上的信号是差分信号。收发器负责把这两者互相转换。

我个人习惯把收发器分成三部分来看:

  • 发送器:把控制器输出的TX信号,转成CAN_H和CAN_L上的差分电压
  • 接收器:把总线上的差分电压,转成控制器能读的RX信号
  • 保护电路:防短路、防过压、防静电——嗯,这部分最容易被人忽略

我记得有一次调试,发现某个节点发不出数据。查了半天,发现是收发器的VCC引脚虚焊了。收发器没电,它怎么干活?你想想看,这种低级错误其实挺常见的。

关键点:CAN收发器不是简单的电平转换器。它还要负责驱动总线、检测总线状态、处理错误。选型时要注意速率、共模范围、EMC性能。

3.2 CAN总线电平标准

CAN总线用的是差分信号。为什么用差分?抗干扰能力强啊。你想想,两根线绞在一起,外界噪声同时耦合到两根线上,一减就没了。

标准CAN(ISO 11898-2)的电平定义如下:

信号状态 CAN_H电压 CAN_L电压 差分电压
显性(Dominant) 3.5V 1.5V 2.0V
隐性(Recessive) 2.5V 2.5V 0V

这里有个细节:显性电平对应逻辑0,隐性电平对应逻辑1。为什么这么设计?因为总线仲裁时,显性位会覆盖隐性位。说白了,谁先拉低总线谁就有话语权。

我在项目中遇到过一个问题:某款国产收发器在高温下,隐性电平漂到了2.6V。虽然差分电压还是0V,但共模电压变了。结果就是接收器误判,时不时冒出一些错误帧。后来换了原厂的收发器,问题就解决了。所以啊,收发器这东西,别只看datasheet上的参数,实际工况下的表现更重要。

小提示:测量CAN总线波形时,别只看差分信号。我建议同时看CAN_H和CAN_L对地的波形。有时候差分信号正常,但单端已经畸变了——这种问题示波器差分探头看不出来。

3.3 终端电阻与线束设计

终端电阻,每个做CAN的人都知道要加。但为什么要加?加多少?加在哪?

终端电阻的作用是消除信号反射。CAN总线是半双工通信,信号在线上传输,遇到阻抗不连续的地方就会反射。反射信号叠加到原始信号上,轻则影响时序,重则导致误码。

标准规定终端电阻为120Ω。为什么是120Ω?因为CAN总线的特征阻抗大约是120Ω。阻抗匹配了,反射就最小。

关于终端电阻的放置,我建议遵循以下原则:

  • 两个终端节点各放一个120Ω电阻,并联后等效60Ω
  • 电阻要放在总线的最远端,不是靠近控制器的地方
  • 不要用单个60Ω电阻代替两个120Ω——虽然等效电阻一样,但反射抑制效果差很多

线束设计方面,我踩过不少坑。简单说几点:

  • 双绞线:绞距要均匀,一般每米绞20-30圈。绞得越密,抗干扰越好,但成本也高
  • 线径:0.5mm²到1.0mm²比较常见。太细了压降大,太粗了不好施工
  • 分支长度:每个节点的分支(stub)尽量短,最好不超过30cm。分支长了,相当于在总线上加了个小天线

警告:千万不要在CAN总线上用普通平行线代替双绞线。我曾经在一个项目中图省事,用了平行线做临时测试。结果总线长度超过10米后,通信完全乱套。换成双绞线,问题立刻消失。这个教训让我记住了:CAN总线,线束不是随便拉的。

3.4 CAN总线故障模式

CAN总线在实际应用中,故障模式五花八门。我根据经验总结了几种最常见的:

3.4.1 总线短路

CAN_H对地短路、CAN_L对电源短路、CAN_H和CAN_L互短——这三种情况我都遇到过。短路后,总线要么一直显性,要么一直隐性,通信直接瘫痪。

检测方法很简单:用万用表量CAN_H和CAN_L对地的电压。正常时,隐性状态下都是2.5V左右。如果某根线电压异常,基本就是短路了。

3.4.2 终端电阻失效

终端电阻开路或阻值变化,会导致信号反射加剧。表现是:总线长度较短时没问题,一加长就出错误帧。

我建议在项目初期就测量终端电阻。断开所有节点电源,用万用表量CAN_H和CAN_L之间的电阻。正常应该是60Ω左右(两个120Ω并联)。如果测出来是120Ω,说明只有一个终端电阻在工作。

3.4.3 共模电压偏移

这个故障比较隐蔽。收发器的共模输入范围一般是-2V到+7V。如果地线接触不良,或者有外部干扰源,共模电压可能漂出这个范围。

我曾经遇到一个案例:某辆车的CAN总线在发动机启动瞬间出现大量错误帧。查了半天,发现是发动机ECU的地线接触不良,导致共模电压瞬间跳变到10V以上。收发器直接饱和,数据全丢了。

3.4.4 节点失效

某个节点的收发器损坏,可能会把总线一直拉低。这种故障最难排查,因为你要一个一个节点断开才能找到问题源。

我的做法是:先测量总线电阻,确认终端电阻正常。然后逐个断开节点,每断开一个就测一次总线电压。如果断开某个节点后电压恢复正常,那就是这个节点的问题。

避坑指南:我曾经在实验室里用长线缆模拟实车环境,结果发现通信不稳定。后来才意识到,实验室的线缆没有做屏蔽处理,环境中的电磁干扰全耦合进来了。所以,做CAN总线测试时,线束的屏蔽层一定要接地,而且要单点接地,避免形成地环路。

好了,关于CAN总线物理层的内容就讲到这里。说白了,物理层是CAN通信的基石。你上层协议栈写得再牛,物理层出了问题,一切都是白搭。下一章咱们聊聊CAN数据链路层,到时候会讲到帧格式、仲裁机制这些更「软」的东西。但请记住,软的东西永远建立在硬的基础之上。