嵌入式通信协议UART、I2C 、SPI、CAN、Modbus总线协议区别
- 嵌入式开发
- 11小时前
- 43热度
- 0评论
嵌入式常用总线特点与区别
一览表(速查)
| 特性 | UART | I2C | SPI | CAN | Modbus |
|---|---|---|---|---|---|
| 全称 | Universal Asynchronous Receiver/Transmitter | Inter-Integrated Circuit | Serial Peripheral Interface | Controller Area Network | Modbus Protocol |
| 线数 | TX, RX, GND(3线) | SDA, SCL, GND(3线) | MOSI, MISO, SCLK, CS, GND(5线) | CAN_H, CAN_L(2线差分) | 依赖物理层(RS485常用 A, B 2线) |
| 通信方式 | 全双工 | 半双工 | 全双工 | 半双工 | 半双工 |
| 同步/异步 | 异步(无时钟线) | 同步(SCL时钟) | 同步(SCLK时钟) | 异步 | 异步 |
| 拓扑 | 点对点 | 一主多从(也支持多主) | 一主多从 | 多主多从(总线仲裁) | 一主多从 |
| 速率 | 常用 9600~115200 bps | 标准100kbps / 快速400kbps / 高速3.4Mbps | 可达 几十Mbps(最快) | 最高 1Mbps | 取决于物理层,RS485 最高约 10Mbps |
| 距离 | 短距离(<15m) | 短距离(<1m板级) | 极短(板级 <30cm) | mark>长距离(可达10km@5kbps) | RS485可达 1200m |
| 从机寻址 | 无(点对点) | 7位/10位地址(软件寻址) | CS片选线(硬件寻址) | 报文ID仲裁 | 站地址(1~247) |
| 应用领域 | Debug调试、GPS/蓝牙/WiFi模块、上位机通信 | 板级传感器(温湿度、IMU)、EEPROM、OLED、RTC | Flash存储、TFT/LCD屏、SD卡、ADC/DAC | 汽车电子(ECU、ABS)、工业自动化、医疗 | PLC/变频器、智能电表、楼宇自动化 |

1. UART(通用异步收发器)
核心特点
- 异步通信:无时钟线,靠波特率约定同步(双方必须一致)
- 全双工:TX 发送、RX 接收同时进行
- 数据帧格式:
起始位(1) + 数据位(5~9) + 校验位(0/1) + 停止位(1/1.5/2) - 无寻址机制:天生只支持一对一通信
- 硬件简单:几乎所有 MCU 都内置 UART 外设
常见波特率
4800 / 9600 / 19200 / 38400 / 57600 / 115200
- UART 是通信协议(逻辑层)
- RS232 / RS485 / TTL 是电气标准(物理层)
- RS232:±3~15V,点对点,短距离
- RS485:差分信号,可挂多设备,长距离(1200m)
应用场景
- Debug 串口打印(
printf重定向) - GPS 模块、蓝牙模块、WiFi 模块通信
- 上位机与 MCU 通信
2. I2C(内部集成电路总线)
核心特点
- 两根信号线:SDA(数据)+ SCL(时钟),都需要上拉电阻
- 同步半双工:同一时刻只能发或收
- 7位/10位地址:每个从机有唯一地址,理论最多挂 128(7位)或 1024(10位)个设备
- 应答机制:每传输 8 位数据后,接收方发送 ACK/NACK
- 支持多主:通过时钟同步 + SDA仲裁解决冲突
通信流程(必背)
主机发起: 起始信号(S) → 从机地址(7bit) + 读/写位(R/W) → 等待ACK
→ 数据传输(8bit) → 等待ACK → ... → 停止信号(P)
起始信号:SCL高电平期间,SDA 由高拉低 ⬇️
停止信号:SCL高电平期间,SDA 由低拉高 ⬆️
口诀:"开始往下拽,停止往上拉"
速率等级
| 模式 | 速率 | 记忆 |
|---|---|---|
| 标准模式 | 100 kbps | 一般够用 |
| 快速模式 | 400 kbps | 面试常考 |
| 高速模式 | 3.4 Mbps | 少用 |
应用场景
- EEPROM(AT24C02)、传感器(BMP280温湿度、MPU6050加速度计)
- OLED 显示屏(SSD1306)
- RTC 时钟芯片(DS3231)
3. SPI(串行外设接口)
核心特点
- 四根线:
- MOSI(Master Out Slave In):主→从
- MISO(Master In Slave Out):从→主
- SCLK:时钟线
- CS/SS(Chip Select):片选,低电平有效
- 全双工同步:收发同时进行,速度快
- 硬件寻址:每个从机需要一根独立 CS 线(从机多时引脚占用大)
- 无应答机制:不像 I2C 有 ACK,不知道数据是否被接收
- 无固定协议帧:比较灵活但也更依赖设备手册
四种工作模式(CPOL + CPHA)
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 最常用,空闲低电平,第一个边沿采样 |
| Mode 1 | 0 | 1 | 空闲低电平,第二个边沿采样 |
| Mode 2 | 1 | 0 | 空闲高电平,第一个边沿采样 |
| Mode 3 | 1 | 1 | 常用,空闲高电平,第二个边沿采样 |
- CPOL(Clock Polarity):时钟空闲时的电平。0→低,1→高
- CPHA(Clock Phase):第几个边沿采样。0→第一个,1→第二个
应用场景
- Flash 存储(W25Q64)
- TFT/LCD 显示屏(ILI9341)
- SD 卡(SPI 模式)
- ADC/DAC 芯片
4. CAN(控制器局域网)
为什么 CAN 能用在汽车和工业领域?
相比 UART、I2C、SPI 这些"够用就行"的板级总线,CAN 从设计之初就以安全可靠为核心目标:
- 物理层:差分信号传输,天生抗干扰,在电磁环境恶劣的发动机舱内也能稳定通信
- 仲裁机制:使用报文 ID 逐位仲裁,自动解决总线冲突——ID 越小优先级越高,保证刹车(ABS)等安全关键设备优先通讯,不会因为总线争用而丢失
- 错误处理:内置 5 种错误检测机制(CRC校验、位填充、帧格式检查、ACK检测、位监控),一旦发现错误立即通知全网,错误节点自动"降级"甚至"离线",不会拖垮整条总线
- 数据完整性:残余错误率低至 4.7 × 10⁻¹¹,远优于普通串行通信
核心特点
- 差分信号:CAN_H 和 CAN_L,抗干扰能力极强
- 多主架构:任何节点都可以主动发送
- 非破坏性仲裁:用报文ID进行逐位仲裁,ID越小优先级越高(显性0胜出)
- 总线终端电阻:两端各需 120Ω 终端电阻
- 错误处理机制:CRC校验、位填充、错误帧、5种错误类型
CAN 2.0A vs CAN 2.0B
| 特性 | CAN 2.0A(标准帧) | CAN 2.0B(扩展帧) |
|---|---|---|
| ID长度 | 11位 | 29位 |
| 数据长度 | 0~8字节 | 0~8字节 |
帧类型(4种)
- 数据帧:传输数据(最常用)
- 远程帧:请求某节点发送数据
- 错误帧:检测到错误时发送
- 过载帧:请求延迟下一帧
Q:CAN总线为什么要加120Ω终端电阻?
A:防止信号在总线末端反射,确保信号完整性。120Ω是因为双绞线特征阻抗约120Ω,需做阻抗匹配。
应用场景
- 汽车电子(发动机控制、ABS、仪表盘通信)
- 工业自动化
- 医疗设备
5. Modbus
核心特点
- 应用层协议:不定义物理层,常用 RS485(双绞线差分)作为物理层
- 主从架构:一个主站轮询多个从站(地址 1~247)
- 两种传输模式:
- Modbus RTU:二进制传输,效率高,用得最多
- Modbus ASCII:ASCII字符传输,可读性好但慢
- Modbus TCP:基于以太网的变体
Modbus RTU 帧格式
| 从机地址(1B) | 功能码(1B) | 数据(NB) | CRC校验(2B) |
常用功能码(必背)
| 功能码 | 含义 | 操作对象 |
|---|---|---|
| 01 | 读线圈状态 | 位(可读写) |
| 02 | 读离散输入 | 位(只读) |
| 03 | 读保持寄存器 | 字(可读写,最常用) |
| 04 | 读输入寄存器 | 字(只读) |
| 05 | 写单个线圈 | 位 |
| 06 | 写单个寄存器 | 字 |
| 15 | 写多个线圈 | 位 |
| 16 | 写多个寄存器 | 字 |
- 01/02:读位(01可写的线圈,02只读的输入)
- 03/04:读字(03可写的保持,04只读的输入)
- 05/06:写单个(05写位,06写字)
- 15/16:写多个(15写位,16写字)
口诀:"位在前,字在后;读在前,写在后;单在前,多在后"
抗干扰手段
- 双绞线抑制共模干扰
- 共模电感进一步滤除共模噪声
- RS485 差分信号本身抗干扰
- 终端电阻(120Ω)防信号反射
应用场景
- PLC 与传感器/变频器通信
- 智能电表、工业仪表
- 楼宇自动化(空调、照明控制)
选型决策速记
- 需要 调试打印 / 简单通信 → UART
- 需要 板级挂多个低速传感器 → I2C(省引脚)
- 需要 高速数据传输(Flash/屏幕) → SPI(速度快)
- 需要 长距离 + 高可靠(汽车/工业) → CAN
- 需要 工业设备互联 + 标准协议 → Modbus RTU + RS485
⚡ 高频问答
Q1:I2C 和 SPI 最本质的区别是什么?
1. **寻址方式不同**:I2C 用软件地址寻址,SPI 用硬件CS片选寻址
2. **双工方式不同**:I2C 半双工,SPI 全双工
3. **引脚数不同**:I2C 只需 2 根(SDA+SCL),SPI 需要 4+ 根
4. **速度不同**:SPI 远快于 I2C
5. **应答机制**:I2C 有 ACK/NACK,SPI 没有
一句话:I2C 省引脚但慢,SPI 费引脚但快
Q2:UART 和 I2C 都能通信,什么时候选哪个?
- **UART**:点对点、异步、全双工,适合两个设备直连(如 MCU 和电脑)
- **I2C**:一主多从、同步、半双工,适合一个 MCU 挂多个传感器
- 关键区别:UART 不能一主多从(除非用 RS485 + Modbus)
Q3:CAN 总线的仲裁机制是怎样的?
- 多个节点同时发送时,进行逐位仲裁
- 每个节点发送 ID 的同时回读总线电平
- 如果发送"1"(隐性)但读到"0"(显性),说明有更高优先级的报文,立即退出
- **ID 数值越小,优先级越高**(因为0是显性,能覆盖1)
- 这是"非破坏性仲裁"——赢的节点不受任何影响,无需重传
Q4:I2C 的上拉电阻为什么必须要有?一般多大?
- I2C 的 SDA 和 SCL 都是开漏输出(只能拉低,不能主动拉高)
- 没有上拉电阻,总线无法恢复到高电平,通信失败
- 典型值:4.7kΩ(标准模式)、1kΩ~2.2kΩ(快速模式,需要更快的上升沿)
Q5:SPI 的 CPOL 和 CPHA 各代表什么?Mode 0 是什么意思?
- **CPOL**:时钟空闲状态电平(0=低,1=高)
- **CPHA**:数据在第几个时钟沿采样(0=第一个,1=第二个)
- **Mode 0**(CPOL=0, CPHA=0):空闲低电平,上升沿采样,最常用
Q6:Modbus RTU 和 Modbus ASCII 有什么区别?
- **RTU**:数据以二进制传输,用 CRC 校验,效率高,工业首选
- **ASCII**:数据转成 ASCII 字符传输(如 0x1A → "1A"),用 LRC 校验,可读性好但数据量翻倍
- 实际项目 90%以上用 RTU
Q7:RS485 与 RS232 的核心区别?
| 对比项 | RS232 | RS485 |
| :--- | :--- | :--- |
| 信号方式 | 单端 | 差分 |
| 传输距离 | ~15m | ~1200m |
| 节点数 | 1对1 | 最多32/128/256个 |
| 抗干扰 | 弱 | 强 |
| 双工 | 全双工 | 半双工(四线可全双工) |
Q8:为什么 CAN 和 RS485 都要加 120Ω 终端电阻?
- 高速信号在传输线末端如果没有阻抗匹配,会发生信号反射
- 反射信号叠加原始信号,造成波形失真,导致误码
- 双绞线的特征阻抗约 120Ω,因此终端电阻选 120Ω 做匹配
- 只在总线两端各加一个,中间节点不加
🧪 自测题(试试不看答案!)
选择题
1. 以下哪个协议是全双工通信?
A. I2C B. CAN C. SPI D. Modbus
**答案:C. SPI** ✅
💡 **解析**:SPI 有 MOSI(发)和 MISO(收)两条数据线,可同时收发。UART 也是全双工,但选项里没有。
2. I2C 标准模式的速率是多少?
A. 9600bps B. 100kbps C. 400kbps D. 1Mbps
**答案:B. 100kbps** ✅
💡 **解析**:100kbps=标准模式,400kbps=快速模式,3.4Mbps=高速模式。
3. CAN 总线仲裁时,ID 值越____优先级越高?
A. 越小 B. 越大
**答案:A. 越小** ✅
💡 **解析**:显性电平(0)可以覆盖隐性电平(1),所以 ID 数值越小(0越多),越容易赢得仲裁。
4. Modbus 中功能码 03 代表什么?
A. 读线圈 B. 读离散输入 C. 读保持寄存器 D. 写单个寄存器
**答案:C. 读保持寄存器** ✅
💡 **解析**:03 是最常用的功能码,用于读保持寄存器。06 是写单个寄存器,16 是写多个寄存器。
5. 以下哪种总线传输距离最远?
A. SPI B. I2C C. UART D. CAN
**答案:D. CAN** ✅
💡 **解析**:CAN 在低波特率下可达 10km。SPI 和 I2C 都是板级通信(<1m),UART/RS232 约15m。
填空题
6. I2C 通信需要____电阻,典型值是____
上拉电阻,典型值 4.7kΩ
💡 因为 I2C 采用开漏输出,需要外部上拉才能输出高电平。
7. SPI 的四根线分别是:____, ____, ____, ____
MOSI(主出从入)、MISO(主入从出)、SCLK(时钟)、CS/SS(片选)
💡 记忆:"MO-MI-CK-CS",主出从入→主入从出→时钟→片选
8. CAN 总线两端各需要一个____Ω的终端电阻
120Ω
💡 与双绞线特征阻抗匹配,防止信号反射。
9. UART 的数据帧格式是:____ + ____ + ____ + ____
起始位(1bit) + 数据位(5~9bit) + 校验位(0或1bit) + 停止位(1/1.5/2bit)
💡 记忆:起(始)→数(据)→校(验)→停(止),"起数校停"
10. Modbus 常用的物理层标准是____,它使用____信号来抗干扰
RS485,使用差分信号
💡 RS485 差分信号 + 双绞线,是工业环境抗干扰的经典组合。
简答题
11. 问:"项目中如何选择 I2C 还是 SPI?"你怎么回答?
**参考答案:**
根据具体需求权衡:
| 考量因素 | 选 I2C | 选 SPI |
| :--- | :--- | :--- |
| 引脚资源 | 引脚紧张时选 I2C(只需2根) | 引脚充裕时可选 SPI |
| 速度需求 | 低速外设(传感器、EEPROM) | 高速传输(Flash、LCD) |
| 设备数量 | 多设备时用地址区分,不额外占引脚 | 每加一个从机多占一根 CS |
| 可靠性 | 有 ACK 应答,知道数据是否送达 | 无应答机制,需自行校验 |
12. 问:"简述 CAN 总线的一帧数据帧结构"
**参考答案:**
一帧标准数据帧包含:
1. **帧起始**(SOF):1位显性位
2. **仲裁段**:11位 ID + 1位 RTR(数据帧为显性0)
3. **控制段**:IDE + r0 + 4位 DLC(数据长度码,0~8)
4. **数据段**:0~8 字节有效数据
5. **CRC段**:15位 CRC + 1位界定符
6. **ACK段**:1位 ACK 槽 + 1位界定符
7. **帧结束**(EOF):7位隐性位