SPI、I2C、UART:通信协议及其应用
单片机开发是电子组装核心过程。串行协议和通信接口输入促进此项工作。本文旨在详尽探讨 SPI、I2C、UART 等串行通信协议,分析其特性、优缺点及示例。
1. UART 接口
什么是 UART?
图 1:Arduino 上的 UART 协议
通用异步收发器 (UART) 是串行通信协议,便于主机与辅助设备通信。主要实现串行数据传输,支持异步通信和双向传输。简单协议有两条数据线:发送 (Tx) 和接收 (Rx)。通常发送通过数字引脚 0,接收通过数字引脚 1。也协助同步计算机与外部串行设备管理。
如何工作?
图 2:DIY 电子 USB UART 板
UART 通过以下方式管理两设备间信号通信:单工、半双工、全双工。单工单向传输;半双工双向非同时通信;全双工双向同时传输。连接后,数据从发送 UART 数据线传至接收 UART,原则:
- 发送 UART 将主设备并行数据转串行传给接收 UART;接收 UART 将串行数据转并行供接收设备用
- UART 异步通信无时钟,生成起始位和停止位指示消息始末
- 两 UART 必须相同波特率(传输速率),差超 10% 数据无效
UART 工作协议
数据发送与接收
- 发送 UART 从数据总线(如 CPU)接收数据
- 添加起始位、校验位、停止位三位,组成数据包经 TX 引脚传给接收 UART
- 发送 UART 数据耗尽后停止传输
中断控制
数据中断用于自动发送缓冲内容。以下场景触发中断控制:FIFO 溢出错误、换行错误、帧错误、奇偶校验错误;数据接收、发送、接收超时时。
FIFO 操作
图 3. Arduino 上的 UART 接口
Stellaris 系列 UART 模块含两个 16 字节 FIFO,分别用于接收和发送。可配置不同深度产生不同中断,如 1/8、1/4、1/2 深度。发送 FIFO 工作过程:数据录入后开始发送,耗时长持续录入直到 FIFO 满;满后停止录入防新数据丢失;逐位发送直到空,创建额外槽位。接收 FIFO 工作过程:硬件存储接收数据,程序自动接收擦除保证空间;含收发 FIFO 解决 CPU 低效和频繁 UART 中断问题;预先封堵丢失途径实现无数据丢失。
回环
UART 内部回环用于调试诊断,RX 输入接收发送数据。
串行红外协议
UART 含 IrDA 串行红外 (SIR) 编解码模块,转换半双工串行 SIR 接口和异步 UART 数据流。串行通信协议向 UART 提供解码输入和数字编码输出。
UART 优势
- 简单通信协议,文档完善易用
- 无需串行时钟线
- 校验位支持错误检查
UART 劣势
- 数据帧限 9 位,传输速度慢
- 不支持多主多从系统
- 强制波特率误差 10% 内防数据丢失
- 设备间数据传输普遍较慢
单片机 UART 示例
- UART Seeeduino V4.2
- USB 转 UART 5V
- Base Shield V2
- USB CP2102 串口转换器
2. I2C 接口
什么是 I2C?
图 4:差分压力传感器使用 I2C
集成电路总线 (I2C) 通信协议类似 UART。但 UART 用于 PC-设备通信,I2C 用于传感器和模块应用。双向双线同步串行总线,凭借共享总线和地址系统连接多设备不妥协通信路径。代价是通信速度相对 SPI 较慢,速度依赖外部噪声、线材质量、数据速率。双线接口连接低速设备:EEPROM、AD/DA 转换器、单片机。
如何工作?
I2C 协议两线:串行数据线接收口 (SDA) 和串行时钟线 (SCL)。SCL 同步传输,SDA 为收发数据位数据线。传输时主设备提示总线数据传输,同时产生时钟打开传输设备。被寻址设备为从设备。主从设备无恒定传输速率,关系依赖传输时数据方向。主设备发起传输前须告知从设备,接收从设备数据前也须告知。必须上拉电阻接 I2C 电源以最佳运行。
I2C 工作协议
图 5:引脚 0.96 英寸 OLED 128X64 OLED 显示模块 IIC I2C
数据传输方法
连接过程:
- 主机输出发送传输信号给连接从机,主将 SDA 从高电平拉低,再将 SCL 从高电平拉低
- 主机发送 7 位或 10 位地址和读/写位给各从机
- 从机比对地址,匹配返回 ACK 位拉低 SDA,不匹配 SDA 保持高
- 主机发送数据帧或接收(视匹配地址),传输完成后接收组件返回 ACK 位确认完整传输
- 主机将 SCL 拉高再拉高 SDA 通知通信结束
时钟同步
每个主机必须在 SCL 线生成时钟信号传输数据。I2C 传输中仅时钟高电平期间数据有效。
传输模式
主要两种传输方式:
快速模式
快速模式设备 400 kbit/s 收发数据。快速模式 I2C 总线显著抑制毛刺,输出带斜率控制功能。
高速模式
高速模式 I2C 总线 3.4 Mbit/s 收发,传输速率超快速模式。
I2C 优势
- 连接众多设备时引脚/信号数显著有限
- 多主多从能力提供灵活性
- 仅需两根双向线连接众多设备,简单易用
- 广泛适应性,支持多主机
I2C 劣势
- 速度相对慢,需上拉电阻(SPI 只需推挽电阻),开漏设计限制速度
- 电阻占空间,PCB 组装中空间宝贵
- 连接众多设备时不易用
单片机 I2C 示例
- 树莓派 4 通道 16 位 ADC
- I2C Hub (6 端口) - Grove
- I2C 驱动/适配器
- I2C Arduino
3. SPI 接口
什么是 SPI?
图 6:SPI 接口用于显示模块
串行外设接口 (SPI) 用于单片机。全双工工作,允许同时收发数据。SPI 比 I2C 快,传输速率至少 8 位。简单协议实现更快数据率,对显示模块、SD 卡等需速度应用重要。也用于信息突变应用如温度计。
如何工作?
图 7:SD 卡利用 SPI
SPI 设备两种操作方式:片选线选中设备(每设备需唯一片选线);或菊花链方式。可连接任意多设备,但通常受硬件片选线限制。点对点通信时模块无需寻址操作。
SPI 工作协议
SPI 通过四端口工作:
- 主机数据输出,从机数据输入 (MOSI)
- 主机数据输入,从机数据输出 (MISO)
- 时钟信号 (SCLK)
- 从机使能信号 (NSS)
多从机系统每从机需唯一使能信号,硬件需求比 I2C 复杂。SPI 接口含两移位寄存器,实现单主设备(如 CPU)与外设同步串行数据传输。
使用 SPI 优势
- 简单易用,无 I2C 复杂从机寻址系统
- 所有串行接口中最快(快于 UART 和 I2C)
- 无 UART 起始停止位,允许连续数据传输无中断
- 独立 MISO MOSI 线实现同时收发
使用 SPI 劣势
- 引脚占用多,限制连接设备数
- 无指定流控,无 I2C 确认收发机制
- 需 4 线,无 UART 纠错机制
- 单主机
单片机 SPI 示例
- SPI Seeeduino V4.2
- SPI 驱动/适配器 - 轻松驱动 SPI 设备
UART、I2C、SPI 对比
哪个通信外设“最好”?UART、SPI 还是 I2C?
三者无绝对优劣,各有关键优劣势。根据项目选最适配协议。如追求速度选 SPI;连接众多设备避免复杂阵列选 I2C。
总结
我们揭示了 UART、I2C、SPI 通信接口及其传输速率所有关键洞见。我们随时解答通信协议疑问。联系我们,即刻助您。
工业技术