第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总线拓扑结构。你看一眼就明白了。

CAN总线拓扑结构(直线型) CAN_H CAN_L 120Ω 120Ω 节点1 (ECU) 节点2 (传感器) 节点3 (执行器) 所有节点并联在总线上,两端各一个120Ω终端电阻,严禁星型或环形拓扑

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Ω终端电阻。
  • 位时序可以配置,采样点位置是关键参数。