STM32三大通信协议详解——UART、I2C、SPI前言在嵌入式开发中通信协议是连接单片机与外部设备的桥梁。UART、I2C、SPI是最常用的三大串行通信协议它们各有特点适用于不同的场景。本文将带你深入理解这三种通信协议的工作原理、通信时序和关键参数帮你彻底搞懂它们的区别与使用场景。一、UART串口通信1.1 什么是UARTUARTUniversal Asynchronous Receiver/Transmitter通用异步收发传输器是一种异步串行通信协议。它只需要两根数据线TX发送、RX接收就能实现全双工通信是嵌入式开发中最常用的调试和通信方式。异步通信没有时钟线收发双方通过约定的波特率来同步数据全双工可以同时发送和接收数据两根线TX发送、RX接收交叉连接1.2 数据帧格式UART的数据帧通常由以下几部分组成组成部分长度说明起始位1位低电平表示一帧数据的开始数据位5~8位实际要传输的数据通常是8位1字节校验位0~1位可选用于奇偶校验检测传输错误停止位1~2位高电平表示一帧数据的结束空闲状态串口不传输数据时总线长期保持高电平1。当要发送数据时先拉低电平起始位通知接收方准备接收。1.3 低位先发LSB FirstUART传输数据时有一个重要特点低位先发LSB FirstLeast 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表示每秒传输的二进制位数单位是bpsbits per second。常用波特率9600、19200、38400、57600、115200等。收发双方必须设置相同的波特率否则无法正确解析数据。二、I2C总线2.1 什么是I2CI2CInter-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与NAKACKAcknowledge应答位是I2C的重要机制用于确认数据是否成功接收。ACK应答接收方在第9个时钟周期将SDA拉低表示成功接收NAK不应答接收方在第9个时钟周期保持SDA为高表示接收失败或拒绝接收2.5 I2C的多种模式模式速率说明标准模式100 kbit/s最基础、最常用的模式快速模式400 kbit/s速度提升4倍高速模式3.4 Mbit/s高速传输三、SPI总线3.1 什么是SPISPISerial Peripheral Interface串行外设接口是由摩托罗拉公司开发的一种同步串行通信协议。它以高速、全双工著称是三种协议中速度最快的适合高速数据传输场景。同步通信有时钟线SCK同步数据全双工可以同时发送和接收数据四根线MOSI、MISO、SCK、NSS高速速度可达几十MHz甚至更高3.2 四根信号线信号线全称说明MOSIMaster Output Slave Input主机输出从机输入。主机发送数据从机接收MISOMaster Input Slave Output主机输入从机输出。主机接收数据从机发送SCKSerial Clock串行时钟线由主机控制同步数据传输NSSNegative 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与时钟相位CPHASPI有四个工作模式由时钟极性CPOL和时钟相位CPHA组合决定。这是SPI最容易搞混的地方。时钟极性 CPOLClock Polarity决定了时钟线在空闲时的电平状态CPOL 0空闲时SCK为低电平CPOL 1空闲时SCK为高电平时钟相位 CPHAClock Phase决定了数据在第几个时钟沿被采样CPHA 0在第一个时钟沿采样奇数边沿CPHA 1在第二个时钟沿采样偶数边沿四种SPI模式模式CPOLCPHA说明模式000空闲低电平上升沿采样最常用模式101空闲低电平下降沿采样模式210空闲高电平下降沿采样模式311空闲高电平上升沿采样⚠️重要主机和从机必须配置为相同的SPI模式CPOL和CPHA都一致否则无法正确通信。四、三大通信协议对比对比项UARTI2CSPI信号线数量2根TX、RX2根SCL、SDA4根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多实际项目中根据设备的接口、速度要求、布线资源等因素选择合适的通信协议。理解了它们的底层原理和时序就能快速上手任何一种通信接口的开发。