当前位置: 首页 > news >正文

【单片机】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主机写操作(软件模拟,CPOL=0, CPHA=0) 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的数据以帧的形式异步传输。例如,配置为8N1(8数据位,无校验,1停止位)时,一帧数据的结构如下:

空闲状态(高电平) -> 起始位(1位低电平) -> 数据位(D0~D7, 8位) -> 停止位(1位高电平) -> 空闲状态

通信双方必须使用相同的帧格式。以下是一个简单的UART发送函数核心逻辑:

void UART_SendByte(uint8_t data) { TX_LOW(); // 发送起始位 delay_one_bit_time(); // 延时一个位时间(由波特率决定) for(int i=0; i<8; 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?
    设备间异步通信、调试或作为其他总线转换桥梁的场景。例如:

    1. MCU与PC通信:通过USB转TTL串口线进行打印调试。
    2. 模块间通信:MCU与蓝牙模块(如HC-05)、Wi-Fi模块(如ESP8266)通过AT指令集通信。
    3. 工业控制:MCU通过UART连接RS-485收发器,组建多节点的工业控制网络(如Modbus RTU协议)。
    4. 系统间桥接:在复杂系统中,可能用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外设通信总结
  • 三大通讯协议:UART+IIC+SPI
  • 关于UART、IIC、SPI的一些总结
  • 【车载开发系列】基本通信总线常识及通信协议
http://www.cnnetsun.cn/news/1859657.html

相关文章:

  • GetQzonehistory:3步永久保存QQ空间所有历史说说的终极指南
  • 设计模式之【单例模式】
  • 卷王问卷考试系统 JMeter 压测报告分析
  • 终极Steam创意工坊下载指南:WorkshopDL免费跨平台解决方案
  • WarcraftHelper终极指南:让魔兽争霸3在现代系统重获新生
  • 无锁队列简介
  • Napkin AI:用文字一键生成专业图表的神器
  • 如何快速实现WPS与Zotero无缝集成:终极学术写作效率指南
  • 【无标题】学习codewrrior
  • GEO 怎么优化?2026 年AI搜索优化完整指南与 5 家权威 GEO 优化服务商选型指南
  • 山东大学创新实训-智能体驱动的沉浸式剧本杀互动系统(一)
  • Windows Defender Remover架构解析:深度剖析系统安全组件移除的实现原理
  • MySQL Explain 输出结果与执行逻辑分析
  • XML Notepad:告别XML编辑噩梦的终极解决方案
  • 计算机网络深度解析:数据链路层传输的数据单元究竟是什么?——从帧结构到协议实现的万字全解
  • Qwen3-Embedding-4B镜像部署教程:NVIDIA驱动/CUDA/cuDNN版本兼容性避坑指南
  • RexUniNLU实战案例:气象预报文本中时间/地点/天气现象/强度等级四元组抽取
  • Zotero PDF预览插件终极指南:告别频繁切换,实现高效文献管理
  • 辅助驾驶场景应用:如何用视觉定位模型理解道路目标
  • Expose部署实战:免费托管摄影作品集的3种最佳方案
  • ncmdumpGUI:网易云NCM文件格式转换的C实现方案深度解析
  • Amazon DSSTNE高级配置技巧:激活函数、权重初始化与优化器选择终极指南
  • RTX 4090D+PyTorch 2.8实战:从零开始你的第一个AI项目
  • amphp/amp 完全指南:如何快速掌握 PHP 异步编程新范式
  • 京东完成100亿元票据发行 部分用于偿还现有债务及支付利息
  • SAP ABAP | WBS 元素 24 位(外部)与 8 位(内部)编码转换的分析
  • 如何构建个人游戏串流服务器:Sunshine跨平台低延迟完整方案
  • 深入理解 js-base64:从 TypeScript 到 ES5 的完整编译流程解析
  • 从源码到生产:lz-string压缩库的完整部署与发布指南
  • 如何成为算法工程师:从GitHub_Trending/pyt/Python项目开始的成长路径