STM32三大通信协议详解——UART、I2C、SPI
前言
在嵌入式开发中,通信协议是连接单片机与外部设备的桥梁。UART、I2C、SPI是最常用的三大串行通信协议,它们各有特点,适用于不同的场景。本文将带你深入理解这三种通信协议的工作原理、通信时序和关键参数,帮你彻底搞懂它们的区别与使用场景。
一、UART串口通信
1.1 什么是UART
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种异步串行通信协议。它只需要两根数据线(TX发送、RX接收)就能实现全双工通信,是嵌入式开发中最常用的调试和通信方式。
- 异步通信:没有时钟线,收发双方通过约定的波特率来同步数据
- 全双工:可以同时发送和接收数据
- 两根线:TX(发送)、RX(接收),交叉连接
1.2 数据帧格式
UART的数据帧通常由以下几部分组成:
| 组成部分 | 长度 | 说明 |
|---|---|---|
| 起始位 | 1位 | 低电平,表示一帧数据的开始 |
| 数据位 | 5~8位 | 实际要传输的数据,通常是8位(1字节) |
| 校验位 | 0~1位 | 可选,用于奇偶校验,检测传输错误 |
| 停止位 | 1~2位 | 高电平,表示一帧数据的结束 |
💡空闲状态:串口不传输数据时,总线长期保持高电平(1)。当要发送数据时,先拉低电平(起始位),通知接收方准备接收。
1.3 低位先发(LSB First)
UART传输数据时有一个重要特点:低位先发(LSB First,Least Significant Bit first)。
举个例子:要发送十进制数100,对应的二进制是1100100,高位补0凑8位就是01100100。
但在UART的波形上,数据是从低位到高位依次发送的:
- 第1位(最左边):0(最低位)
- 第2位:0
- 第3位:1
- 第4位:0
- 第5位:0
- 第6位:1
- 第7位:1
- 第8位(最右边):0(最高位)
也就是波形上从左到右看到的是:0 0 1 0 0 1 1 0,正好和我们平时写的二进制顺序相反。
⚠️注意:很多初学者容易搞反数据位的顺序。记住:UART是低位先发,波形最左边的是数据最低位,最右边的是最高位。
1.4 波特率
波特率(Baud Rate)表示每秒传输的二进制位数,单位是bps(bits per second)。
常用波特率:9600、19200、38400、57600、115200等。
收发双方必须设置相同的波特率,否则无法正确解析数据。
二、I2C总线
2.1 什么是I2C
I2C(Inter-Integrated Circuit,集成电路总线)是由飞利浦公司开发的一种同步串行通信协议。它只需要两根线就能实现多设备通信,非常适合板内芯片间的短距离通信。
- 同步通信:有时钟线(SCL)同步数据
- 半双工:同一时间只能发送或接收
- 两根线:SCL(时钟线)、SDA(数据线)
- 多设备:一条总线上可以挂多个从设备,通过地址区分
- 上拉电阻:SCL和SDA都需要上拉电阻,空闲时为高电平
2.2 物理层
| 信号线 | 说明 |
|---|---|
| SCL | 串行时钟线(Serial Clock),由主机控制,用于同步数据传输 |
| SDA | 串行数据线(Serial Data),用于传输实际的数据 |
💡空闲状态:由于上拉电阻的存在,总线空闲时SCL和SDA都处于高电平状态。
2.3 通信过程详解
I2C的一次完整通信分为四个阶段:起始位 → 寻址 → 数据传输 → 停止位
第一阶段:起始位(Start)
在数据传输之前,总线上处于空闲状态(SCL和SDA都是高电平)。
起始位的产生方式:当SCL为高电平时,SDA产生一个下降沿(从高变低)。
起始位是主机发起的,标志着一次通信的开始。
第二阶段:寻址(Addressing)
起始位之后,主机发送从机的地址,用来选择要和哪个从机通信。
- I2C标准模式使用7位地址(还有10位地址模式)
- 地址后面跟着1位读写位(0表示写,1表示读)
- 从机收到自己的地址后,会回复一个ACK应答
❓寻址阶段NAK的原因:
- 地址填错,要寻址的从机不存在
- 要寻址的从机正忙,来不及回复ACK
- 从机故障
第三阶段:数据传输(Data Transfer)
寻址成功后,就开始传输数据了:
- 每个数据字节也是8位
- 高位先发(MSB First),和UART相反
- 每传输完一个字节,接收方回复一个ACK应答位
- 可以连续传输多个字节
数据有效性规则:SCL为高电平时,SDA上的数据必须保持稳定;SCL为低电平时,SDA才能变化。
第四阶段:停止位(Stop)
数据传输完成后,主机发送停止位,结束本次通信。
停止位的产生方式:当SCL为高电平时,SDA产生一个上升沿(从低变高)。
停止位之后,总线回到空闲状态。
2.4 ACK与NAK
ACK(Acknowledge)应答位是I2C的重要机制,用于确认数据是否成功接收。
- ACK(应答):接收方在第9个时钟周期将SDA拉低,表示成功接收
- NAK(不应答):接收方在第9个时钟周期保持SDA为高,表示接收失败或拒绝接收
2.5 I2C的多种模式
| 模式 | 速率 | 说明 |
|---|---|---|
| 标准模式 | 100 kbit/s | 最基础、最常用的模式 |
| 快速模式 | 400 kbit/s | 速度提升4倍 |
| 高速模式 | 3.4 Mbit/s | 高速传输 |
三、SPI总线
3.1 什么是SPI
SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉公司开发的一种同步串行通信协议。它以高速、全双工著称,是三种协议中速度最快的,适合高速数据传输场景。
- 同步通信:有时钟线(SCK)同步数据
- 全双工:可以同时发送和接收数据
- 四根线:MOSI、MISO、SCK、NSS
- 高速:速度可达几十MHz甚至更高
3.2 四根信号线
| 信号线 | 全称 | 说明 |
|---|---|---|
| MOSI | Master Output Slave Input | 主机输出,从机输入。主机发送数据,从机接收 |
| MISO | Master Input Slave Output | 主机输入,从机输出。主机接收数据,从机发送 |
| SCK | Serial Clock | 串行时钟线,由主机控制,同步数据传输 |
| NSS | Negative Slave Select | 从机选择线,低电平有效。主机拉低对应NSS来选中从机 |
💡多从机连接:SPI的每个从机都需要一根独立的NSS线。主机要和哪个从机通信,就把对应的NSS拉低。从机数量多的时候,会占用较多的IO口。
3.3 波特率
SPI的时钟频率由主机决定,通常是系统时钟的分频。
波特率选取原则:
- 在允许的范围内,选择最大值(越快越好)
- 考虑从设备所能承受的极限频率
- 考虑电路板布线所能承受的极限(高速信号完整性)
3.4 比特位传输顺序
SPI支持两种传输顺序:
- MSB First:高位先发(Most Significant Bit first),最常用
- LSB First:低位先发(Least Significant Bit first)
收发双方必须设置相同的传输顺序。
3.5 数据位长度
SPI的数据位长度可以配置:
- 8位:最常用,每次传输1个字节
- 16位:每次传输2个字节,适合16位数据的场景
3.6 时钟极性(CPOL)与时钟相位(CPHA)
SPI有四个工作模式,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。这是SPI最容易搞混的地方。
时钟极性 CPOL(Clock Polarity)
决定了时钟线在空闲时的电平状态:
- CPOL = 0:空闲时SCK为低电平
- CPOL = 1:空闲时SCK为高电平
时钟相位 CPHA(Clock Phase)
决定了数据在第几个时钟沿被采样:
- CPHA = 0:在第一个时钟沿采样(奇数边沿)
- CPHA = 1:在第二个时钟沿采样(偶数边沿)
四种SPI模式
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| 模式0 | 0 | 0 | 空闲低电平,上升沿采样(最常用) |
| 模式1 | 0 | 1 | 空闲低电平,下降沿采样 |
| 模式2 | 1 | 0 | 空闲高电平,下降沿采样 |
| 模式3 | 1 | 1 | 空闲高电平,上升沿采样 |
⚠️重要:主机和从机必须配置为相同的SPI模式(CPOL和CPHA都一致),否则无法正确通信。
四、三大通信协议对比
| 对比项 | UART | I2C | SPI |
|---|---|---|---|
| 信号线数量 | 2根(TX、RX) | 2根(SCL、SDA) | 4根(MOSI、MISO、SCK、NSS) |
| 同步/异步 | 异步 | 同步 | 同步 |
| 通信方式 | 全双工 | 半双工 | 全双工 |
| 速度 | 慢(一般≤1Mbps) | 中等(标准100kbps,高速3.4Mbps) | 快(可达几十Mbps) |
| 多设备支持 | 点对点(1对1) | 多从机(通过地址) | 多从机(通过NSS) |
| 传输顺序 | 低位先发(LSB) | 高位先发(MSB) | 可配置(MSB/LSB) |
| 典型应用 | 串口调试、蓝牙、WiFi模块 | 传感器、EEPROM、RTC时钟 | Flash、显示屏、高速ADC |
五、总结
- UART:最简单、最通用的异步通信,适合调试和低速设备通信,缺点是速度慢、只能点对点
- I2C:两根线实现多设备通信,布线简单,适合板内芯片间通信,缺点是速度较慢、半双工
- SPI:速度最快、全双工,适合高速数据传输,缺点是信号线多、多从机时占用IO多
实际项目中,根据设备的接口、速度要求、布线资源等因素选择合适的通信协议。理解了它们的底层原理和时序,就能快速上手任何一种通信接口的开发。