CAN总线协议
CAN(Controller Area Network)总线是一种广泛应用于汽车、工业自动化等领域的串行通信协议,由德国Bosch公司在1980年代开发,主要用于实时、可靠的数据传输。以下是其核心要点:
1. 基本特性
- 多主通信:所有节点均可主动发送消息,通过仲裁机制避免冲突。
- 差分信号:使用CAN_H和CAN_L双线传输,抗干扰能力强。
- 实时性:基于优先级(ID决定)的非破坏性仲裁,高优先级消息优先发送。
- 速率:
- 标准CAN(CAN 2.0A/B):最高1 Mbps(短距离),常见125 kbps~500 kbps。
- CAN FD(灵活数据速率):提升至5 Mbps以上,数据段可变长度。
2. 帧类型
-
数据帧:携带实际数据,结构如下:
- 仲裁域(ID):11位(标准帧)或29位(扩展帧),决定优先级。
- 控制域:数据长度(DLC,0~8字节,CAN FD可达64字节)。
- 数据域:实际传输的数据。
- CRC域:校验数据完整性。
- ACK域:接收节点确认。
-
远程帧:请求发送特定ID的数据(无数据域)。
-
错误帧:通知总线错误。
-
过载帧:延迟下一帧传输。
3. 仲裁机制
- 非破坏性逐位仲裁:发送时同时监听总线,若ID位为隐性(1)但检测到显性(0),则退出仲裁。ID值越小,优先级越高。
4. 错误处理
- 5种错误检测:
- CRC错误、格式错误、应答错误、位错误、填充错误(每5个相同位插入相反位)。
- 错误状态:节点根据错误计数进入“主动错误”、“被动错误”或“总线关闭”状态。
5. 物理层
- 终端电阻:总线两端需接120Ω电阻匹配阻抗。
- 电平:
- 显性电平(0):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V。
- 隐性电平(1):CAN_H = CAN_L ≈ 2.5V。
6. 应用场景
- 汽车电子:ECU(发动机控制单元)、传感器、仪表通信。
- 工业控制:PLC、机器人、传感器网络。
- 医疗设备:高可靠性要求的设备间通信。
7. CAN变种
- CAN FD:提升数据段速率和长度(兼容经典CAN)。
- CAN XL:更高带宽(10+ Mbps),支持更大数据包(仍在发展中)。
8. 协议栈
- 底层:物理层(ISO 11898)、数据链路层(CAN控制器)。
- 上层协议:
- CANopen:工业自动化常用。
- J1939:商用车标准(基于29位ID)。
示例代码(Arduino + CAN)
#include <CAN.h>
void setup() {CAN.begin(500E3); // 初始化500 kbps
}void loop() {CAN.beginPacket(0x12); // 标准帧ID=0x12CAN.write('A'); // 发送1字节数据CAN.endPacket();delay(1000);
}
关键优势
- 可靠性:错误检测与重发机制。
- 灵活性:支持多节点、动态增减设备。
- 成本低:简化布线,适合复杂系统。
适用于需要高实时性和抗干扰能力的分布式控制系统。