第1章 CAN总线基础:协议概述、物理层特性与总线拓扑
各位同学,咱们今天正式开讲。CAN总线这东西,我做了十几年嵌入式,从最初的8位单片机一路做到现在的多核处理器,它始终是工业通信的“硬通货”。你想想看,一辆车上几十个ECU,一个工厂里成百上千的传感器和执行器,靠什么连起来?靠CAN。它不花哨,但可靠。
这一章,咱们先把地基打牢。我会从协议框架、物理层信号,一直聊到总线怎么搭。嗯,都是干货。
1.1 CAN协议概述——它到底解决了什么问题?
CAN,全称Controller Area Network,控制器局域网。上世纪80年代由Bosch公司发明,初衷就是给汽车省线束。我记得最早接触CAN是在一个车载空调项目里,那会儿还在用RS485,线多、故障率高,换成CAN之后,整个系统清爽多了。
CAN协议的核心特点,我总结为四点:
- 多主总线:任何节点都可以主动发消息,不需要主机轮询。说白了,谁有事谁说话。
- 基于优先级的总线仲裁:多个节点同时发消息时,ID小的优先。不会丢数据,不会冲突。
- 短帧结构:一帧最多8字节数据。为什么这么短?为了实时性。你想想,如果一帧传几百字节,高优先级的紧急消息得等多久?
- 强大的错误处理:5种错误检测机制,加上自动重发。我在项目里见过,总线被干扰得波形都花了,CAN节点硬是自己恢复过来了。
关键概念:CAN 2.0A vs CAN 2.0B
- CAN 2.0A:标准帧,11位ID。日常够用。
- CAN 2.0B:扩展帧,29位ID。适合大型网络。
- 两者物理层完全一样,只是ID长度不同。我建议新项目直接上2.0B,兼容性更好。
1.2 物理层特性——差分信号才是灵魂
CAN的物理层,说白了就是一对双绞线:CAN_H和CAN_L。它用差分信号传输,这是它抗干扰的底气。
什么叫差分信号?就是两个线上的电压差代表逻辑状态。CAN总线只有两个状态:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (CAN_H - CAN_L) |
|---|---|---|---|
| 显性 (Dominant) | 约3.5V | 约1.5V | 约2.0V |
| 隐性 (Recessive) | 约2.5V | 约2.5V | 约0V |
显性位会“覆盖”隐性位。这就是总线仲裁的物理基础——谁发显性位,谁就赢。
个人经验:我曾经在一个电机驱动项目里,CAN通信老是丢帧。查了半天,发现CAN_H和CAN_L线接反了。差分信号极性反了,节点还能勉强通信,但错误帧满天飞。所以,布线时一定标清楚颜色,别省这一步。
再说说速率和距离的关系。CAN总线的速率不是随便定的:
- 1 Mbps:总线长度不超过40米。适合车内、机柜内。
- 250 kbps:可以到250米左右。工厂自动化常用。
- 125 kbps:500米以上。楼宇控制、远距离传感。
为什么会这样?因为CAN是“线与”结构,信号在总线上传播需要时间。速率越高,位时间越短,总线长度就得缩短。我建议你按这个经验公式估算:总线长度(米) × 速率(Mbps) ≤ 40。
1.3 总线拓扑与终端电阻
CAN总线拓扑很简单——直线型。所有节点都挂在同一条总线上,两端各加一个120Ω终端电阻。
为什么是120Ω?因为双绞线的特性阻抗大约是120Ω。终端电阻的作用是吸收信号反射,防止波形畸变。没有终端电阻,或者电阻值不对,总线上的信号就会像弹簧一样来回弹,通信必出问题。
避坑指南:我曾经在一个现场调试中,发现总线偶尔通信失败。用示波器一看,波形上升沿有个明显的“台阶”。查到最后,是终端电阻焊成了1kΩ。换成120Ω之后,波形干净得像教科书一样。记住:终端电阻必须加在总线物理两端,不是任意节点上。
下面这张图,是我画的标准CAN总线拓扑结构。你看一眼就明白了。
1.4 位时序与同步——为什么CAN能自己“对表”?
CAN总线没有单独的时钟线。所有节点靠总线上的信号边沿来同步自己的时钟。这就是所谓的“自同步”。
每个CAN位被分成4个段:
| 段名称 | 作用 | 典型长度 |
|---|---|---|
| 同步段 (Sync_Seg) | 检测边沿,对齐时钟 | 1个Tq |
| 传播段 (Prop_Seg) | 补偿物理延迟 | 1~8个Tq |
| 相位缓冲段1 (Phase_Seg1) | 采样点前调整 | 1~8个Tq |
| 相位缓冲段2 (Phase_Seg2) | 采样点后调整 | 1~8个Tq |
采样点通常设置在Phase_Seg1和Phase_Seg2之间。我习惯把采样点设在85%~90%的位置,这样抗干扰能力最强。
小技巧:配置CAN控制器时,重点关注采样点位置。很多通信问题,比如总线长度长了就丢帧,往往不是硬件坏了,而是采样点没配好。我一般用公式:
采样点 = (Sync_Seg + Prop_Seg + Phase_Seg1) / (总Tq数) × 100%
目标值:87.5%左右。
1.5 本章小结——你该带走什么?
- CAN是多主、短帧、优先级仲裁的实时通信总线。
- 物理层靠差分信号(CAN_H / CAN_L)传输,显性位覆盖隐性位。
- 总线拓扑必须是直线型,两端各一个120Ω终端电阻。
- 位时序可以配置,采样点位置是关键参数。