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