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的灵活性。
但要注意,总线长度和节点数量有限制。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总线的基础就这些。别小看这些物理层知识,我见过太多驱动问题最后都追溯到物理层——线没接好、电阻不对、共模电压超限。搞懂这些,后面写驱动才能心里有底。