一.什么是CAN总线
1.CAN总线的概念
- CAN总线(Controller Area Network Bus)控制器局域网总线
2.CAN总线的特点
3.常见通信协议对比(UART、I²C、SPI、CAN)
特性 | UART | I²C | SPI | CAN |
---|---|---|---|---|
全称 | Universal Asynchronous Receiver/Transmitter | Inter-Integrated Circuit | Serial Peripheral Interface | Controller Area Network |
协议类型 | 异步串行通信 | 同步串行通信 | 同步串行通信 | 异步串行通信 |
通信方式 | 全双工 | 半双工 | 全双工 | 半双工 |
线数 | 2 线(TX、RX) + GND | 2 线(SDA、SCL) + GND | 4 线(MISO、MOSI、SCK、CS) + GND | 2 线(CAN_H、CAN_L) + GND |
拓扑结构 | 点对点 | 多设备总线(支持多主多从) | 主从结构(单主多从,每个从设备独立片选) | 多主总线(节点平等) |
寻址方式 | 无(依赖硬件连接) | 7 位或 10 位设备地址 | 无(通过片选信号选择从设备) | 消息 ID(11 位标准帧或 29 位扩展帧) |
最大速度 | 通常 ≤ 115.2 kbps(受距离影响) | 标准模式:100 kbps 快速模式:400 kbps 高速模式:3.4 Mbps |
通常 1 Mbps ~ 100 Mbps(具体取决于器件) | 1 Mbps(40m 内) 125 kbps(500m 内) |
时钟信号 | 无(异步) | 有(SCL 由主设备生成) | 有(SCK 由主设备生成) | 无(异步,通过位填充同步) |
数据格式 | 起始位 + 数据位(5-9) + 校验位(可选) + 停止位(1-2) | 起始条件 + 地址帧 + 读写位 + 数据帧 + 停止条件 | 无固定格式,数据通过 MOSI/MISO 同步传输 | 帧类型(数据帧/远程帧) + ID + 数据段(0-8 字节) + CRC 等 |
校验机制 | 奇偶校验(可选) | ACK/NACK 确认机制 | 通常无校验(依赖硬件可靠性) | CRC 校验 + ACK 应答 + 错误帧检测 |
冲突处理 | 无(点对点无冲突) | 时钟同步和仲裁 | 无(主设备独占总线) | 非破坏性逐位仲裁(基于 ID 优先级) |
优点 | 1. 简单易用 2. 全双工 3. 无需时钟线 |
1. 多主多从 2. 引脚资源少 3. 支持热插拔 |
1. 高速传输 2. 全双工 3. 无地址限制 |
1. 高可靠性 2. 长距离抗干扰 3. 多主容错 |
缺点 | 1. 速度低 2. 点对点限制 3. 无冲突检测 |
1. 速度受限 2. 需要上拉电阻 3. 地址冲突风险 |
1. 线数多 2. 无标准协议 3. 从设备数量受限 |
1. 协议复杂 2. 硬件成本高 3. 数据负载小(≤8字节) |
典型应用 | 调试接口、GPS 模块、老旧设备通信 | 传感器(温度/湿度)、EEPROM、低速外设 | 存储器(Flash/SD 卡)、显示屏、高速 ADC/DAC | 汽车电子(ECU 通信)、工业控制、电梯系统 |
功耗 | 低 | 低(支持睡眠模式) | 中(高速时功耗较高) | 中(持续总线监听) |
典型器件 | CH340、CP2102 | AT24Cxx(EEPROM)、BMP280(气压传感器) | W25Qxx(Flash)、ADXL345(加速度计) | MCP2515(CAN 控制器)、TJA1050(CAN 收发器) |
特殊机制 | 波特率匹配 | 时钟拉伸(Clock Stretching) | 时钟极性(CPOL)和相位(CPHA)配置 | 错误帧自动重发、故障节点自动离线 |
二.CAN的硬件电路
1.通信的基本框架
2.CAN的电平标准
3.CAN收发器
4.CAN物理层特性
三.CAN的通信协议
1.CAN的帧格式
2.数据帧
2.1.标准格式
CAN标准帧格式时序表
字段名称 | 起始段 (SOF) | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 | 结束段 (EOF) |
---|---|---|---|---|---|---|---|
位长 | 1 bit | 12 bits (11位ID + 1位RTR) |
6 bits (1位IDE + 1位r0 + 4位DLC) |
0-64 bits (对应0-8字节) |
16 bits (15位CRC + 1位CRC分界符) |
2 bits (1位ACK槽 + 1位ACK分界符) |
7 bits |
描述 | 帧开始标识:发送一个显性(0)位,用于总线同步,标志帧起始。 | 包含11位标识符与1位RTR位: - 11位标识符决定报文优先级(ID越小优先级越高); - RTR位区分数据帧(显性0)与远程帧(隐性1); 支持非破坏性仲裁。 |
包含控制信息: - IDE位:显性(0)表示标准帧; - 保留位r0:固定显性(0); - DLC:4位数据长度编码,指示数据段字节数(0至8字节)。 |
传输实际数据内容,其长度由DLC字段确定,最多承载8字节的数据。 | 用于错误检测: - 15位CRC校验码计算整个帧的CRC; - 1位CRC分界符始终为隐性(1),起到分隔作用。 |
包含确认信息: - ACK槽:由发送端发送为隐性,接收节点正确接收后覆盖为显性(0); - 1位ACK分界符:始终为隐性(1)。 |
结束标志:由7位连续隐性(1)位组成,标识帧结束,帮助恢复总线空闲状态。 |
传输顺序 | 第1位 | 第2-13位 | 第14-19位 | 第20-83位(实际位数依据DLC值而定) | 第84-99位 | 第100-101位 | 第102-108位 |
2.2.扩展格式
字段名称 | 起始段 (SOF) | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 | 结束段 (EOF) |
---|---|---|---|---|---|---|---|
位长 | 1 bit | 32 bits (11位标识符 + 1位SRR + 1位IDE + 18位扩展标识符 + 1位RTR) |
5 bits (1位保留位r0 + 4位DLC) |
0-64 bits (0-8字节,依据DLC值) |
16 bits (15位CRC校验码 + 1位CRC界定符) |
2 bits (1位ACK槽 + 1位ACK界定符) |
7 bits |
描述 | 帧起始标志: 发送1个显性(0)位,用于总线同步并标志帧开始。 |
包含帧的标识与仲裁信息: - 11位标识符:基本标识符,确定较高优先级; - SRR位:替代远程请求位,固定为隐性; - IDE位:标识符扩展位,固定为隐性(1),表明使用扩展帧格式; - 18位扩展标识符:与基本标识符组合构成29位标识符; - RTR位:远程传输请求位,显性(0)表示数据帧,隐性(1)表示远程帧。 |
包含帧控制信息: - 保留位r0:固定为显性(0); - DLC:数据长度码,4位编码,指示数据段的字节数(0-8字节)。 |
传输实际数据,长度由DLC决定,最多8字节。 | 用于错误检测: - 15位CRC校验码:对整个帧进行循环冗余校验; - 1位CRC界定符:固定为隐性(1),用于分隔CRC段。 |
包含确认信息: - ACK槽:发送时置为隐性(1),接收节点正确接收后覆盖为显性(0)表示确认; - ACK界定符:固定为隐性(1)。 |
帧结束标志: 7位连续隐性(1)位,标志帧结束,使总线进入空闲状态。 |
传输顺序 | 第1位 | 第2-33位 | 第34-38位 | 第39-(38+DLC×8)位(数据长度依据DLC确定) | 紧跟数据段,16位 | 紧跟CRC段,2位 | 紧跟ACK段,7位 |
3.遥控帧
4.错误帧
5.过载帧
6.帧间隔
7.位填充
#include "My_CAN.h"My_CAN_Init()
{}