1. CAN总线基础回顾:CAN协议起源、物理层特性、差分信号与总线电平
各位同学,咱们今天聊聊CAN总线的老底子。说实话,我做了十几年嵌入式,接触过的总线协议少说也有七八种,但CAN总线在我心里的地位一直很特殊。它不像以太网那么“重”,也不像UART那么“裸”,它刚好卡在工业现场最需要的位置上。
1.1 CAN协议的起源——为什么会有这个东西?
上世纪80年代初,汽车里的电子设备越来越多。你想想看,发动机、变速箱、ABS、仪表盘……每个模块之间都要连一堆线。那时候的车,线束比人胳膊还粗。德国Bosch公司看不下去了,1983年开始研发一种新的串行总线,1986年正式推出CAN协议。
我个人觉得,CAN协议最牛的地方在于它的设计哲学:用最少的线,干最多的事。两根线,就能让几十个节点互相通信。而且它天生就带错误检测和重发机制,这在当时简直是黑科技。
核心要点:CAN协议最初是为汽车设计的,后来被工业自动化、医疗设备、机器人等领域广泛采用。它的设计目标是:高可靠性、实时性、低成本。
1.2 物理层特性——两根线能传多远?
CAN总线的物理层,说白了就是一对双绞线。我习惯叫它们CAN_H和CAN_L。这两根线承载了所有通信任务。
咱们来看看关键参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 最大通信距离 | 40米 @ 1Mbps | 距离越长,速率越低 |
| 最大节点数 | 110个(标准) | 取决于收发器驱动能力 |
| 总线电平 | 显性0V / 隐性2.5V | 差分信号 |
| 终端电阻 | 120Ω | 两端各一个 |
嗯,这里要注意:终端电阻绝对不能省。我曾经在一个项目里,调试了整整两天,发现总线波形乱七八糟,最后发现是终端电阻焊错了位置。从那以后,我每次画板子都会再三确认终端电阻的位置。
1.3 差分信号——为什么CAN总线抗干扰这么强?
这个问题我经常被问到。其实道理很简单:差分信号传的是电压差,不是绝对电压。
你看,CAN_H和CAN_L两根线,在总线上是绞在一起的。外部干扰来了,两根线上受到的干扰几乎一样。接收器只看两根线的电压差,干扰就被抵消掉了。
我的经验:在电机驱动项目里,CAN总线旁边就是大功率IGBT,开关噪声特别大。如果用单端信号,数据早就被淹没了。但CAN总线稳如老狗,这就是差分信号的优势。
具体来说,CAN总线的电平状态有两种:
- 显性状态(Dominant):CAN_H比CAN_L高约2V,逻辑上代表“0”
- 隐性状态(Recessive):CAN_H和CAN_L电压相等(约2.5V),逻辑上代表“1”
为什么会这样设计?因为总线仲裁需要。多个节点同时发送时,显性位会覆盖隐性位。这个机制让CAN总线不需要像以太网那样做CSMA/CD碰撞检测,效率高得多。
1.4 总线电平——你真的看懂波形了吗?
我记得刚入行时,用示波器看CAN总线波形,一脸懵。两根线,一会儿高一会儿低,到底怎么看?
其实很简单:
隐性状态:CAN_H = 2.5V,CAN_L = 2.5V,差分电压 = 0V
显性状态:CAN_H = 3.5V,CAN_L = 1.5V,差分电压 = 2V
你拿示波器看CAN_H和CAN_L的波形,会发现它们是对称的。一个上去,另一个就下来。这就是差分信号的典型特征。
避坑指南:我曾经遇到过一个案例,总线波形看起来正常,但通信就是不稳定。后来发现是CAN_H和CAN_L的线长不一致,导致信号到达时间有偏差。记住:两根线必须等长,否则差分信号的优势就没了。
1.5 物理层的关键器件——收发器
MCU出来的信号是TTL电平,不能直接挂到CAN总线上。中间需要一颗收发器芯片。常用的有TJA1050、SN65HVD230等。
收发器干的事很简单:
- 发送时:把TTL电平转成差分信号
- 接收时:把差分信号转回TTL电平
我建议新手选型时注意两点:一是供电电压(5V还是3.3V),二是速率是否支持CAN FD。如果你打算后续升级到CAN FD,最好直接选支持CAN FD的收发器,省得以后换芯片。
1.6 小结——打好基础再上路
这一章的内容,说白了就是CAN总线的“地基”。物理层搞不清楚,后面讲协议、讲帧结构、讲CAN FD升级,你都会觉得云里雾里。
我个人觉得,学CAN总线最好的方法就是拿示波器看波形。找一块开发板,写个简单的发送程序,看看CAN_H和CAN_L的波形长什么样。看懂了波形,你就掌握了CAN总线的一半。
下一章,咱们聊聊CAN协议的数据链路层——帧结构、仲裁机制、错误处理。这些东西才是CAN总线的灵魂。