第 8 章 输出电路:信号怎么出去
核心问题:一块 MCU 板子不是孤立存在的——它需要跟传感器读数据、跟电脑传固件、跟显示屏刷界面。这些”对话”都依赖通信接口。本章把嵌入式中最常用的 UART、I²C、SPI、USB 四大协议从硬件原理到实际接线一次讲透,最后再解决一个绕不开的问题:电平不匹配怎么办?
本章导读#
| 小节 | 你将学到 |
|---|---|
| 8.1 UART | 串口通信的帧格式、TX/RX 交叉连接、波特率 |
| 8.2 I²C | 两线制原理、上拉电阻计算、地址与应答 |
| 8.3 SPI | 四线制、四种时钟模式、片选的重要性 |
| 8.4 USB | 差分信号 D+/D-、ESD 保护、设备识别机制 |
| 8.5 电平转换 | 电阻分压、BSS138 MOS 管方案、专用芯片 |
| 8.6 协议对比 | 一张表看清什么时候该用什么协议 |
8.1 UART(串口)#
8.1.1 UART 是什么?#
UART 全称 Universal Asynchronous Receiver/Transmitter(通用异步收发器),是嵌入式世界里最古老、最常用的通信接口之一。
三个关键词帮你记住它:
- 异步:没有时钟线,收发双方靠”约定好的速度”(波特率)来同步
- 串行:数据一位一位地发,省线
- 全双工:可以同时发送和接收(TX 和 RX 各管一路)
新手类比:UART 就像两个人打电话。没有人在旁边打拍子(异步),但只要双方说话速度一致(波特率一致),就能听懂对方在说什么。
8.1.2 硬件接线:TX/RX 交叉连接#
UART 通信只需要 3 根线:
| 信号线 | 全称 | 方向 |
|---|---|---|
| TX | Transmit(发送) | 从本设备发出 |
| RX | Receive(接收) | 接收对方数据 |
| GND | 地线 | 共地参考 |
最核心的一条规则:TX 接 RX,RX 接 TX!
设备 A 设备 B
TX ──────────────→ RX
RX ←────────────── TX
GND ───────────── GNDplaintext⚠️ 新手最常犯的错误:TX 接 TX、RX 接 RX → 两个人都在说,没人在听 → 通信失败!
💡 记忆口诀:“我说你听,你说我听” —— TX(我说)必须连到对方的 RX(你听)。
8.1.3 数据帧格式#
UART 把每个要发送的字节封装成一个”帧”,就像寄快递要打包一样:
空闲 ┃ 起始位 ┃ D0 D1 D2 D3 D4 D5 D6 D7 ┃ 校验位 ┃ 停止位 ┃ 空闲
─────╋────────╋───────────────────────────────╋────────╋────────╋─────
高 ┃ 低 ┃ 数据位(8bit) ┃ 可选 ┃ 高 ┃ 高
(1bit) ┃ 低位先发,高位后发 ┃(0/1bit)┃(1~2bit)┃plaintext| 组成部分 | 说明 |
|---|---|
| 起始位 | 固定低电平(1bit),告诉对方”我要开始说话了” |
| 数据位 | 5~8 位,最常用 8 位(1 字节),低位在前(LSB first) |
| 校验位 | 可选,用于检测传输错误(奇校验/偶校验),实际中多用 None |
| 停止位 | 高电平 1~2 bit,表示”这一帧说完了” |
8.1.4 波特率#
波特率(Baud Rate) 表示每秒传输多少个 bit,单位 bps(bits per second)。
常用波特率:9600、38400、57600、115200
最重要的一条规则:收发双方的波特率必须完全一致! 如果发送方用 115200,接收方用 9600,就会收到一堆乱码。
波特率与传输速度的关系(以 8N1 格式为例:8 数据位 + 无校验 + 1 停止位):
每帧 = 1(起始) + 8(数据) + 1(停止) = 10 bit
115200 bps → 115200 / 10 = 11520 字节/秒 ≈ 11.25 KB/s
9600 bps → 9600 / 10 = 960 字节/秒plaintext8.1.5 电平标准:TTL vs RS-232#
嵌入式开发中会遇到两种 UART 电平:
| 标准 | 逻辑 1(高) | 逻辑 0(低) | 常见场景 |
|---|---|---|---|
| TTL 3.3V | 3.3V | 0V | STM32、ESP32、大多数现代 MCU |
| TTL 5V | 5V | 0V | Arduino UNO、部分老模块 |
| RS-232 | -3V ~ -15V | +3V ~ +15V | 工业设备、老式电脑串口 |
⚠️ 关键警告:3.3V MCU 的 RX 引脚不能直接接 5V 设备的 TX!5V 的高电平可能超过 MCU 引脚的耐压极限,导致永久损坏。电平匹配问题在 8.5 节详细讲。
8.1.6 实际场景#
场景 1:MCU 调试打印(最常见)#
开发中最常用的调试手段就是通过 UART 把变量值、运行状态打印到电脑屏幕上:
MCU TX ──→ USB转TTL模块 ──→ USB ──→ 电脑(串口助手软件)
MCU RX ←── RX ←──
GND ──── GND ────plaintext常用的 USB 转 TTL 芯片:
| 芯片 | 特点 | 价格 |
|---|---|---|
| CH340 | 国产,性价比极高,需装驱动 | ≈2 元 |
| CP2102 | Silicon Labs,稳定性好,部分系统免驱 | ≈5 元 |
| FT232 | FTDI,老牌稳定,价格最高 | ≈10 元 |
场景 2:连接 GPS 模块#
GPS 模块(如 NEO-6M)通过 UART 输出 NMEA 定位数据:
GPS TX ──→ MCU RX (GPS 发,MCU 收)
GPS RX ←── MCU TX (MCU 发配置指令给 GPS)plaintext场景 3:连接蓝牙模块#
HC-05 / HC-06 等蓝牙模块也是 UART 接口,MCU 通过发送 AT 指令来配置蓝牙参数。
8.1.7 常见问题排查#
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 完全没数据 | TX/RX 没交叉连接 | 交换 TX 和 RX |
| 收到乱码 | 波特率不一致 | 检查双方波特率设置 |
| 偶尔丢字符 | 线太长 / 波特率太高 | 降低波特率,缩短线缆 |
| MCU 发热 | 5V TX 直连 3.3V RX | 加电平转换电路 |
8.2 I²C#
8.2.1 I²C 是什么?#
I²C(读作”I-squared-C”,也常写成 IIC 或 I2C)全称 Inter-Integrated Circuit(集成电路间总线),由 Philips(现 NXP)于 1982 年发明。
三个关键词:
- 同步:有时钟线 SCL,数据跟着时钟节拍走
- 半双工:SDA 是双向的,但同一时刻只能一个方向传
- 多主多从:一条总线上可以挂很多设备,通过地址区分
新手类比:I²C 就像一个教室。老师(主设备)点名(发地址),被点到名的学生(从设备)才能发言。所有人共用同一张桌子(SDA 线),但按老师的节拍(SCL)轮流说话。
8.2.2 硬件接线:只需两根线#
VCC VCC
│ │
[Rp] [Rp] ← 上拉电阻(必须!)
│ │
SDA ─────────┼────────┬───────┼──── 多个设备共享
SCL ─────────┼────┬───┼───────┼──── 多个设备共享
│ │ │ │
┌──┴┐┌─┴─┐┌┴──┐ ┌─┴─┐
│MCU││传感器││OLED│ │EEPROM│
└───┘└───┘└───┘ └───┘
(主) (从) (从) (从)plaintext| 信号线 | 全称 | 功能 |
|---|---|---|
| SDA | Serial Data | 数据线,传输地址和数据(双向) |
| SCL | Serial Clock | 时钟线,由主设备产生 |
8.2.3 为什么必须加上拉电阻?#
这是 I²C 最容易被忽略但最致命的一个点。
I²C 的所有设备都使用开漏(Open-Drain) 输出结构:
- 设备只能把线拉低(输出 0)
- 设备不能主动拉高(输出 1)
- 高电平完全靠外部上拉电阻把电压”拉上去”
VCC
│
[Rp] ← 上拉电阻:没人在拉低时,把线拉到高电平
│
SDA ── 多个设备(只能下拉到 GND)
│
GND ← 某个设备导通时,把线拉到低电平plaintext没有上拉电阻 = SDA/SCL 永远悬空 = 总线瘫痪!
上拉电阻选多大?#
上拉电阻的大小影响信号上升速度和功耗,需要在两者之间取平衡:
| 总线速率 | 推荐阻值 | 说明 |
|---|---|---|
| 标准模式(100 kHz) | 4.7 kΩ | 最常用,适合大多数场景 |
| 快速模式(400 kHz) | 2.2 kΩ ~ 3.3 kΩ | 速率高,需要更小的电阻加快上升 |
| 高速模式(1 MHz+) | 1 kΩ ~ 2.2 kΩ | 高速场景 |
计算方法(了解即可):
最小值(保证低电平不超过 0.4V):
Rp(min) = (VCC - 0.4V) / 3mA
最大值(保证上升时间满足要求):
Rp(max) = tr / (0.8473 × Cb)
其中 tr = 上升时间要求,Cb = 总线电容plaintext新手建议:99% 的场景直接用 4.7kΩ 就行。如果通信不稳定、波形上升沿太缓,换小一点(如 2.2kΩ)试试。
8.2.4 通信流程#
I²C 的通信严格按照时序进行:
┌─────┐ ┌─────┐
SDA │ └──┐ 地址(7bit) R/W ACK 数据 ACK ┌┘ 停止
──────┘ └─────────────────────────────────┘
↑ Start ↑ Stop
SCL ──┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌──
└─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘plaintext一次完整的 I²C 通信包含以下步骤:
| 步骤 | 动作 | 说明 |
|---|---|---|
| 1 | 起始信号(Start) | SCL 高电平期间,SDA 从高→低 |
| 2 | 发送设备地址(7 bit)+ 读写位(1 bit) | 告诉总线”我要找谁”以及”读还是写” |
| 3 | 等待应答(ACK) | 从设备拉低 SDA 表示”在的,我听到了” |
| 4 | 发送/接收数据 | 每次 8 bit(1 字节) |
| 5 | 应答/非应答(ACK/NACK) | 每传完 1 字节后跟 1 bit 应答 |
| 6 | 停止信号(Stop) | SCL 高电平期间,SDA 从低→高 |
8.2.5 地址与 ACK/NACK#
设备地址#
每个 I²C 从设备都有一个唯一的 7 位地址(也有 10 位地址的,但少见)。
例如:
- BMP280 气压传感器:
0x76或0x77(可通过引脚选择) - SSD1306 OLED:
0x3C或0x3D - AT24C02 EEPROM:
0x50~0x57
⚠️ 注意:有些 datasheet 写的是 8 位地址(把读写位也算进去了),实际 7 位地址要右移 1 位。例如 datasheet 写
0xA0,实际 7 位地址是0x50。
ACK 与 NACK#
每传完 8 位数据后,第 9 个时钟周期是应答位:
| 信号 | SDA 状态 | 含义 |
|---|---|---|
| ACK | 低电平(0) | “我收到了,请继续” |
| NACK | 高电平(1) | “地址不对 / 没准备好 / 别再发了” |
调试技巧:如果你用逻辑分析仪抓 I²C 波形,发现地址发出后一直是 NACK → 检查:①地址是否正确 ②上拉电阻是否焊接 ③设备是否供电正常 ④SDA/SCL 是否接反。
8.2.6 多设备挂载与地址冲突#
I²C 总线上可以挂多个从设备(理论上最多 128 个,实际受电容限制约 10~20 个)。
地址冲突问题:如果两个设备的 7 位地址相同(比如两个 0x76 的 BMP280),它们会同时响应,数据就会打架。
解决方法:
- 查 datasheet 看是否能改地址(如 BMP280 的 SDO 引脚可以切换
0x76/0x77) - 使用 I²C 多路复用器(如 TCA9548A,8 通道切换)
- 把其中一个换型号
8.2.7 实际场景#
| 设备类型 | 典型芯片 | 常用地址 |
|---|---|---|
| 温湿度传感器 | SHT30、AHT20 | 0x44、0x38 |
| 加速度/陀螺仪 | MPU6050、BMI160 | 0x68、0x69 |
| OLED 显示屏 | SSD1306 | 0x3C |
| EEPROM | AT24C02、AT24C256 | 0x50 |
| 实时时钟 | DS3231、PCF8563 | 0x68、0x51 |
I²C 总线扫描:调试时常用一段”扫描代码”,遍历 0x00~0x7F 所有地址,看哪些地址有 ACK 响应,从而确认设备的实际地址。
8.3 SPI#
8.3.1 SPI 是什么?#
SPI 全称 Serial Peripheral Interface(串行外设接口),由 Motorola 公司发明。
三个关键词:
- 同步:有专门的时钟线 SCLK
- 全双工:MOSI 和 MISO 可以同时收发
- 一主多从:主设备通过片选线(CS)选择跟哪个从设备通信
新手类比:SPI 就像老师(主设备)跟学生一对一对话。老师点名(CS 片选),然后老师说话的同时学生也在说话(全双工),速度由老师控制(SCLK)。
8.3.2 硬件接线:四线制#
MCU(主设备) Flash(从设备)
┌───────────┐ ┌───────────┐
│ │ │ │
SCLK │───────────┼───────────────┼─── SCLK │
MOSI │───────────┼───────────────┼─── MOSI │
MISO │←──────────┼───────────────┼─── MISO │
CS0 │───────────┼───────────────┼─── CS │
│ │ │ │
│ CS1 ───┼───────────┐ │ │
│ │ │ │ │
└───────────┘ │ └───────────┘
│
┌─────┴─────┐
│ OLED │
│ (从设备2) │
└───────────┘plaintext| 信号线 | 全称 | 方向 | 功能 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 时钟信号,主设备产生 |
| MOSI | Master Out Slave In | 主→从 | 主设备发数据给从设备 |
| MISO | Master In Slave Out | 从→主 | 从设备发数据给主设备 |
| CS/SS | Chip Select / Slave Select | 主→从 | 选中某个从设备(低电平有效) |
8.3.3 片选(CS)的重要性#
CS 是 SPI 中最关键的控制信号。规则很简单:
- CS = 低电平 → 这个从设备被选中,开始通信
- CS = 高电平 → 这个从设备”沉默”,MISO 变成高阻态
⚠️ 如果同时拉低两个 CS → 两个从设备的 MISO 同时驱动数据线 → 数据冲突,通信失败!
多从设备的正确接法:每个从设备需要独立的 CS 线。
MCU CS0 ──→ 从设备 A 的 CS
MCU CS1 ──→ 从设备 B 的 CS
MCU CS2 ──→ 从设备 C 的 CS
SCLK、MOSI、MISO 三线共享plaintext8.3.4 SPI 的四种工作模式(CPOL / CPHA)#
这是 SPI 中最容易让人困惑的部分。SPI 用两个参数来定义时钟行为:
CPOL(Clock Polarity,时钟极性):
CPOL = 0:时钟空闲时为低电平CPOL = 1:时钟空闲时为高电平
CPHA(Clock Phase,时钟相位):
CPHA = 0:在时钟的第一个边沿采样数据CPHA = 1:在时钟的第二个边沿采样数据
四种组合:
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 常见设备 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 上升沿 | W25Q Flash、大多数传感器 |
| Mode 1 | 0 | 1 | 低 | 下降沿 | 少数设备 |
| Mode 2 | 1 | 0 | 高 | 下降沿 | 部分 ADC |
| Mode 3 | 1 | 1 | 高 | 上升沿 | SD 卡(SPI 模式) |
新手建议:Mode 0 和 Mode 3 最常用。拿到一个新设备,先查 datasheet 的 SPI 时序章节,找到 CPOL 和 CPHA 的配置要求。如果 datasheet 没写,试 Mode 0 先。
8.3.5 SPI vs I²C:什么时候用哪个?#
| 特性 | SPI | I²C |
|---|---|---|
| 信号线数量 | 4 根(+每个从设备 1 根 CS) | 2 根 |
| 速率 | 快(10~80 MHz) | 慢(100 kHz / 400 kHz / 3.4 MHz) |
| 通信方式 | 全双工 | 半双工 |
| 寻址方式 | CS 片选(硬件线) | 地址寻址(软件) |
| 从设备数量 | 受 CS 引脚数限制 | 地址空间内任意挂 |
| 应答机制 | 无 | 有(ACK/NACK) |
| 适用场景 | 高速外设(Flash、屏幕、SD 卡) | 低速外设(传感器、EEPROM、RTC) |
一句话总结:速度要求高用 SPI,省线且设备多用 I²C。
8.3.6 实际场景#
| 设备 | 为什么用 SPI |
|---|---|
| SPI Flash(W25Q64/128) | 读写固件数据,速度要快 |
| SD 卡 | 大量数据记录,SPI 模式兼容性好 |
| TFT LCD(ST7735、ILI9341) | 刷屏幕需要高速传输像素数据 |
| nRF24L01 无线模块 | 配置寄存器 + 收发数据,速度快 |
8.4 USB#
8.4.1 USB 是什么?#
USB(Universal Serial Bus,通用串行总线)是目前最普及的外部接口标准,用于连接电脑和各种外设。
在嵌入式开发中,USB 主要用于:
- MCU 通过 USB 转串口芯片与电脑通信(调试、下载固件)
- MCU 自带 USB 接口(如 STM32 的 USB Device,模拟 HID/CDC 设备)
- 供电(USB 5V 作为板子的电源输入)
8.4.2 USB 2.0 的引脚定义#
USB 2.0 使用 4 根线:
USB Type-A 母座(正面看)
┌──────────────────┐
│ ① ② ③ ④ │
│ VBUS D- D+ GND │
└──────────────────┘plaintext| 引脚 | 信号 | 功能 |
|---|---|---|
| 1 | VBUS | 电源 +5V(供电,最大 500mA) |
| 2 | D- | 数据线(差分对之一) |
| 3 | D+ | 数据线(差分对之一) |
| 4 | GND | 地线 |
8.4.3 D+/D- 差分信号#
USB 的数据传输靠 D+ 和 D- 这对差分信号线:
- 差分信号的原理:不靠单根线的绝对电压判断 0/1,而是看 D+ 和 D- 之间的电压差
- D+ 比 D- 高 → 逻辑 1(J 状态)
- D- 比 D+ 高 → 逻辑 0(K 状态)
差分信号的优势:
- 外部干扰同时影响 D+ 和 D-(共模干扰),做差后干扰被抵消
- 抗干扰能力远强于单端信号
- 这就是为什么 USB 线缆可以比 UART 长得多
USB 2.0 的速度等级:
| 速度 | 速率 | 说明 |
|---|---|---|
| Low-Speed(低速) | 1.5 Mbps | 鼠标、键盘 |
| Full-Speed(全速) | 12 Mbps | 一般外设 |
| High-Speed(高速) | 480 Mbps | 大容量存储、摄像头 |
8.4.4 上拉电阻与设备识别#
USB 主机怎么知道插入的是低速设备还是全速设备?靠 D+ / D- 上的上拉电阻!
| 设备速度 | 上拉电阻位置 | 说明 |
|---|---|---|
| 全速设备(12 Mbps) | D+ 上拉 1.5kΩ 到 3.3V | 主机检测到 D+ 为高 → 全速设备 |
| 低速设备(1.5 Mbps) | D- 上拉 1.5kΩ 到 3.3V | 主机检测到 D- 为高 → 低速设备 |
全速设备(如 USB 转串口):
3.3V
│
[1.5kΩ]
│
D+ ─────┤──── 主机检测到 D+ 为高 → 识别为全速设备
D- ─────┘plaintext这个上拉电阻通常集成在 USB 芯片内部(如 CH340、STM32 USB 外设),不需要外部额外加。
8.4.5 ESD 保护(TVS 阵列)#
USB 接口直接对外,插拔时极易产生静电放电(ESD),电压可高达数千伏,瞬间就能击穿芯片。
必须在 USB 接口处加 TVS(瞬态电压抑制)保护管:
USB 接口 MCU / USB 芯片
D+ ──┬──→ D+
│
[TVS] ← 静电来了,TVS 瞬间导通,把高压泄放到 GND
│
D- ──┼──→ D-
│
[TVS]
│
GND ─┴── GNDplaintext常用的 USB ESD 保护芯片:
| 型号 | 特点 |
|---|---|
| USBLC6-2SC6 | ST 出品,最经典的 USB ESD 保护,SOT-23-6L 封装 |
| PESD5V0U2BT | NXP,低容值(< 1pF),适合高速 USB |
| TPD4E05U06 | TI,4 通道,适合 USB + 其他信号 |
布局要求:TVS 管必须紧挨着 USB 连接器放置,在 ESD 能量进入电路板之前就把它拦截住。
8.4.6 USB 在实际设计中的应用#
大多数嵌入式项目不会直接做 USB 协议栈开发(太复杂),而是使用专用的 USB 转串口芯片:
MCU ──UART──→ USB转串口芯片 ──USB──→ 电脑
(CH340/CP2102)plaintext| 芯片 | 供电 | TTL 电平 | 波特率 | 特点 |
|---|---|---|---|---|
| CH340G | 5V | 5V | ≤2 Mbps | 最便宜,需外接晶振 |
| CH340C | 3.3V/5V | 3.3V | ≤2 Mbps | 内置晶振,兼容 3.3V |
| CP2102N | 3.3V | 3.3V | ≤3 Mbps | 内置晶振,免驱兼容性好 |
| FT232RL | 3.3V/5V | 可配 | ≤3 Mbps | 最稳定,价格最高 |
8.4.7 USB Type-C 简介#
USB Type-C 是目前最新、最主流的 USB 接口形态:
- 24 引脚,上下对称 → 正反都能插
- 支持 USB PD 快充(最高 240W)
- 支持 USB 3.1 / USB4 高速传输(最高 40 Gbps)
嵌入式中只用到 USB 2.0 功能时的 Type-C 引脚:
| 引脚 | 功能 | 说明 |
|---|---|---|
| A4/A9/B4/B9 | VBUS | 电源(4 个并联,承受大电流) |
| A1/A12/B1/B12 | GND | 地线(4 个并联) |
| A6 | D+ | USB 2.0 数据+ |
| A7 | D- | USB 2.0 数据- |
| A5 | CC1 | 配置通道(检测连接、角色协商) |
| B5 | CC2 | 配置通道 |
CC 引脚的作用:Type-C 通过 CC1/CC2 引脚上的电压来检测设备的插入/拔出、判断主机/从机角色、协商供电电流。如果你的设备只做 USB 从设备(Device),需要在 CC1 和 CC2 各接一个 5.1kΩ 下拉电阻到 GND。
8.5 电平转换#
8.5.1 为什么需要电平转换?#
现代嵌入式系统中经常存在多个电压域:
3.3V MCU ←──→ 5V 传感器
1.8V SoC ←──→ 3.3V Flash
3.3V MCU ←──→ 5V GPS 模块plaintext如果不做电平转换直接连接:
- 5V → 3.3V:5V 的高电平超过 3.3V MCU 引脚耐压 → 可能烧毁 MCU!
- 3.3V → 5V:3.3V 的高电平可能达不到 5V 设备的识别阈值 → 通信失败(乱码或无响应)
8.5.2 方案一:电阻分压(单向、低速、最简单)#
适用场景:5V → 3.3V 的单向信号,低速(UART ≤ 115200)
5V TX ──[R1=2kΩ]──┬──→ 3.3V RX
│
[R2=3.3kΩ]
│
GND
Vout = 5V × R2/(R1+R2) = 5V × 3.3/(2+3.3) ≈ 3.1V ✓plaintext优点:便宜,2 个电阻搞定 缺点:
- 只能单向(5V→3.3V)
- 速度受限(RC 时间常数导致上升沿变缓)
- 有静态功耗
⚠️ 不能用于 3.3V → 5V 方向(电阻分压只能降压,不能升压)。
8.5.3 方案二:MOS 管电平转换(双向,I²C 经典方案)#
这是 I²C 总线跨电压域最经典的方案,使用 N-MOS 管 BSS138:
VCC_L (3.3V) VCC_H (5V)
│ │
[Rp] [Rp] ← 两侧各加上拉电阻
│ │
SDA_L ──┤──┬── Gate ├── SDA_H
│ │ │ │
│ │ ┌─┴─┐ │
│ └──┤G │ │
│ │BSS │ │
│ │138 │ │
│ │ │ │
└─────┤S D├──────────┘
└───┘plaintext工作原理(以 SDA 为例):
| 情况 | 过程 | 结果 |
|---|---|---|
| 3.3V 侧拉低 | Gate=3.3V, Source=3.3V → Vgs=0 → MOS 管截止 → 5V 侧靠上拉电阻保持高 | 但 Source 被拉低后 Vgs > Vth → MOS 导通 → 5V 侧也被拉低 |
| 5V 侧拉低 | 5V 侧被拉低 → MOS 管的 Drain 为低 → 体二极管导通 → Source 被拉低 → 3.3V 侧为低 | 双向传递低电平 |
| 两侧都是高 | MOS 管截止,两侧各自被上拉电阻拉到各自的高电平 | 3.3V 和 5V 各自独立 |
BSS138 的关键参数:
- Vgs(th) ≈ 1.3V(阈值电压低,3.3V 就能驱动)
- SOT-23 封装,便宜(< 0.1 元/颗)
适用场景:I²C 总线的 3.3V ↔ 5V 双向电平转换。
8.5.4 方案三:专用电平转换芯片#
当通道数多、速率高、或者不想自己搭电路时,直接用专用芯片:
| 芯片 | 通道数 | 方向控制 | 速率 | 适用场景 |
|---|---|---|---|---|
| TXS0102 | 2 | 自动双向 | ≤2 Mbps | I²C、UART |
| TXB0108 | 8 | 自动双向 | ≤100 Mbps | SPI、多路 GPIO |
| TXS0108E | 8 | 自动双向 | ≤110 Mbps | 高速多通道 |
| SN74AVC4T245 | 4 | DIR 引脚控制 | ≤380 Mbps | 需要方向控制的场景 |
TXB0108 的特点:
- A 端口接 VCCA(如 3.3V),B 端口接 VCCB(如 5V)
- 自动检测数据方向,不需要 DIR 控制线
- 8 通道,适合 SPI 总线(SCLK + MOSI + MISO + CS 才 4 根,还有余量)
- 支持 1.2V ~ 5.5V 之间任意两种电压的转换
注意:TXB0108 不适合 I²C(因为 I²C 的开漏结构与 TXB0108 的内部推挽驱动冲突)。I²C 用 TXS0102 或 BSS138。
8.5.5 方案选择速查#
| 场景 | 推荐方案 |
|---|---|
| 5V TX → 3.3V RX(UART,低速) | 电阻分压 |
| 3.3V ↔ 5V I²C | BSS138 MOS 管 或 TXS0102 |
| 3.3V ↔ 5V SPI(多通道) | TXB0108 |
| 1.8V ↔ 3.3V GPIO | TXS0102 或 SN74AVC 系列 |
8.6 各协议对比表#
8.6.1 核心参数对比#
| 特性 | UART | I²C | SPI | USB 2.0 |
|---|---|---|---|---|
| 信号线数量 | 2(TX/RX)+ GND | 2(SDA/SCL)+ GND | 4(SCLK/MOSI/MISO/CS)+ GND | 2(D+/D-)+ VBUS + GND |
| 通信方式 | 异步、全双工 | 同步、半双工 | 同步、全双工 | 差分、半双工(2.0) |
| 典型速率 | 9600 ~ 115200 bps | 100 kHz / 400 kHz | 1 ~ 80 MHz | 12 Mbps / 480 Mbps |
| 设备数量 | 点对点(1对1) | 一主多从(地址寻址) | 一主多从(CS 片选) | 一主多从(Hub 扩展) |
| 传输距离 | 数米(TTL)/ 15m(RS-232) | 板内(< 1m) | 板内(< 0.5m) | 5m(无 Hub) |
| 是否需要时钟线 | ❌ 无 | ✅ SCL | ✅ SCLK | ✅ 差分时钟嵌入数据 |
| 应答机制 | ❌ 无 | ✅ ACK/NACK | ❌ 无 | ✅ 协议层有 |
| 硬件复杂度 | 极低 | 低 | 中 | 高 |
| 成本 | 极低 | 极低 | 低 | 中 |
8.6.2 选型决策树#
要传什么数据?
│
├── 调试打印 / 简单文本通信
│ └── → UART(最简单,不需要时钟线)
│
├── 读传感器 / EEPROM / RTC / OLED(低速外设)
│ ├── 设备多、IO 口紧张?
│ │ └── → I²C(2 根线挂很多设备)
│ └── 速度要求较高?
│ └── → SPI(速度快 10~100 倍)
│
├── Flash 存储 / 显示屏 / SD 卡(高速外设)
│ └── → SPI(高速全双工)
│
├── 跟电脑通信 / USB 设备
│ └── → USB(通用性强,PC 端免驱)
│
└── 长距离 / 工业环境
├── → RS-485(UART 的差分长距离版本,可达 1200m)
└── → CAN(汽车/工业专用,抗干扰极强)plaintext8.6.3 实际设计中的组合#
在实际的嵌入式系统中,通常多种协议并存:
┌─────────────────────┐
│ │
│ MCU (主控) │
│ │
USB ←──────USB──┤ ├──UART──→ 蓝牙模块
│ ├──UART──→ GPS 模块
电脑 ←──USB转TTL─┤ │
│ ├──I²C───→ 温湿度传感器
│ │ + OLED 显示屏
│ │ + EEPROM
│ │
│ ├──SPI───→ Flash 存储器
│ │ + TFT 显示屏
│ │
└─────────────────────┘plaintext一个典型的 STM32 项目可能同时使用:UART 做调试输出,I²C 读传感器,SPI 驱动 Flash 和屏幕,USB 做固件下载。
本章小结#
| 协议 | 一句话记忆 |
|---|---|
| UART | 两根线、异步、交叉连接,调试必备 |
| I²C | 两根线、开漏上拉、地址寻址,省 IO 挂慢速外设 |
| SPI | 四根线、全双工、片选控制,速度快但费 IO |
| USB | 差分信号、ESD 保护、上拉识别,跟电脑通信的桥梁 |
| 电平转换 | 跨电压域通信的必备手段,选对方案事半功倍 |
关键数字速记#
| 数字 | 含义 |
|---|---|
| 115200 | 最常用的 UART 波特率 |
| 4.7kΩ | I²C 标准模式上拉电阻 |
| 90Ω | USB 2.0 差分阻抗 |
| 5.1kΩ | USB Type-C CC 下拉电阻 |
| 1.5kΩ | USB 全速设备 D+ 上拉电阻 |
| Mode 0 / Mode 3 | SPI 最常用的两种时钟模式 |
思考题#
- 如果你的 STM32(3.3V)要连接一个 5V 的 GPS 模块(UART),TX 和 RX 各应该怎么处理电平?
- 一条 I²C 总线上挂了 3 个设备,总电容约 20pF,使用 4.7kΩ 上拉电阻是否合适?如果换成 400kHz 快速模式呢?
- SPI Flash 要求 CPOL=0, CPHA=0,你的 MCU 应该配置为 Mode 几?
- USB Type-C 接口如果只做 USB 2.0 从设备,最少需要接哪几根线?CC 引脚怎么处理?
参考资料#
- NXP, I²C-bus specification and user manual, Rev. 7 (UM10204)
- USB-IF, USB 2.0 Specification
- Texas Instruments, TXB0108 / TXS0102 Datasheet
- WCH (南京沁恒), CH340 Datasheet
- Silicon Labs, CP2102N Datasheet
相关图片资源参考#
以下是本章内容涉及的关键图片资源,建议在制作教材配图时参考或获取:
| 图片主题 | 来源/建议 | 说明 |
|---|---|---|
| UART 数据帧格式时序图 | 可参考 CSDN UART 帧格式 ↗ | 展示起始位、数据位、校验位、停止位 |
| I²C 通信时序图(Start/Stop/ACK) | NXP UM10204 官方规范文档 | 标准 I²C 时序,含起始、停止、应答信号 |
| I²C 上拉电阻电路 | 可参考 CSDN I²C 上拉电阻计算 ↗ | 开漏结构 + 上拉电阻的电路示意 |
| SPI 四种模式时序图 | 可参考 CSDN SPI 四种模式 ↗ | CPOL/CPHA 的四种组合波形 |
| SPI 主从连接图 | 可参考 电子发烧友 SPI 深度解析 ↗ | 四线制主从设备连接示意 |
| USB 2.0 引脚定义 | USB-IF 官方规范 | Type-A / Micro-USB 引脚图 |
| USB Type-C 24Pin 引脚图 | 可参考 CSDN Type-C 全解析 ↗ | 24Pin 对称引脚分布 |
| USB ESD 保护电路 | 可参考 USBLC6-2SC6 Datasheet ↗ | TVS 阵列在 USB 接口的保护电路 |
| BSS138 电平转换电路 | 可参考 NXP AN10441 应用笔记 | I²C 双向电平转换经典电路 |
| TXB0108 典型应用电路 | Texas Instruments TXB0108 Datasheet | 8 通道自动双向电平转换 |
| 协议对比表 | 本文 8.6 节 | 自制总结对比表 |
💡 图片获取建议:以上图片建议使用 KiCad / Fritzing / draw.io 等工具自行绘制,以获得无版权问题的原创配图。也可以在各芯片厂商的 Datasheet 和 Application Note 中找到官方参考电路图。