嵌入式通信协议UART、I2C 、SPI、CAN、Modbus总线协议区别

嵌入式常用总线特点与区别

一览表(速查)

特性 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/变频器、智能电表、楼宇自动化
💡 记忆口诀:UART两线异步点对点,I2C三线同步地址寻,SPI五线同步片选快,CAN双线差分汽车用,Modbus工业RS485传

横向对比记忆图


1. UART(通用异步收发器)

ℹ️ 一句话总结最简单的串行通信,两根线、无时钟、点对点。

核心特点

  • 异步通信:无时钟线,靠波特率约定同步(双方必须一致)
  • 全双工:TX 发送、RX 接收同时进行
  • 数据帧格式起始位(1) + 数据位(5~9) + 校验位(0/1) + 停止位(1/1.5/2)
  • 无寻址机制:天生只支持一对一通信
  • 硬件简单:几乎所有 MCU 都内置 UART 外设

常见波特率

4800 / 9600 / 19200 / 38400 / 57600 / 115200

⚠️ 面试易错点:UART ≠ RS232 ≠ RS485!
  • 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 / CPHA 记忆法
  • 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 相比其他总线,用了大量机制保证数据及时、准确传输。通过报文 ID 仲裁解决总线冲突,确保高优先级设备先通讯;再加上差分信号抗干扰和多重错误检测,这就是为什么汽车、工业等对安全性要求极高的领域都选择 CAN。

核心特点

  • 差分信号: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种)

  1. 数据帧:传输数据(最常用)
  2. 远程帧:请求某节点发送数据
  3. 错误帧:检测到错误时发送
  4. 过载帧:请求延迟下一帧
⚠️ 高频题

Q:CAN总线为什么要加120Ω终端电阻?

A:防止信号在总线末端反射,确保信号完整性。120Ω是因为双绞线特征阻抗约120Ω,需做阻抗匹配

应用场景

  • 汽车电子(发动机控制、ABS、仪表盘通信)
  • 工业自动化
  • 医疗设备

5. Modbus

ℹ️ 一句话总结应用层协议,常跑在 RS485 上,工业自动化领域的"普通话"。

核心特点

  • 应用层协议:不定义物理层,常用 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位隐性位