一、CAN总线概述:从起源到物理层
大家好,我是老张。做嵌入式通信这块十几年了,今天咱们聊聊CAN总线。说实话,CAN总线是我个人最喜欢的一种现场总线——它不像RS485那样需要你操心太多协议细节,也不像以太网那样复杂。它就是个"刚刚好"的工业通信方案。
1.1 CAN总线的起源:为什么会有它?
上世纪80年代,汽车电子开始爆发。那时候一辆车里有几十个ECU(电子控制单元),每个ECU之间要互相通信。你想想看,如果每个ECU都单独拉线,那整车线束得有多重?我记得有个数据,当时一辆豪华车的线束总重量能超过50公斤——这显然不合理。
1983年,德国博世公司开始研发一种新的串行通信总线。1986年,他们正式发布了CAN(Controller Area Network)总线协议。嗯,这里要注意,CAN总线最初的目标就是汽车领域,解决的是"多个控制器之间如何可靠、实时地交换数据"这个问题。
我在2010年做过一个项目,给某国产车厂做BMS(电池管理系统)。那时候CAN总线已经非常成熟了,但说实话,很多工程师对它的理解还停留在"能用就行"的层面。结果呢?通信丢帧、总线冲突、节点掉线...各种问题层出不穷。所以,理解CAN总线的底层原理,真的很重要。
1.2 CAN总线的特点:它凭什么这么能打?
CAN总线能活到现在,而且越活越好,靠的是这几个硬核特点:
- 多主站通信:任何节点都可以主动发消息,不需要主从轮询。这跟RS485那种"一问一答"的模式完全不同。
- 实时性强:优先级高的消息,最坏情况下的延迟时间是可以计算出来的。这在工业控制中太重要了。
- 错误检测机制强:CRC校验、位填充、格式检查、应答确认...五层错误检测机制,误码率低到10^-11级别。
- 自动重发:如果消息发送失败,硬件会自动重发,不需要软件干预。
- 差分信号传输:抗干扰能力强,适合工业现场。
我个人最看重的特点:CAN总线的"非破坏性位仲裁"机制。多个节点同时发送时,优先级高的节点自动获得总线控制权,优先级低的节点自动退出发送。这个机制让CAN总线在实时性上吊打很多其他总线。
1.3 CAN总线 vs RS485:到底选哪个?
这个问题我几乎每次培训都会被问到。说实话,这两个东西不是同一个层面的——CAN是完整的通信协议,RS485只是物理层标准。但既然大家经常对比,我就说说我的看法。
| 对比项 | CAN总线 | RS485 |
|---|---|---|
| 通信方式 | 多主,任意节点可主动发 | 主从,需要主机轮询 |
| 最大节点数 | 理论上无限制(实际受驱动能力限制,通常110个) | 通常32个(可扩展) |
| 通信距离 | 40m@1Mbps,1km@50kbps | 1200m@115200bps |
| 错误处理 | 硬件自动检测+重发 | 需要软件实现 |
| 实时性 | 高(优先级仲裁) | 低(轮询延迟) |
| 成本 | 较高(需要CAN控制器) | 低(UART即可) |
| 典型应用 | 汽车、工业控制、医疗设备 | 楼宇自动化、仪表通信 |
我的建议:如果你的系统需要实时响应、节点数较多、或者对可靠性要求高,选CAN。如果只是简单的传感器采集、成本敏感、通信速率要求不高,RS485完全够用。我曾经在一个项目中用RS485做电机控制,结果因为轮询延迟导致电机响应不及时,后来换成CAN,问题立刻解决。
1.4 CAN总线物理层:信号是怎么跑的?
CAN总线的物理层,说白了就是两根线——CAN_H和CAN_L。它用的是差分信号传输,两根线上的电压差代表逻辑电平。
具体来说:
- 显性电平(逻辑0):CAN_H比CAN_L高2V左右(CAN_H≈3.5V,CAN_L≈1.5V)
- 隐性电平(逻辑1):CAN_H和CAN_L电压相等(约2.5V)
为什么会这样设计?你想想看,差分信号天然抗共模干扰。工业现场电机启动、变频器工作,共模噪声能到几十伏。但CAN收发器只关心两根线的电压差,共模噪声就被抵消掉了。
注意:CAN总线两端必须加120Ω终端电阻。这个电阻的作用是匹配阻抗、消除信号反射。我曾经见过一个现场,工程师忘了加终端电阻,结果总线长度超过100米时,通信完全乱套。加了电阻之后,一切恢复正常。
另外,CAN总线的拓扑结构是总线型,也就是一根主干线,所有节点都挂在这根线上。分支线(stub)长度要尽量短,一般不超过30cm。为什么?因为分支线会产生信号反射,影响通信质量。我在一个项目中为了布线方便,把分支线拉到了1米多,结果高速通信时频繁出错。后来把分支线剪短到20cm,问题解决。
最后说说CAN收发器。常用的有TJA1050、SN65HVD230等。选型时要注意:
- 工作电压(3.3V还是5V)
- 速率支持(最高1Mbps)
- 是否支持待机模式(低功耗场景需要)
- ESD防护等级(工业现场建议选高防护的)
嗯,物理层就这些。说白了,CAN总线的物理层并不复杂,但细节决定成败。终端电阻、分支线长度、收发器选型,这些看似不起眼的地方,往往是项目出问题的根源。
一句话总结:CAN总线用两根差分线,配合120Ω终端电阻,实现了高速、可靠、抗干扰的物理层通信。理解了这个基础,后面的协议层就好办了。