USART vs I2C vs SPI:STM32三种通信协议的帧格式与时序对比
·
作者:尹强 | 分类:嵌入式开发 | 日期:2026-09-04
学STM32这段时间,USART、I2C、SPI这三个协议反复出现。刚开始总觉得它们长得像,都是串行通信,都是几根线传数据。后来对着时序图一个一个看,才发现差别挺大的。这篇文章把三者的帧格式和时序特点做个对比整理,方便以后复习。
一、三者总览对比
| 对比项 | USART | I2C | SPI |
|---|---|---|---|
| 线数 | 2线(TX/RX) | 2线(SCL/SDA) | 4线(SCLK/MOSI/MISO/CS) |
| 通信方式 | 全双工 | 半双工 | 全双工 |
| 同步/异步 | 异步(无时钟线) | 同步(有SCL时钟线) | 同步(有SCLK时钟线) |
| 主从关系 | 无主从,点对点 | 一主多从(地址区分) | 一主多从(CS片选区分) |
| 速度 | 较低(常用115200bps) | 中(标准100kHz/快速400kHz) | 高(可达几十MHz) |
| 典型用途 | 串口打印、调试输出 | 传感器读取(SHT30等) | Flash存储、LCD屏幕 |
二、USART帧格式
USART是异步通信,没有时钟线,双方靠事先约定好的波特率来对齐数据。一帧数据的结构如下:
| 起始位 | 数据位 (8bit) | 校验位(可选) | 停止位 |
| 1bit | D0 D1 D2 ... D7 | 0或1或无 | 1~2bit |
关键点:
- 起始位:1个低电平,表示数据帧开始。空闲时线路是高电平,检测到下降沿就知道数据来了。
- 数据位:8位(常见),低位先发(LSB first)。
- 校验位:可选奇校验或偶校验,也可以不要。实际项目中多数不校验。
- 停止位:1个或2个高电平,表示帧结束。
USART最重要的参数是波特率。发送和接收必须用一样的波特率,否则数据全乱。比如发送方用115200,接收方用9600,那收到的全是乱码。常见的波特率有9600、38400、115200等。
三、I2C帧格式
I2C是同步通信,SCL提供时钟,SDA传输数据。通信流程是:
| 起始条件 | 设备地址(7bit)+R/W | ACK | 数据字节 | ACK | ... | 停止条件 |
详细步骤拆解:
- 起始条件:SCL高电平时,SDA从高变低
- 发送地址:7位地址 + 1位读写控制(0写,1读),共8位
- ACK应答:从机拉低SDA表示收到
- 数据传输:每发8位数据,接收方回1个ACK
- 停止条件:SCL高电平时,SDA从低变高
I2C的关键特点:
- 地址机制:一条总线可以挂多个设备,靠7位地址区分,比如SHT30地址是0x44。
- 应答机制:每传一个字节都有ACK/NACK确认,保证可靠性。
- 半双工:SDA线分时复用,同一时间只能发或收。
- 数据高位先发(MSB first),跟USART正好相反。
四、SPI帧格式
SPI比I2C和USART都快,但用的线也最多。4根线分工明确:
- SCLK:时钟线,主机产生
- MOSI:主机输出,从机输入
- MISO:主机输入,从机输出
- CS/SS:片选线,选中哪个从机就拉低对应的CS
SPI的4种工作模式由CPOL和CPHA两个参数决定:
| 模式 | CPOL | CPHA | 空闲时钟 | 采样边沿 |
|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿采样 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿采样 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿采样 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿采样 |
最常用的是Mode 0(CPOL=0, CPHA=0):空闲时SCLK为低电平,上升沿采样数据。很多SPI接口的Flash和LCD屏幕默认就是Mode 0。
SPI通信过程很简单:CS拉低选中从机 → SCLK给出时钟脉冲 → MOSI和MISO同时在时钟驱动下交换数据 → CS拉高结束通信。SPI没有地址的概念,靠CS片选来选择设备。
五、实际选型建议
| 场景 | 推荐协议 | 理由 |
|---|---|---|
| 串口调试输出 | USART | 简单直接,接根线就能用 |
| 温湿度/气压传感器 | I2C | 线少、速度够用、支持多设备 |
| SPI Flash/SD卡 | SPI | 速度高,适合大数据量传输 |
| TFT LCD屏幕 | SPI | 刷屏数据量大,需要高速 |
| 多传感器同总线 | I2C | 地址区分,2线挂多设备 |
六、总结
三个协议没有谁好谁坏,各有各的场景:
- USART最简单,适合点对点通信和调试输出
- I2C线最少、有地址机制,适合挂多个低速传感器
- SPI速度最快,适合大数据量场景,代价是线多
学的时候一定要对着时序图看代码,光看书上的文字描述根本理解不了。比如I2C的起始条件,文字说"SCL高电平时SDA从高变低",你得在代码里看到 SCLK_Set() → SDA_Clr() 才能真正理解这个动作到底是什么意思。
更多推荐



所有评论(0)