嵌入式串行通信协议速览
用链路方向、时钟、拓扑和错误处理四个维度比较 UART、SPI 与 I²C。
- 问题
- 用链路方向、时钟、拓扑和错误处理四个维度比较 UART、SPI 与 I²C。
- 环境
- 嵌入式 · UART · SPI · I2C
- 状态
- 待发布
- 首次发布
- 2025年9月18日
- 最后更新
- 2026年8月10日
- 预计阅读
- 3 分钟
选择 UART、SPI 或 I²C 时,不要只比较标称速率;还要明确是否需要时钟线、链路上有多少设备、信号完整性边界和错误恢复策略。
先理解传输方式
单工只能单向传输;半双工可以双向传输但需要分时;全双工可同时收发。异步链路没有独立时钟,双方依靠预先约定的速率和帧格式工作;同步链路则通过时钟沿确定采样时刻。
| 协议 | 时钟与方向 | 常见信号 | 适合的设备关系 |
|---|---|---|---|
| UART | 异步、通常全双工 | TX、RX、GND | 点对点调试、模块串口 |
| SPI | 同步、全双工 | SCLK、MOSI、MISO、CS | 单主控与高速外设 |
| I²C | 同步、半双工总线 | SCL、SDA、上拉电阻 | 多个低速传感器与配置器件 |
UART:匹配帧格式比“能发数据”更重要
典型 UART 帧由起始位、数据位、可选校验位和停止位组成。两端必须一致设置波特率、数据位、校验和停止位;一端使用 8-N-1、另一端启用校验也会造成乱码或帧错误。
UART 本身不定义消息边界、重传或流控。应用协议应补充帧头、长度、校验和超时恢复,并明确二进制数据的转义规则。调试时同时观察 TX/RX/GND 是否共地、逻辑电平是否兼容和双方的实际配置。
SPI:一次时钟会同时收和发
SPI 由主设备提供时钟,通过片选指定从设备。每产生一个时钟周期,主从两侧的移位寄存器都会移动数据,因此“读”通常也要发送填充字节,“写”则会同时收到需要忽略的数据。
SPI 没有统一的速度和帧规范。连接前至少确认 CPOL/CPHA 模式、位序、字宽、片选时序和最大时钟频率。多个从设备共享数据线时,确保未选中设备的 MISO 处于高阻状态。
I²C:总线电气条件是协议的一部分
I²C 的 SCL 和 SDA 使用开漏/开集电极方式,需要合适的上拉电阻。起始条件是在 SCL 为高时 SDA 从高变低;停止条件相反。一个字节后的第九个时钟用于 ACK/NACK,应在驱动和读回切换处正确释放 SDA。
I²C 支持多设备,但总线电容、上拉电阻、速率和地址冲突都会影响稳定性。遇到总线卡死时,先检查某个设备是否持续拉低 SDA/SCL,再按芯片手册执行总线恢复或复位,而不是盲目重试写入。
上板前检查
- 明确引脚复用、电平和地线连接。
- 把协议参数写入版本化配置或代码常量。
- 用逻辑分析仪或示波器确认真实时序,而非只依赖软件日志。
- 为超时、校验失败、NACK 和设备掉线设计恢复路径。
ESP-AT 无线模块的网络建立流程见 ESP8266 ESP-AT 基础联网。