1、CAN协议基础:CAN总线起源、CAN物理层特性、CAN差分信号与总线电平
各位同学,咱们今天正式开始聊CAN总线。说实话,每次讲这个我都挺感慨的——二十多年前我刚入行那会儿,CAN总线还是个新鲜玩意儿,现在呢?你随便拆开一辆车,里面没有CAN总线那才叫奇怪。好,咱们从头说起。
1.1 CAN总线的起源——为什么会有它?
上世纪80年代,汽车电子开始爆发。什么电喷、ABS、安全气囊,一个接一个往上堆。问题来了——每个模块之间要通信,线束多得吓人。我记得有个老工程师跟我吐槽过,当时一辆豪华车的线束拉直了能有几公里长,重量比发动机还重。
这显然不是个办法。于是1986年,德国博世公司搞出了CAN总线——Controller Area Network,控制器局域网。说白了,就是让所有ECU共用两根线来通信。你想想看,原来每个信号都要单独拉一根线,现在全挤到两根线上,这效率提升可不是一星半点。
CAN总线的核心设计目标:
- 减少线束——从几十根减到两根
- 高可靠性——汽车环境可不是闹着玩的
- 实时性——刹车信号不能等
- 多主通信——谁有事谁说话,不用等主机点名
1993年,CAN总线正式成为国际标准ISO 11898。嗯,这个标准号大家记住,后面咱们会反复提到它。
1.2 CAN物理层特性——两根线能干啥?
CAN物理层,说白了就是规定信号怎么在线上跑。我见过不少新手,上来就写CAN驱动,结果连物理层的基本参数都搞不清楚,调试的时候一脸懵。
咱们先看几个关键参数:
| 参数 | 高速CAN(ISO 11898-2) | 低速CAN(ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 总线长度 | 40米 @ 1 Mbps | 500米 @ 125 kbps |
| 总线电平 | 显性/隐性 | 显性/隐性 |
| 终端电阻 | 120Ω × 2 | 可选 |
这里有个坑,我当年就踩过——终端电阻。高速CAN总线两端必须各接一个120Ω的电阻,这是用来消除信号反射的。有一次我调试一个ECU,怎么都通信不上,折腾了两天,最后发现是终端电阻没焊。嗯,从那以后我焊板子第一件事就是量终端电阻。
1.3 CAN差分信号——为什么是两根线?
好,咱们聊聊核心问题:为什么CAN要用两根线?
答案很简单——抗干扰。汽车里电磁环境有多恶劣?发动机点火、电机启停、各种继电器,那噪声大得吓人。单端信号在这种环境里根本活不下来。
CAN用的是差分信号,两根线分别叫CAN_H和CAN_L。信号不是看单根线的电压,而是看两根线的电压差。你想想看,如果外部有个强电磁干扰,它同时作用在两根线上,差值是基本不变的。这就是所谓的共模抑制。
个人经验:我在做商用车项目时,遇到过总线在发动机启动瞬间丢帧的问题。排查下来发现是CAN_H和CAN_L的走线长度不一致,导致共模抑制效果变差。后来强制要求PCB上这两根线必须等长走线,问题就解决了。
1.4 总线电平——显性和隐性
CAN总线上只有两种状态:显性(Dominant)和隐性(Recessive)。
咱们看具体电平值:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 隐性(逻辑1) | 2.5V | 2.5V | 0V |
| 显性(逻辑0) | 3.5V | 1.5V | 2V |
这里有个很有意思的设计——显性电平会覆盖隐性电平。什么意思?如果两个节点同时发送,一个发显性一个发隐性,总线最终呈现的是显性。这就是CAN总线仲裁的基础,后面咱们会详细讲。
注意:千万不要把CAN_H和CAN_L接反了!我见过不止一个新手,把CAN_H接到CAN_L上,结果总线电平完全反了,通信直接瘫痪。接好线之后,用万用表量一下CAN_H和CAN_L之间的电阻,正常应该在60Ω左右(两个120Ω并联)。
说到这儿,我想起一个项目。当时在测试一个ECU的CAN通信,示波器一看,波形乱七八糟。排查了半天,发现是CAN收发器的供电电压不对——本该5V供电,结果只有3.3V。收发器工作在非正常状态,电平都偏了。所以啊,遇到CAN通信问题,先查供电,再查终端电阻,最后查线序。这个顺序我用了十几年,基本没失手过。
1.5 小结
今天咱们聊了CAN总线的起源、物理层特性、差分信号和总线电平。说白了,CAN总线之所以能在汽车电子领域称霸这么多年,靠的就是它的可靠性——两根线、差分信号、显性隐性设计,每一个细节都是为了在恶劣环境下稳定工作。
下一节咱们会聊CAN的数据链路层,包括帧格式、仲裁机制这些。嗯,那才是真正有意思的部分。
课后小作业:找一块带CAN接口的开发板,用示波器抓一下CAN_H和CAN_L的波形。分别观察总线空闲时和通信时的电平变化。相信我,亲眼看到波形比看一百遍书都管用。