CAN 概述
1 什么是控制器局域网(CAN)?
控制器局域网(Controller Area Network,简称 CAN) 是一种广泛应用于汽车、工业自动化等领域的串行通信协议。它的核心设计目标是允许微控制器和设备在没有主机计算机的情况下相互通信。
简单来说,CAN 就像是一个高效的“神经系统”,让机器内部的各个“器官”(电子控制单元 ECU、传感器、执行器)能够可靠地交换信息。
2 CAN 总线的主要特点
-
多主结构(Multi-Master):
- 这是 CAN 总线最关键的特性之一。网络上所有节点都是平等的,没有主从之分。任何节点都可以在总线空闲时主动向其他节点发送信息。这提高了系统的灵活性和可靠性。
-
基于优先级的仲裁(Message-Based Arbitration):
- CAN 协议使用“非破坏性逐位仲裁”机制来解决多个节点同时发送信息时的冲突。
- 每个报文都有一个唯一的标识符(ID),ID 值越小,优先级越高。
- 当两个节点同时发送时,它们会一边发送一边监听总线。如果发现自己发送的“1”电平(隐性位)而总线上是“0”电平(显性位),说明有更高优先级的报文在发送,该节点会立即退出发送转为接收模式。这个过程不会损坏高优先级报文,也不会造成时间浪费。
-
高可靠性:
- 错误检测与处理:CAN 协议内置了强大的错误检测机制,包括:循环冗余校验(CRC)、帧检查、应答错误、位填充规则检查等。一旦检测到错误,发送节点会自动重发报文,极大地保证了数据的可靠性。
- 差分信号(CAN-H 和 CAN-L):CAN 总线使用两条双绞线(CAN-High 和 CAN-Low)传输差分信号,对共模干扰(如电磁干扰 EMI)有很强的免疫力,非常适合嘈杂的工业或汽车环境。
-
广播通信(Broadcast):
- 一个节点发送的报文,可以被网络上所有其他节点接收到。每个节点通过报文 ID 来决定是否处理该报文。例如,发动机转速数据可以被变速箱控制器和仪表盘控制器同时接收并使用。
-
灵活性:
- 可以向网络中增加或移除节点,而无需修改软件或硬件(在一定的负载限制内)。这种“即插即用”的特性便于系统扩展和维护。
3 CAN 总线的基本工作原理
- 物理连接:所有节点都并联在由两条线(CAN-H, CAN-L)组成的总线上。
- 空闲检测:节点在发送前先检查总线是否空闲。
- 发送报文:总线空闲时,节点开始发送报文。报文帧中包含:仲裁段(标识符 ID)、控制段、数据段(0-8 字节)、CRC 校验段等。
- 仲裁:如果多个节点同时开始发送,则通过仲裁段(ID)决定谁可以继续发送。
- 应答:成功接收到无误报文的节点会发送一个“应答”位,告知发送方接收成功。
- 错误处理:如果某个节点持续出错,CAN 协议会将其与总线隔离,防止其影响整个网络。
4 版本
- CAN 2.0A:标准帧格式,使用 11 位的标识符。
- CAN 2.0B:扩展帧格式,使用 29 位的标识符,向下兼容标准帧。扩展帧提供了更多的标识符,用于更复杂的网络。
随着应用发展,基于经典 CAN 衍生出了更高级的协议:
-
CAN FD(Flexible Data-Rate):
- 更高的数据速率:在数据段传输阶段,可以切换到比仲裁阶段更高的波特率。
- 更长的数据场:数据长度从经典的 8 字节扩展到最多 64 字节。
- CAN FD 正在逐步取代经典 CAN,成为现代汽车网络的主力。
-
CAN XL:
- 下一代 CAN 协议,提供更高的吞吐量(高达 10+ Mbps)和更大的数据帧(最多 2048 字节),旨在满足更苛刻的应用场景。
5 电路
5.1 CAN 接口电路的核心:CAN 收发器
微控制器(MCU)内部的 CAN 控制器处理的是数字信号(0 和 1)。但要将这些信号通过可能长达几十米的双绞线电缆传输,并抵抗强烈的工业或汽车环境干扰,就需要一个关键的芯片:CAN 收发器。
CAN 收发器的作用是作为 MCU 与物理总线之间的桥梁,它负责:
- 将 CAN 控制器的数字信号转换为差分信号在总线上传输。
- 将总线上的差分信号转换回数字信号给 CAN 控制器。
一个典型的 CAN 节点接口电路框图如下所示:
[微控制器MCU] <---(数字信号: TX, RX)---> [CAN收发器] <---(差分模拟信号: CAN_H, CAN_L)---> [CAN总线]
5.2 差分信号(Differential Signaling)
这是 CAN 总线抗干扰能力的物理基础。电路上有两条线:
- CAN_H(CAN 高)
- CAN_L(CAN 低)
收发器通过控制这两条线之间的电压差来表示逻辑信号:
-
显性位(Dominant,逻辑 0):
CAN_H电压升高(典型值 ~3.5V)CAN_L电压降低(典型值 ~1.5V)- 产生的电压差
V_diff = CAN_H - CAN_L ≈ 2V。 - 显性位在仲裁中拥有优先级,代表“0”。
-
隐性位(Recessive,逻辑 1):
CAN_H和CAN_L电压都处于静止电平(典型值 ~2.5V)。- 产生的电压差
V_diff = CAN_H - CAN_L ≈ 0V。 - 隐性位代表“1”。
为什么差分信号抗干扰能力强? 假设一个强大的电磁干扰(噪声)同时耦合到 CAN_H 和 CAN_L 线上。这个噪声会同时抬高或降低两条线的绝对电压。但是,由于接收器只关心两者之间的电压差(V_diff),而这个差值基本保持不变,从而有效地抵消了共模噪声的影响。
5.3 终端电阻(Termination Resistor)
为什么需要终端电阻? CAN 总线是一种高速串行总线,信号传输速度接近电波在导线中的传播速度。当信号到达总线末端时,如果阻抗不匹配,会产生信号反射,造成波形畸变和通信错误。
如何解决? 在总线的最远端(通常是两端) 各并联一个120 欧姆的电阻。
- 作用:终端电阻的作用是阻抗匹配,吸收信号能量,防止反射。
- 电路连接:这个 120 欧姆电阻直接连接在 CAN_H 和 CAN_L 之间。
- 重要性:缺少终端电阻或终端电阻值不匹配是导致 CAN 通信不稳定、无法通信的最常见硬件原因之一。
留下评论