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总线拓扑结构。你可以看到节点怎么挂上去,终端电阻放哪。

CAN总线典型拓扑结构 CAN_H CAN_L 120Ω 120Ω 节点1 节点2 节点3 节点4 总线两端各一个120Ω终端电阻 中间节点通过支线挂接到总线上 支线长度建议不超过30cm

1.3 CAN总线应用领域概览

CAN总线最早是为汽车设计的,但现在它的应用范围早就超出了汽车。我这些年接触过的项目,覆盖了好几个行业。

汽车电子: 这是CAN的老本行。发动机控制、变速箱、ABS、车身控制、仪表盘、空调……一辆中高端车上有几十个ECU,全靠CAN总线连在一起。我记得2015年做的一个车机项目,光CAN报文就定义了200多条。

工业自动化: 工厂里的PLC、伺服驱动器、传感器、执行器,很多都用CANopen协议(基于CAN的高层协议)。我有个朋友做纺织机械,整条生产线全是CAN总线,稳定跑了七八年没出过大问题。

医疗设备: 手术机器人、CT机、监护仪,内部通信也常用CAN。为什么?因为CAN的实时性好,优先级仲裁能保证关键数据不丢。你想想,手术中如果通信断了,后果不堪设想。

工程机械: 挖掘机、起重机、农用机械,这些设备工作环境恶劣,振动大、温度高、灰尘多。CAN总线的差分信号和强抗干扰能力,正好适合这种环境。

航空航天: 飞机上的航电系统、卫星内部通信,也有CAN的身影。不过航空级CAN要求更高,器件要经过筛选和认证。

一句话总结: 只要是需要多个控制器之间可靠、实时通信的场景,CAN总线都是首选方案之一。它不追求高带宽,但追求高可靠和低延迟。