作者:尹强 | 分类:嵌入式开发 | 日期:2026-09-04

学STM32这段时间,USART、I2C、SPI这三个协议反复出现。刚开始总觉得它们长得像,都是串行通信,都是几根线传数据。后来对着时序图一个一个看,才发现差别挺大的。这篇文章把三者的帧格式和时序特点做个对比整理,方便以后复习。

一、三者总览对比

对比项USARTI2CSPI
线数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 | ... | 停止条件 |

详细步骤拆解:

  1. 起始条件:SCL高电平时,SDA从高变低
  2. 发送地址:7位地址 + 1位读写控制(0写,1读),共8位
  3. ACK应答:从机拉低SDA表示收到
  4. 数据传输:每发8位数据,接收方回1个ACK
  5. 停止条件: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两个参数决定:

模式CPOLCPHA空闲时钟采样边沿
Mode 000低电平上升沿采样
Mode 101低电平下降沿采样
Mode 210高电平下降沿采样
Mode 311高电平上升沿采样

最常用的是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() 才能真正理解这个动作到底是什么意思。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐