【单片机】SPI UART IIC三者区别详解

张开发
2026/4/13 8:45:31 15 分钟阅读

分享文章

【单片机】SPI UART IIC三者区别详解
SPI、UART、IIC是嵌入式系统中最基础且应用最广泛的三种串行通信协议它们在物理接口、通信方式、速度和应用场景上存在根本性差异。下表从核心维度进行了对比对比维度SPI (Serial Peripheral Interface)IIC (Inter-Integrated Circuit)UART (Universal Asynchronous Receiver/Transmitter)通信方式同步(有专用时钟线)同步(有专用时钟线)异步(无时钟线依赖预定义波特率)全/半双工全双工(可同时收发)半双工(同一时刻只能收或发)全双工(独立收发线)信号线数量4线制(SCLK, MOSI, MISO, CS)2线制(SCL, SDA)2线制(TX, RX) 不含地线拓扑结构一主多从(每个从机需独立片选CS)多主多从(通过地址寻址支持总线仲裁)点对点(或通过总线转换器扩展)数据传输速率高(可达数十Mbps)低至中(标准模式100kbps 快速模式400kbps 高速模式3.4Mbps)低至中(常见115200bps 最高可达数Mbps)通信距离短(通常板级1m)短(板级1m)可长可短(TTL电平板级 通过RS232/RS485转换可至千米)主要应用场景高速外设Flash、SD卡、显示屏、ADC/DAC中低速传感器、EEPROM、RTC、IO扩展芯片设备间通信、调试串口、连接蓝牙/WiFi模块、工业总线转换1. 物理层与电气特性深度解析SPI四线同步总线SPI采用主从架构使用4根信号线实现全双工同步通信。SCLK (Serial Clock)由主机产生的时钟信号用于同步数据。MOSI (Master Out Slave In)主机输出从机输入的数据线。MISO (Master In Slave Out)主机输入从机输出的数据线。CS/SS (Chip Select/Slave Select)片选信号低电平有效。主机通过拉低对应从机的CS线来选中该从机进行通信。关键特性SPI没有统一的协议标准其数据有效性由**时钟极性(CPOL)和时钟相位(CPHA)**共同定义形成四种工作模式。通信速率完全由主机SCLK控制可以实现很高的速度。IIC两线半双工总线IIC仅使用两根线支持多主多从拓扑。SCL (Serial Clock)时钟线由主机产生但在多主模式下可被仲裁。SDA (Serial Data)双向数据线采用开漏输出结构必须外接上拉电阻。关键特性IIC通过地址寻址来访问总线上的不同设备7位或10位地址。它内置了起始条件(S)、停止条件(P)、应答位(ACK/NACK)等复杂的协议帧结构并支持时钟拉伸和总线仲裁允许多个主机共享总线而不会造成数据冲突。UART异步串行端口UART是一种异步、点对点的通信协议其通信双方没有共享的时钟信号。TX (Transmit)数据发送线。RX (Receive)数据接收线。关键特性通信双方必须预先约定相同的波特率、数据位、停止位和奇偶校验位。数据传输以“帧”为单位每帧包含起始位低电平、数据位5-9位、可选的校验位和停止位高电平。UART本身只定义TTL电平的逻辑时序要实现长距离通信需借助RS-232点对点±3-15V电平抗干扰强或RS-485差分信号支持多点长距离等物理层标准进行电平转换。2. 协议栈与数据通信流程对比SPI通信流程示例主机向从机写入数据SPI协议简单数据在时钟边沿移入移出无复杂的帧头帧尾。// 模拟SPI主机写操作软件模拟CPOL0 CPHA0 void SPI_WriteByte(uint8_t data) { uint8_t i; CS_LOW(); // 选中从机 for(i 0; i 8; i) { SCLK_LOW(); if(data 0x80) // 先发送最高位(MSB) MOSI_HIGH(); else MOSI_LOW(); delay(); // 短暂延时建立数据稳定时间 SCLK_HIGH(); // 上升沿从机采样数据 data 1; delay(); } SCLK_LOW(); CS_HIGH(); // 取消选中 }此代码展示了SPI最基本的位传输过程。实际中主机会同时通过MISO线接收从机数据实现全双工。IIC通信流程示例主机向从设备地址0x50写入一字节IIC协议有严格的格式每次传输始于START止于STOP。// 模拟IIC主机写操作 void I2C_WriteByte(uint8_t devAddr, uint8_t data) { I2C_Start(); // 发出START条件 (SDA由高到低SCL高) I2C_SendByte(devAddr 1 | 0); // 发送7位设备地址 写位(0) I2C_WaitAck(); // 等待从机应答(ACK) I2C_SendByte(data); // 发送数据字节 I2C_WaitAck(); I2C_Stop(); // 发出STOP条件 (SDA由低到高SCL高) }整个过程体现了IIC的协议控制起始信号、地址帧含读写位、应答机制、数据帧、停止信号。UART数据帧结构UART的数据以帧的形式异步传输。例如配置为8N18数据位无校验1停止位时一帧数据的结构如下空闲状态(高电平) - 起始位(1位低电平) - 数据位(D0~D7, 8位) - 停止位(1位高电平) - 空闲状态通信双方必须使用相同的帧格式。以下是一个简单的UART发送函数核心逻辑void UART_SendByte(uint8_t data) { TX_LOW(); // 发送起始位 delay_one_bit_time(); // 延时一个位时间由波特率决定 for(int i0; i8; i) { // 发送8位数据LSB先行 if(data 0x01) TX_HIGH(); else TX_LOW(); data 1; delay_one_bit_time(); } TX_HIGH(); // 发送停止位 delay_one_bit_time(); }如果接收方在起始位下降沿后在每位的中点采样就能还原出发送的数据。3. 典型应用场景与选型指南何时选择SPI需要高速数据传输的场景。例如驱动TFT液晶显示屏、读写SD卡或SPI Flash存储器、连接高速ADC/DAC芯片。因为其全双工、无协议开销、主控时钟速率高的特点能提供极高的数据吞吐率。缺点是引脚占用多不适合连接大量设备。何时选择IIC连接多个中低速设备且引脚资源紧张的场景。例如在物联网传感器节点上MCU可能需要连接温湿度传感器如SHT30、气压计、EEPROM存储配置。IIC仅需两根线即可挂载多个设备极大地节省了IO口。其速度足以满足传感器数据读取和非易失存储的需求。何时选择UART设备间异步通信、调试或作为其他总线转换桥梁的场景。例如MCU与PC通信通过USB转TTL串口线进行打印调试。模块间通信MCU与蓝牙模块如HC-05、Wi-Fi模块如ESP8266通过AT指令集通信。工业控制MCU通过UART连接RS-485收发器组建多节点的工业控制网络如Modbus RTU协议。系统间桥接在复杂系统中可能用UART连接运行Linux的主处理器和负责实时控制的RTOS协处理器。选型决策流程图需求分析 - 需要连接多个设备且引脚少 - 是 - 选择 IIC | 否 - 需要非常高的传输速度 - 是 - 选择 SPI | 否 - 通信距离较远或需要简单异步通信 - 是 - 选择 UART (电平转换) | 否 - 点对点板级调试/通信 - 选择 UART (TTL)4. 协议扩展与高级特性SPI的变体有3线制半双工共用数据线、QSPI增加数据线以提高吞吐量常用于Flash、OSPI八线制等。IIC的增强除了标准模式100kHz还有快速模式400kHz、高速模式3.4MHz和超快模式5MHz。协议本身支持10位寻址以连接更多设备。UART的延伸UART是逻辑协议其物理层可演变为RS-232个人计算机传统串口、RS-422全双工差分、RS-485半双工差分支持多点极大地扩展了通信距离和抗干扰能力。总结而言SPI胜在速度IIC赢在简洁和寻址能力UART则以其异步特性和灵活性见长。在实际项目中一个微控制器往往同时使用这三种协议分别与不同类型的外设进行最优化的通信。参考来源SPI、IIC、UART、CAN 等常见总线协议IIC、SPI、USART、RS485、RS232、CAN外设通信总结《面试必备》IIC、SPI、USART、RS485、RS232、CAN外设通信总结三大通讯协议UARTIICSPI关于UART、IIC、SPI的一些总结【车载开发系列】基本通信总线常识及通信协议

更多文章