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协议基础的核心脉络画出来了。我建议你把它存下来,后面学仲裁、帧格式、错误处理的时候,随时回来对照。
1.6 小结
这一章咱们把CAN的根儿刨清楚了。从博世为什么搞CAN,到物理层两根线怎么接,再到差分信号怎么抗干扰,最后是显性隐性电平怎么区分。这些都是后面所有内容的基础。
我个人建议你动手做个小实验:拿个CAN收发器(比如TJA1050),用示波器看看CAN_H和CAN_L的波形。亲眼看到显性位时两根线分开、隐性位时合在一起,比看十遍书都管用。