1. 课程导入
大家好,我是老周。做嵌入式十几年,CAN总线算是我打交道最多的通信协议之一。今天咱们聊聊CAN总线的根儿——它从哪来,物理上长什么样,又用在哪些地方。
说实话,我刚入行那会儿,对CAN也是一知半解。直到有一次调试一个电机控制器,通信死活不通,折腾了两天才发现是终端电阻没焊对。嗯,从那以后,我老老实实把CAN的物理层啃了一遍。
1.1 CAN协议的起源
CAN,全称Controller Area Network,控制器局域网。这玩意儿是1986年由德国博世公司发明的。你想想看,那时候汽车电子刚起步,车里各种ECU(电子控制单元)越来越多,线束乱得像蜘蛛网。博世就想:能不能搞一条总线,让所有节点都挂上去通信?
于是,CAN总线诞生了。1987年,Intel发布了第一颗CAN控制器芯片——82526。我记得当时看老资料,这颗芯片的封装还是DIP40的,现在年轻人估计都没见过。
CAN协议的关键设计目标:
- 高可靠性:抗电磁干扰,适合车载环境
- 实时性:优先级仲裁,保证紧急消息不丢
- 低成本:双线差分,布线简单
- 多主架构:任何节点都能主动发消息
后来,CAN协议被标准化为ISO 11898系列。目前主流的有两个版本:
| 版本 | 标准 | 数据速率 | 特点 |
|---|---|---|---|
| CAN 2.0A | 标准帧 | 最高1 Mbps | 11位标识符 |
| CAN 2.0B | 扩展帧 | 最高1 Mbps | 29位标识符,兼容2.0A |
我个人习惯把CAN 2.0B叫做“全功能版”。项目中只要条件允许,我一般直接上2.0B,省得后面扩展标识符不够用。
1.2 CAN总线物理层特性
物理层这东西,说白了就是信号怎么在线上跑。CAN总线用的是差分信号,两条线:CAN_H和CAN_L。
为什么会用差分?因为抗干扰能力强。你想想,车里的点火线圈、电机、继电器,哪个不是电磁干扰源?差分信号共模抑制比高,干扰来了两条线一起跳,差值不变,数据就丢不了。
经验之谈: 我在一个农机项目里遇到过,CAN通信距离超过100米,速率还设了500 kbps。结果丢包率高达30%。后来降到125 kbps,加了两端120Ω终端电阻,通信就稳了。记住:速率和距离是反比关系。
CAN总线的物理层关键参数:
- 总线电平: 显性(Dominant)对应逻辑0,隐性(Recessive)对应逻辑1
- 差分电压: 显性时CAN_H比CAN_L高约2V,隐性时两者电压接近
- 终端电阻: 总线两端各接一个120Ω电阻,用于阻抗匹配
- 最大节点数: 理论上112个,实际受驱动能力限制,一般不超过30个
这里有个坑,我踩过。终端电阻不是随便焊的。如果总线只有两个节点,两端各一个120Ω,总负载就是60Ω。如果节点多了,每个节点还带终端电阻,总线负载就偏了,信号反射严重。我曾经在一个项目里,8个节点全焊了120Ω电阻,结果总线直接拉不起来了。
注意: CAN总线两端各需且仅需一个120Ω终端电阻。中间节点不要加终端电阻。如果使用CAN FD(灵活数据速率),终端电阻可能需要根据速率调整。
下面这张图,是我画的一个典型CAN总线拓扑结构。你可以看到节点怎么挂上去,终端电阻放哪。
1.3 CAN总线应用领域概览
CAN总线最早是为汽车设计的,但现在它的应用范围早就超出了汽车。我这些年接触过的项目,覆盖了好几个行业。
汽车电子: 这是CAN的老本行。发动机控制、变速箱、ABS、车身控制、仪表盘、空调……一辆中高端车上有几十个ECU,全靠CAN总线连在一起。我记得2015年做的一个车机项目,光CAN报文就定义了200多条。
工业自动化: 工厂里的PLC、伺服驱动器、传感器、执行器,很多都用CANopen协议(基于CAN的高层协议)。我有个朋友做纺织机械,整条生产线全是CAN总线,稳定跑了七八年没出过大问题。
医疗设备: 手术机器人、CT机、监护仪,内部通信也常用CAN。为什么?因为CAN的实时性好,优先级仲裁能保证关键数据不丢。你想想,手术中如果通信断了,后果不堪设想。
工程机械: 挖掘机、起重机、农用机械,这些设备工作环境恶劣,振动大、温度高、灰尘多。CAN总线的差分信号和强抗干扰能力,正好适合这种环境。
航空航天: 飞机上的航电系统、卫星内部通信,也有CAN的身影。不过航空级CAN要求更高,器件要经过筛选和认证。
一句话总结: 只要是需要多个控制器之间可靠、实时通信的场景,CAN总线都是首选方案之一。它不追求高带宽,但追求高可靠和低延迟。