同步与异步、全双工与半双工的博弈
很多初学者背诵了这样的表格:SPI 快,I2C 慢,UART 距离远。
但作为工程师,你需要理解它们背后的“通信哲学”:
时钟同步: 谁来指挥“读数据”的节奏?
数据流向: 能不能一边说一边听?
电路拓扑: 是一对一私聊,还是群聊?
1. 核心分水岭:同步 (Synchronous) vs. 异步 (Asynchronous)
这是通信协议最根本的区别。
1.1 异步通信 (UART) —— “约好的节奏”
UART (Universal Asynchronous Receiver/Transmitter) 没有时钟线。
-
机制: 发送方和接收方必须提前约定好一个速度,叫波特率 (Baud Rate)(例如 115200)。
-
隐患(累积误差):
-
如果发送方时钟偏快 1%,接收方时钟偏慢 1%。
-
第 1 个 bit 可能还能对上。
-
到了第 10 个 bit(停止位),误差累积,接收方可能还在读第 9 个 bit,发送方已经发完了。这就是乱码的来源。
-
-
纠错手段: 16倍过采样 (Oversampling)。接收方不是在一个 bit 的中间读一次,而是快速采样 16 次,试图找到中心点。
1.2 同步通信 (I2C / SPI) —— “听我的指挥”
它们都有一根专门的线:SCL / SCK (Serial Clock)。
-
机制: 主机 (Master) 产生时钟。
-
时钟线拉高/拉低一次,大家就移位传输 1 bit。
-
如果主机把时钟停下,通信立刻暂停。
-
-
优势: 完全不需要约定速度! 主机想发 1MHz 就发 1MHz,想发 1Hz 就发 1Hz。从机不需要高精度晶振,只要跟着时钟线跳舞就行。
-
代价: 多费一根线。
2. 三大协议的“物理人格”分析
2.1 UART:孤独的游侠
-
物理层: 两根线 (TX, RX),交叉连接。推挽输出。
-
双工模式: 全双工 (Full Duplex)。TX 和 RX 是独立的管道,你可以一边发一边收。
-
协议开销: 极大。每发 8 bit 数据,必须加 1 bit 起始位 + 1 bit 停止位。效率仅 80%。
-
应用场景: 调试打印 (Printf)、GSM/GPS 模块、低速长距离通信(配合 RS485)。
2.2 SPI:暴力的直男
SPI (Serial Peripheral Interface) 是最快的片上总线。
-
物理层: 四根线 (SCK, MOSI, MISO, CS)。推挽输出(这是它快的根本原因)。
-
核心逻辑:移位寄存器交换 (Circular Shift Register)
-
这是 SPI 最美妙的地方。它不是“发”和“收”,而是**“交换”**。
-
Master 和 Slave 内部各有一个 8-bit 寄存器,连成一个环。
-
Master 推 1 bit 出来,同时 Slave 就挤 1 bit 进来。
-
推论: SPI 永远是全双工的。即使你只想读,也必须发“空字节 (Dummy Byte)”去把数据“挤”出来。
-
-
应用场景: 液晶屏 (LCD/OLED) 刷屏、Flash 存储读写、高速 ADC/IMU 传感器。
2.3 I2C:精明的管家
I2C (Inter-Integrated Circuit) 是为了省引脚而生的。
-
物理层: 两根线 (SCL, SDA)。开漏输出 + 上拉电阻(详见第30期)。
-
双工模式: 半双工 (Half Duplex)。
-
SDA 线是共享的。这一刻 Master 发地址,下一刻 Slave 发 ACK。必须轮流说话,不能插嘴。
-
-
协议开销: 复杂。
-
Start 信号 + 7 bit 设备地址 + 1 bit 读写位 + ACK + Data + ACK + Stop。
-
如果是读寄存器,还得 Start -> Write Addr -> Ack -> Write Reg -> Ack -> Restart -> Write Addr -> Read -> Ack… 极其繁琐。
-
-
应用场景: 配置芯片参数 (EEPROM, 触摸屏IC, 摄像头配置),低速传感器 (温湿度)。
3. 深度对比:为什么 SPI 比 I2C 快?
很多面试官喜欢问这个问题,如果你只回答“SPI 线多”,那是初级水平。
专家级回答:
物理驱动力: SPI 是推挽输出,有强力的 PMOS/NMOS 驱动,信号上升沿极快,可以轻松跑到 50MHz甚至 100MHz。I2C 是开漏+上拉电阻,靠电阻拉高,电容充电效应导致波形是圆角的,频率很难超过 400kHz(虽然有高速模式,但很少用)。
采样时机: SPI 是边沿采样(上升沿或下降沿读数据,数据在周期中间稳定)。I2C 是电平采样(高电平期间数据必须保持稳定,低电平期间才允许变数据),时序要求更严苛。
协议包袱: SPI 是纯数据流,发什么就是什么。I2C 每发 8 bit 就要等接收方发一个 ACK(第9个时钟周期),这大大拖慢了吞吐量。
4. 拓扑结构:如何挂载多个设备?
SPI 的片选 (Chip Select)
-
方法: 每个从机需要一根独立的 CS 线。
-
优点: 硬件逻辑简单,速度快。
-
缺点: 假如你有 10 个传感器,主控就需要 10 根 CS 线,引脚爆炸。
I2C 的寻址 (Addressing)
-
方法: 所有设备挂在两根线上。靠**“软件地址”**区分。
-
优点: 无论挂多少个设备(理论上限127),只占 2 根线。
-
缺点:
-
地址冲突: 两个同型号传感器的出厂地址通常是一样的(比如都是 0x68)。你必须通过硬件改地址引脚,或者用 I2C Mux 芯片。
-
总线仲裁: 如果一个设备死机把 SDA 拉低锁死,整个总线全部瘫痪(I2C Bus Lockup)。需要 Master 发送 9 个时钟脉冲来“解锁”。
-
5. 总结:选型决策表
| 特性 | UART | SPI | I2C |
| 线数 | 2 (TX, RX) | 3 或 4 (SCK, MOSI, MISO, CS) | 2 (SCL, SDA) |
| 时钟 | 异步 (Asynchronous) | 同步 (Synchronous) | 同步 (Synchronous) |
| 双工 | 全双工 | 全双工 | 半双工 |
| 物理层 | 推挽 (Push-Pull) | 推挽 (Push-Pull) | 开漏 (Open-Drain) |
| 速度 | 中 (Mbps) | 极快 (50Mbps+) | 慢 (100k/400k/1M) |
| 通信距离 | 短 (TTL) / 长 (RS485) | 极短 (板级 < 20cm) | 短 (板级) |
| 适用场景 | 调试, 模块通信 | 屏幕, Flash, 高速AD | 传感器, 配置参数 |
/***************************************************
* 本文为作者《嵌入式开发基础与工程实践》系列文章之一。
* 关注即可订阅后续内容更新,翻阅往期信息,采用异步推送机制,无需主动轮询。
* 转发本文可视为一次网络广播,有助于更多节点接收该信息。
***************************************************/





