简单来说:
- UART:像两个人打电话(异步,全双工,一对一)。注重简单和通用,适合远距离、点对点的数据传输。
- SPI:像老师对多个学生点名(同步,全双工,一对多)。注重高速和高效率,适合板级器件之间的短距离通信。
下面是详细的对比:
对比表格
特性 | UART | SPI |
---|---|---|
全称 | Universal Asynchronous Receiver/Transmitter | Serial Peripheral Interface |
中文名 | 通用异步收发传输器 | 串行外设接口 |
通信方式 | 异步 (无时钟线,双方需约定波特率) | 同步 (有时钟线,由主设备产生) |
数据线 | 2根: TX (发送), RX (接收) | 至少3根(主从1对1时): - SCLK (时钟) - MOSI (主出从入) - MISO (主入从出) + 每增加一个从机需1根SS线 |
拓扑结构 | 点对点 (1对1) | 一主多从 (1对N),通过片选信号(SS/CS)选择从机 |
速度 | 较低 (常用波特率:9600, 115200 等) | 很高 (可达几十甚至上百 MHz) |
数据格式 | 数据包格式:起始位 + 数据位 (5-9) + 可选的奇偶校验位 + 停止位 (1-2) | 没有固定的数据包格式,只是连续的时钟脉冲下传输数据位 |
优缺点 | 优点:硬件简单、所需线少、可实现远距离通信 (如RS-485) 缺点:速度慢、有时钟误差积累问题、效率较低 |
优点:速度极快、协议简单灵活、无时钟误差问题 缺点:需要更多硬件线(尤其是多从机时)、无硬件错误校验、占用主机更多IO口 |
典型应用 | 连接计算机终端、GPS模块、蓝牙/Wi-Fi模块、旧的传感器、通过RS-232/RS-485转换芯片进行工业通信 | 连接Flash存储器、SD卡、显示屏、ADC/DAC转换芯片、高速传感器等需要快速传输数据的片上外设 |
核心区别详解
1. 同步 vs. 异步
这是两者最根本的区别。
SPI (同步):有一根独立的时钟线 (SCLK)。主设备控制时钟,从设备在时钟的上升沿或下降沿读取数据。通信双方无需事先约定速率,也绝不会因为时钟频率微小误差而丢失数据。
- 好比:两个人踩着同一个节拍器跳舞,步调绝对一致。
UART (异步):没有时钟线。通信双方必须事先精确约定一个通信速率(即波特率,如9600bps)。发送方在数据前加上一个“起始位”来告知接收方数据开始,接收方则根据这个约定的波特率来采样数据。如果双方时钟有微小误差,长时间通信可能会产生错位。
- 好比:两个人约好每秒走一步,但各自用自己的手表计时,时间长了可能就会不同步。
2. 硬件连接与拓扑
- UART:非常简单,只需要两根数据线(TX和RX交叉连接)和一根共地线。严格的一对一通信。
- SPI:线更多。基本需要4根线(SCLK, MOSI, MISO, SS)。它的优势在于可以一对多通信。主设备通过控制不同的片选信号 (SS/CS) 来选择与哪个从设备通信。挂载的设备越多,需要的片选线就越多。
3. 速度与效率
- SPI:由于是同步通信且协议开销极小(没有起始位、停止位等),它的速度远高于UART,是高速数据交换(如读写SD卡、显示屏刷新)的首选。
- UART:协议中有起始位、停止位等额外开销,有效数据占比更低,因此效率较低,速度也慢。但它足以应对像传感器每分钟发送一次读数,或者打印调试信息这类不要求高速的场景。
如何选择?
- 需要高速、板内通信? -> 选SPI。 (例如:连接Flash芯片、TFT屏幕)
- 需要远距离、简单、一对一通信? -> 选UART。 (例如:连接电脑串口调试、GPS模块)
- 从设备支持? -> 很多芯片可能只支持其中一种,所以最终选择往往由外设本身决定。