电子设备之间的通信如同人类对话,双方需要使用共同的语言。在嵌入式系统和微控制器领域,这些“语言”就是通信协议。本文将深入对比三种最常用的串行通信协议:SPI、UART和I2C,解析它们的工作原理、特点及典型应用场景,帮助开发者在项目中做出合适的选择。
串行通信与并行通信
电子设备通过发送数据位(Bit)来实现信息交换。位是二进制的基本单位,其值只能是0或1。在典型的5V系统中,逻辑“0”通常由0V的短脉冲表示,而逻辑“1”则由5V的短脉冲表示。这些数据位可以通过并行或串行的方式进行传输。
在并行通信中,数据的各个位通过多根导线同时传输。下图展示了字母“C”的ASCII码二进制形式(01000011)的并行传输过程:

而在串行通信中,数据位通过单根导线一位接一位地顺序发送。下图展示了同一数据的串行传输过程:

串行通信虽然速度相对较慢,但其布线简单、成本低廉,成为芯片间和设备间短距离通信的主流方式。SPI、UART和I2C均属于串行通信协议。理解这些通信协议的基础,有助于我们更好地进行网络与系统编程。
SPI通信协议详解
SPI(Serial Peripheral Interface)是一种高速、全双工的同步通信协议,由摩托罗拉公司开发。其最大特点是允许数据连续传输而无需中断,可以发送或接收任意数量的位,这与以数据包形式传输的I2C和UART不同。
在SPI系统中,设备分为主设备(Master)和从设备(Slave)。主设备(通常是微控制器)控制通信的发起和时钟,而从设备(如传感器、存储芯片)接收指令并响应。

一套完整的SPI通信需要四根信号线:
- MOSI (Master Output Slave Input):主设备输出,从设备输入的数据线。
- MISO (Master Input Slave Output):主设备输入,从设备输出的数据线。
- SCLK (Serial Clock):由主设备产生的时钟信号线。
- SS/CS (Slave Select / Chip Select):片选信号线,由主设备控制,用于选择特定的从设备。
SPI协议核心特点
- 同步通信:SPI属于同步协议,通信双方在同一个时钟信号(SCLK)下工作,数据传输速率取决于时钟频率。时钟由主设备产生,因此通信始终由主设备发起。
- 片选机制:主设备通过将目标从设备的CS线拉至低电平来激活通信。一个主设备可以通过多个CS引脚连接多个从设备。

如果主设备只有一个CS引脚,可以采用菊花链方式连接多个从设备:

- 全双工传输:主设备通过MOSI线发送数据给从机的同时,从机也可以通过MISO线向主机发送数据,实现同时收发。
SPI数据传输步骤
- 主设备产生时钟信号(SCLK)。

- 主设备拉低目标从设备的SS/CS引脚,选中该从设备。

- 主设备通过MOSI线逐位发送数据给从设备。

- 从设备通过MISO线逐位将响应数据返回给主设备。

SPI优缺点总结
- 优点:
- 传输速率高(通常比I2C快)。
- 支持全双工连续传输,无数据包开销。
- 协议简单,硬件实现容易。
- 缺点:
- 需要4根线,布线占用资源较多。
- 没有硬件级的应答机制来确认数据是否被成功接收。
- 不支持多主设备系统。
- 从设备数量增加会受总线负载电容限制。
UART通信协议详解
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)严格来说不是一种通信协议,而是一种物理电路(常内置于微控制器中)或独立IC。它负责实现异步串行通信,最大的优势是仅需两根线(Tx和Rx)即可完成数据交换。
在UART通信中,两个UART设备直接对等连接。发送方将来自CPU的并行数据转换为串行格式,通过Tx引脚发出;接收方通过Rx引脚接收串行数据,再转换回并行格式交给CPU处理。

UART是异步通信,没有时钟信号。为了协调收发时序,它在数据包中添加了起始位和停止位来界定数据帧,并依赖双方预先约定好的波特率(Baud Rate)(如9600 bps, 115200 bps)来同步采样。
UART数据帧结构
一个完整的UART数据帧包含以下部分:

- 起始位:通信开始时,Tx线从高电平(空闲状态)被拉低一个位时间,标志着数据帧的开始。
- 数据帧:有效载荷,通常是8位数据(一个字节)。
- 奇偶校验位(可选):用于简单的错误检测,检查数据位中“1”的个数是奇数还是偶数。
- 停止位:通常为1或2个位时间的高电平,标志数据帧结束。
UART数据传输步骤
- 发送UART从数据总线获取并行数据。

- 发送UART生成并添加起始位、奇偶校验位和停止位,组成完整数据包。

- 数据包从Tx引脚串行发出。接收UART在检测到起始位后,以约定的波特率对Rx线进行采样。

- 接收UART丢弃起始位、校验位和停止位。

- 接收UART将串行数据转换为并行数据,送至接收端数据总线。

UART优缺点总结
- 优点:
- 仅需两根线,硬件连接简单。
- 无需时钟信号,依靠波特率同步。
- 数据帧结构可配置(数据位、停止位、校验位),灵活性高。
- 应用极其广泛,是调试和PC通信的常用接口。
- 缺点:
- 标准帧大小通常只有8位数据。
- 不支持多主机或多从机系统,只能点对点。
- 双方波特率必须严格匹配(误差通常需在10%以内)。
异步通信的时序概念是理解UART和许多其他网络协议的基础。
I2C通信协议详解
I2C(Inter-Integrated Circuit)是由飞利浦公司开发的一种双向、半双工、同步串行总线。它结合了SPI和UART的部分优点:仅使用两根线(SDA-数据线和SCL-时钟线),却能支持多主多从的拓扑结构,非常适合连接多个低速外设。

I2C工作原理
I2C通信以消息(Message)为单位,每个消息包含:
- 起始条件(S):当SCL为高时,SDA从高到低的跳变。
- 从设备地址帧:7位或10位的唯一地址,用于寻址目标从设备。
- 读/写位:指示主设备是要写入(0)还是读取(1)数据。
- 应答位(ACK/NACK):接收方在每个地址或数据帧后返回的确认信号(ACK为低电平)。
- 数据帧:8位的数据块。
- 停止条件(P):当SCL为高时,SDA从低到高的跳变。

I2C寻址与传输
I2C没有片选线,而是通过软件寻址。主设备在通信开始时先广播目标从设备的地址。总线上所有从设备都会将接收到的地址与自身地址比较,只有地址匹配的从设备会拉低SDA线(发送ACK)作出响应,继而参与后续通信。

I2C总线拓扑
- 单主多从:这是最常见的模式。总线上需要为SDA和SCL线各接一个上拉电阻(通常为4.7kΩ)。

- 多主多从:I2C支持多主机,通过总线仲裁机制防止数据冲突。连接方式类似,同样需要上拉电阻。

I2C优缺点总结
- 优点:
- 仅需两根线(SDA, SCL),节省引脚和布线。
- 支持多主设备和多从设备系统。
- 具有硬件应答机制(ACK),通信更可靠。
- 拥有成熟的规范和广泛的支持。
- 缺点:
- 通信速率通常低于SPI(标准模式100kbps,快速模式400kbps)。
- 数据帧固定为8位。
- 协议比SPI复杂,软件开销稍大。
- 总线电容会限制挂载设备数量和通信速度。
总结与选型建议
| 特性 |
SPI |
UART |
I2C |
| 通信类型 |
同步 |
异步 |
同步 |
| 线数 |
4根 (SCLK, MOSI, MISO, CS) |
2根 (TX, RX) |
2根 (SDA, SCL) |
| 最大传输速率 |
高 (可达数十Mbps) |
中等 (通常<1Mbps) |
中低 (标准100kbps, 快速400kbps) |
| 拓扑结构 |
单主多从 |
点对点 |
多主多从 |
| 寻址方式 |
硬件片选 (CS) |
无 (点对点) |
软件地址 (7/10 bit) |
| 全双工 |
支持 |
支持 (需两对TX/RX) |
半双工 |
| 错误检查 |
无 |
奇偶校验位 (可选) |
应答位 (ACK) |
如何选择?
- 选择SPI:当需要高速数据传输(如存储器、高分辨率ADC/DAC、显示屏),且引脚资源充裕、系统结构简单(单主机)时。
- 选择UART:当进行简单、可靠的点对点通信(如微控制器与电脑串口调试、GPS模块通信),或作为设备调试端口时。它也是许多嵌入式开发项目中与上位机通信的首选。
- 选择I2C:当引脚资源紧张,需要连接多个低速外设(如传感器、EEPROM、RTC时钟芯片),且对速率要求不高时。
理解这三种基础通信协议的差异,是进行嵌入式系统设计和外设驱动开发的关键一步。在实际项目中,应根据速度、复杂性、引脚数量和系统架构等因素综合考量,选择最合适的通信方式。
|