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

大家好,我是你们的老朋友。今天咱们来聊聊CAN总线最底层的那些事儿。说实话,我接触CAN总线快二十年了,每次带新人时,我都会先问一句:「你知道CAN为什么能抗干扰这么强吗?」很多人答不上来。嗯,这恰恰是今天要讲的核心。

1.1 CAN协议的起源——从一场车祸说起

CAN总线的诞生,其实挺有意思的。上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制……每个模块之间都要拉一堆线。你想想看,一辆车里的线束能有多重?我记得有个数据,当时豪华车的线束总重能超过50公斤。

更麻烦的是,线多了就容易出故障。有一次我在项目里听老工程师讲,某款车因为线束磨损导致刹车信号偶尔丢失,差点出了大事。嗯,这就是博世公司开发CAN总线的初衷——用两根线代替几十根线,而且还要保证可靠性。

1986年,博世在SAE大会上正式发布了CAN协议。说白了,就是给汽车里的各个电子模块搭了一条「公共电话线」。谁想说话,谁就抢线,但大家都有规矩——这就是后面要讲的仲裁机制。

核心要点:CAN总线最初是为了解决汽车电子系统线束过多、可靠性差的问题而设计的。它追求的是「少线、可靠、实时」。

1.2 物理层特性——两根线的大学问

CAN总线的物理层,说白了就是两根线:CAN_H和CAN_L。但你别小看这两根线,里面的门道可多了。

先说说电平标准。CAN总线有两种状态:显性(Dominant)和隐性(Recessive)。

  • 显性电平:CAN_H比CAN_L高2V左右(比如CAN_H=3.5V,CAN_L=1.5V),逻辑上代表「0」
  • 隐性电平:CAN_H和CAN_L电压接近(比如都是2.5V),逻辑上代表「1」

这里有个关键点:显性电平会「覆盖」隐性电平。什么意思呢?只要有一个节点发送显性位,总线就是显性状态。这就像一群人开会,只要有人大声说话(显性),其他人就得安静(隐性)。

避坑指南:我曾经在一个项目中,发现总线偶尔出现通信错误。排查了半天,原来是CAN_H和CAN_L的线缆长度不一致,导致信号到达时间有偏差。记住:CAN总线对线缆的对称性要求很高,两根线必须绞在一起,长度尽量相等。

再说说终端电阻。CAN总线两端必须各接一个120Ω的电阻。为什么是120Ω?我刚开始做CAN开发时也纳闷。后来才明白,这是为了匹配线缆的特性阻抗,防止信号反射。

你可以把终端电阻想象成「消音器」。没有它,信号会在总线两端来回弹跳,就像山谷里的回声一样,把数据包搅得乱七八糟。

参数 典型值 说明
总线长度 ≤40m(1Mbps时) 速率越高,距离越短
终端电阻 120Ω ± 1% 两端各一个
显性电平差 1.5V ~ 3.0V CAN_H - CAN_L
隐性电平 2.5V(共模) CAN_H ≈ CAN_L
最大节点数 30 ~ 110 取决于收发器驱动能力

1.3 差分信号原理——为什么CAN这么抗造?

好,到了今天的重头戏。为什么CAN总线能在发动机旁边、在电磁干扰那么强的环境里稳定工作?答案就是差分信号。

差分信号,说白了就是「用两根线的电压差来表示数据」。你想想看,如果只用一根线对地传输信号,比如0V代表0,5V代表1。这时候旁边有个大电机启动,地线上瞬间窜进来2V的噪声——完了,0V变成了2V,接收端以为收到了「1」,数据就错了。

但CAN总线不一样。它看的是CAN_H和CAN_L的差值。噪声进来时,两根线上的电压会同时升高或降低同样的幅度。比如都升高了2V,但差值没变——CAN_H - CAN_L还是原来的值。这就是所谓的「共模抑制」。

举个例子:假设CAN_H=3.5V,CAN_L=1.5V,差值是2V。突然来了个2V的共模干扰,CAN_H变成5.5V,CAN_L变成3.5V。你算算差值?还是2V。数据纹丝不动。

我个人习惯用一句话给新人解释:「差分信号就像两个人抬杠,不管地面怎么晃,他俩的差距不变。」

当然,差分信号也不是万能的。如果两根线受到的干扰不一样(比如一根靠近电源线,另一根远离),就会出现「差模干扰」。这时候数据就可能出错。所以布线时一定要让CAN_H和CAN_L紧紧绞在一起,保证它们「同甘共苦」。

重要提醒:我曾经在一个项目中,为了省事把CAN线和其他电源线走在了同一个线槽里。结果通信时好时坏,查了三天才发现是电源线的谐波干扰了CAN信号。记住:CAN线要远离大电流、高频信号线,至少保持10cm以上的距离。

1.4 物理层的其他细节

除了上面这些,还有几个点值得提一下。

关于总线拓扑:CAN总线最推荐的是直线型拓扑,也就是一根主干线,所有节点都挂在这根线上。为什么?因为分支线(stub)会产生信号反射。我见过一个项目,为了布线方便,搞了个星型拓扑,结果通信速率一上去就丢包。最后老老实实改回直线型,问题就解决了。

关于收发器:常见的CAN收发器有TJA1050、SN65HVD230等。它们负责把逻辑电平转换成差分信号。选型时要注意:

  • 工作电压(3.3V还是5V)
  • 速率支持(最高1Mbps)
  • 是否支持待机模式(低功耗场景需要)

关于总线长度和速率的关系:这个很多人容易搞混。我直接给个经验值:

  • 1Mbps时,总线长度最好不超过40米
  • 500kbps时,可以到100米左右
  • 250kbps时,200米没问题
  • 125kbps时,500米也能跑

为什么会这样?因为速率越高,一个位的时间就越短。如果总线太长,信号在线上传播的时间就占了位时间的一大部分,容易导致采样错误。

个人经验:我一般会留20%的余量。比如项目需要500kbps、80米,我会按500kbps、60米来设计。这样即使线缆质量差一点,或者温度变化导致传播速度变化,系统也能稳定工作。

小结

好了,今天的内容就到这里。咱们回顾一下:

  • CAN总线诞生于汽车电子对可靠性和简洁性的需求
  • 物理层用两根线(CAN_H和CAN_L)传输,通过显性/隐性电平表示数据
  • 差分信号是CAN抗干扰的核心武器,共模噪声不影响数据
  • 终端电阻、线缆对称性、拓扑结构都是实际项目中容易踩坑的地方

下一章,我会跟大家聊聊CAN总线的数据链路层——帧格式、仲裁机制、错误检测这些硬核内容。到时候咱们再细聊。

公众号:蓝海资料掘金营,微信deep3321