第一章: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.0VCAN_H - CAN_L
隐性电压2.5V两根线相等
最大速率1MbpsISO 11898-2
最大节点数110个取决于收发器

1.3 CAN vs RS485——别选错了

很多新手问我:CAN和RS485看起来差不多,都是差分信号,能不能互换?我的回答是:千万别!

我做过一个血透机项目,前期用了RS485,后来发现多主通信根本搞不定。RS485是主从结构,一个主机轮询所有从机。CAN不一样,它是多主总线,任何节点随时可以发数据。

来,直接对比:

对比项CANRS485
通信方式多主,任意节点可主动发主从,主机轮询
仲裁机制硬件自动仲裁,无损无仲裁,需软件处理
错误处理5种错误检测,自动重发无内置错误处理
实时性高,确定性延迟低,取决于轮询周期
最大节点110个256个(实际少)
最大距离40m@1Mbps1200m@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真正厉害的地方。到时候我会拿一个真实的输液泵项目做例子,把报文抓出来给你看。

嗯,今天就到这儿。有问题随时交流。