第一章:CAN协议基础
1.1 CAN总线的起源——从汽车里走出来的明星
说起CAN总线,得从上世纪80年代讲起。那时候汽车电子开始爆发,车里到处都是ECU(电子控制单元),每个ECU之间要通信,线束多得吓人。我记得有个老工程师跟我开玩笑:一辆豪华车的线束拉直了,能绕地球半圈?夸张了点,但确实是个大问题。
1983年,德国博世公司开始琢磨:能不能搞一套总线,让所有ECU都挂在一根线上?于是CAN(Controller Area Network)诞生了。1986年正式发布,1993年成为国际标准ISO 11898。说白了,CAN就是为实时控制而生的通信协议。
为什么选它做医疗设备?我做过好几款监护仪和输液泵,CAN的实时性和可靠性,在医疗场景下太重要了。你想想看,手术台上的设备要是通信卡顿一下,后果不堪设想。
1.2 物理层特性——差分信号才是王道
CAN的物理层,核心就是差分信号传输。两根线:CAN_H和CAN_L。信号靠两根线的电压差来传递。
为什么会这样?因为工业现场和医疗环境里,电磁干扰太常见了。差分信号天然抗共模干扰——干扰信号同时作用在两根线上,差值不变,信号就保住了。我在做呼吸机项目时,电机一启动,单端信号直接乱跳,换成CAN总线后稳如老狗。
总线电平分两种状态:
- 显性电平(Dominant):CAN_H比CAN_L高2V左右,逻辑0
- 隐性电平(Recessive):CAN_H和CAN_L电压相等,逻辑1
注意了,显性电平会覆盖隐性电平。这就是CAN总线仲裁的基础——谁先发0,谁就赢。嗯,这里要记住:总线空闲时是隐性电平。
关键参数速查表:
| 参数 | 典型值 | 说明 |
|---|---|---|
| CAN_H显性电压 | 3.5V | 相对于GND |
| CAN_L显性电压 | 1.5V | 相对于GND |
| 差分电压(显性) | 2.0V | CAN_H - CAN_L |
| 隐性电压 | 2.5V | 两根线相等 |
| 最大速率 | 1Mbps | ISO 11898-2 |
| 最大节点数 | 110个 | 取决于收发器 |
1.3 CAN vs RS485——别选错了
很多新手问我:CAN和RS485看起来差不多,都是差分信号,能不能互换?我的回答是:千万别!
我做过一个血透机项目,前期用了RS485,后来发现多主通信根本搞不定。RS485是主从结构,一个主机轮询所有从机。CAN不一样,它是多主总线,任何节点随时可以发数据。
来,直接对比:
| 对比项 | CAN | RS485 |
|---|---|---|
| 通信方式 | 多主,任意节点可主动发 | 主从,主机轮询 |
| 仲裁机制 | 硬件自动仲裁,无损 | 无仲裁,需软件处理 |
| 错误处理 | 5种错误检测,自动重发 | 无内置错误处理 |
| 实时性 | 高,确定性延迟 | 低,取决于轮询周期 |
| 最大节点 | 110个 | 256个(实际少) |
| 最大距离 | 40m@1Mbps | 1200m@100kbps |
| 成本 | 稍高 | 低 |
我的选择建议:
- 医疗设备内部通信(监护仪、输液泵、呼吸机)→ 选CAN
- 长距离、低速、简单传感器采集 → 选RS485
- 需要多主实时控制 → 必须CAN
1.4 避坑指南——我踩过的那些坑
做CAN设计,有几个地方特别容易翻车:
- 终端电阻不能省:CAN总线两端必须各加一个120Ω电阻。我曾经偷懒没加,结果通信时好时坏,查了两天才发现是信号反射问题。
- 共模电压范围:CAN收发器有共模输入范围,一般是-2V到+7V。如果设备间地电位差太大,通信会出错。我建议用隔离CAN收发器,医疗设备尤其需要。
- 线缆选择:别用普通双绞线,要用特性阻抗120Ω的CAN专用线。我见过有人用网线代替,短距离还行,长了就完蛋。
⚠️ 重要提醒:
医疗设备通过CF(心脏浮地)认证时,CAN总线必须做电气隔离。我见过一个团队没注意这个,EMC测试直接挂了。隔离方案推荐:ISO1050或ADM3053,带隔离的CAN收发器。
1.5 小结
CAN总线从汽车走向医疗,靠的是它的实时性、可靠性和多主能力。物理层的差分信号设计,让它在强干扰环境下依然稳定。和RS485相比,CAN更适合需要实时响应的医疗设备内部通信。
下一章,我会讲CAN的数据链路层——帧结构、仲裁机制、错误处理。这些才是CAN真正厉害的地方。到时候我会拿一个真实的输液泵项目做例子,把报文抓出来给你看。
嗯,今天就到这儿。有问题随时交流。