嵌入式开发者的通信协议实战手册:UART、I2C、SPI深度解析与STM32选型指南
在嵌入式项目里,选对通信协议,往往能让开发事半功倍,反之则可能陷入无尽的调试泥潭。你是否曾纠结过,驱动一个OLED屏,到底该用I2C还是SPI?连接多个传感器时,I2C的总线冲突该如何规避?追求高速数据传输时,SPI的四种模式又该怎么选?这些问题背后,是UART、I2C、SPI这三种最基础、也最核心的串行通信协议在“暗自较劲”。
今天,我们不谈枯燥的理论堆砌,而是从一个STM32开发者的实战视角出发,结合具体的硬件接线、CubeMX配置陷阱、HAL库代码的“坑”,以及真实场景下的性能差异,为你梳理出一套清晰的协议选型逻辑。无论你是刚接触嵌入式的新手,还是在项目中面临抉择的老手,这篇文章都将提供可直接落地的参考。
1. 协议本质与硬件层:从引脚开始理解差异
一切通信的基础,都始于那几根物理连线。引脚数量、连接方式,直接决定了协议的能力边界和适用场景。
UART 的硬件最为直白,通常只需要两根线:TXD(发送)和RXD(接收)。它是一种异步通信,意味着收发双方没有共享的时钟线,各自依靠预先约定好的波特率来同步数据位。这种独立性带来了布线简单、适合长距离传输的优点(配合RS-232/485电平转换后),但也因为缺乏统一的时钟,其速率和可靠性天生受限。在STM32项目中,UART常用于打印调试信息、与蓝牙/Wi-Fi模块通信,或者连接一个GPS模块。
注意:连接UART时,务必牢记 “交叉互联” 原则:A设备的TXD必须接到B设备的RXD,A的RXD接到B的TXD。直接同向连接是新手最常犯的错误,会导致通信完全失败。
I2C 的精妙在于其极简的硬件需求:一根数据线(SDA)和一根时钟线(SCL),就实现了多设备组网。它是一个同步、半双工的总线。同步由主机驱动的SCL时钟保证;半双工则是因为SDA线需要时分复用,既要发送数据,也要接收从机的应答。I2C总线上必须为SDA和SCL线连接上拉电阻(通常4.7kΩ),以确保总线在空闲时处于确定的高电平状态。它的优势是节省单片机宝贵的IO引脚,可以轻松挂载数十个设备,非常适合连接温湿度传感器、EEPROM存储器等低速外设。
SPI 则是为速度而生的同步、全双工协议。它至少需要四根线:
- SCK:时钟信号,由主机产生。
- MOSI:主机输出,从机输入。
- MISO:主机输入,从机输出。
- SS/CS:从机片选信号,低电平有效。
当有多个从设备时,每个从设备都需要独立的SS线,这会快速消耗主机的IO口。SPI没有复杂的寻址和应答机制,数据在时钟边沿的驱动下直接移位传输,因此可以获得极高的速率(轻松达到数十MHz)。它常见于需要高速数据流的场合,如SD卡、TFT液晶屏、Flash存储器等。
为了更直观地对比,我将三者的硬件特性汇总如下:
| 特性维度 | UART | I2C | SPI |
|---|---|---|---|
| 信号线数量 | 2 (TX, RX) | 2 (SDA, SCL) | 4+ (SCK, MOSI, MISO, 每个从机1xSS) |

&spm=1001.2101.3001.5002&articleId=154631987&d=1&t=3&u=30158baee949475890024fc129c4d4ca)
3110

被折叠的 条评论
为什么被折叠?



