知识门户

返回

第 8 章 输出电路:信号怎么出去

views | comments

核心问题:一块 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 根线

信号线全称方向
TXTransmit(发送)从本设备发出
RXReceive(接收)接收对方数据
GND地线共地参考

最核心的一条规则:TX 接 RX,RX 接 TX!

设备 A                设备 B
  TX ──────────────→ RX
  RX ←────────────── TX
  GND ───────────── GND
plaintext

⚠️ 新手最常犯的错误: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)。

常用波特率:96003840057600115200

最重要的一条规则:收发双方的波特率必须完全一致! 如果发送方用 115200,接收方用 9600,就会收到一堆乱码。

波特率与传输速度的关系(以 8N1 格式为例:8 数据位 + 无校验 + 1 停止位):

每帧 = 1(起始) + 8(数据) + 1(停止) = 10 bit

115200 bps → 115200 / 10 = 11520 字节/秒 ≈ 11.25 KB/s
9600 bps   → 9600 / 10 = 960 字节/秒
plaintext

8.1.5 电平标准:TTL vs RS-232#

嵌入式开发中会遇到两种 UART 电平:

标准逻辑 1(高)逻辑 0(低)常见场景
TTL 3.3V3.3V0VSTM32、ESP32、大多数现代 MCU
TTL 5V5V0VArduino 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 元
CP2102Silicon Labs,稳定性好,部分系统免驱≈5 元
FT232FTDI,老牌稳定,价格最高≈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
信号线全称功能
SDASerial Data数据线,传输地址和数据(双向)
SCLSerial 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 气压传感器:0x760x77(可通过引脚选择)
  • SSD1306 OLED:0x3C0x3D
  • 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),它们会同时响应,数据就会打架。

解决方法:

  1. 查 datasheet 看是否能改地址(如 BMP280 的 SDO 引脚可以切换 0x76/0x77
  2. 使用 I²C 多路复用器(如 TCA9548A,8 通道切换)
  3. 把其中一个换型号

8.2.7 实际场景#

设备类型典型芯片常用地址
温湿度传感器SHT30、AHT200x44、0x38
加速度/陀螺仪MPU6050、BMI1600x68、0x69
OLED 显示屏SSD13060x3C
EEPROMAT24C02、AT24C2560x50
实时时钟DS3231、PCF85630x68、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 硬件接线:四线制#

信号线全称方向功能
SCLKSerial Clock主→从时钟信号,主设备产生
MOSIMaster Out Slave In主→从主设备发数据给从设备
MISOMaster In Slave Out从→主从设备发数据给主设备
CS/SSChip 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 三线共享
plaintext

8.3.4 SPI 的四种工作模式(CPOL / CPHA)#

这是 SPI 中最容易让人困惑的部分。SPI 用两个参数来定义时钟行为:

CPOL(Clock Polarity,时钟极性)

  • CPOL = 0:时钟空闲时为低电平
  • CPOL = 1:时钟空闲时为高电平

CPHA(Clock Phase,时钟相位)

  • CPHA = 0:在时钟的第一个边沿采样数据
  • CPHA = 1:在时钟的第二个边沿采样数据

四种组合:

模式CPOLCPHA空闲电平采样边沿常见设备
Mode 000上升沿W25Q Flash、大多数传感器
Mode 101下降沿少数设备
Mode 210下降沿部分 ADC
Mode 311上升沿SD 卡(SPI 模式)

新手建议:Mode 0 和 Mode 3 最常用。拿到一个新设备,先查 datasheet 的 SPI 时序章节,找到 CPOL 和 CPHA 的配置要求。如果 datasheet 没写,试 Mode 0 先。

8.3.5 SPI vs I²C:什么时候用哪个?#

特性SPII²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 主要用于:

  1. MCU 通过 USB 转串口芯片与电脑通信(调试、下载固件)
  2. MCU 自带 USB 接口(如 STM32 的 USB Device,模拟 HID/CDC 设备)
  3. 供电(USB 5V 作为板子的电源输入)

8.4.2 USB 2.0 的引脚定义#

USB 2.0 使用 4 根线

USB Type-A 母座(正面看)
┌──────────────────┐
│  ① ② ③ ④       │
│ VBUS D- D+ GND   │
└──────────────────┘
plaintext
引脚信号功能
1VBUS电源 +5V(供电,最大 500mA)
2D-数据线(差分对之一)
3D+数据线(差分对之一)
4GND地线

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 ─┴── GND
plaintext

常用的 USB ESD 保护芯片

型号特点
USBLC6-2SC6ST 出品,最经典的 USB ESD 保护,SOT-23-6L 封装
PESD5V0U2BTNXP,低容值(< 1pF),适合高速 USB
TPD4E05U06TI,4 通道,适合 USB + 其他信号

布局要求:TVS 管必须紧挨着 USB 连接器放置,在 ESD 能量进入电路板之前就把它拦截住。

8.4.6 USB 在实际设计中的应用#

大多数嵌入式项目不会直接做 USB 协议栈开发(太复杂),而是使用专用的 USB 转串口芯片

MCU ──UART──→ USB转串口芯片 ──USB──→ 电脑
               (CH340/CP2102)
plaintext
芯片供电TTL 电平波特率特点
CH340G5V5V≤2 Mbps最便宜,需外接晶振
CH340C3.3V/5V3.3V≤2 Mbps内置晶振,兼容 3.3V
CP2102N3.3V3.3V≤3 Mbps内置晶振,免驱兼容性好
FT232RL3.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/B9VBUS电源(4 个并联,承受大电流)
A1/A12/B1/B12GND地线(4 个并联)
A6D+USB 2.0 数据+
A7D-USB 2.0 数据-
A5CC1配置通道(检测连接、角色协商)
B5CC2配置通道

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 方案三:专用电平转换芯片#

当通道数多、速率高、或者不想自己搭电路时,直接用专用芯片:

芯片通道数方向控制速率适用场景
TXS01022自动双向≤2 MbpsI²C、UART
TXB01088自动双向≤100 MbpsSPI、多路 GPIO
TXS0108E8自动双向≤110 Mbps高速多通道
SN74AVC4T2454DIR 引脚控制≤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²CBSS138 MOS 管 或 TXS0102
3.3V ↔ 5V SPI(多通道)TXB0108
1.8V ↔ 3.3V GPIOTXS0102 或 SN74AVC 系列

8.6 各协议对比表#

8.6.1 核心参数对比#

特性UARTI²CSPIUSB 2.0
信号线数量2(TX/RX)+ GND2(SDA/SCL)+ GND4(SCLK/MOSI/MISO/CS)+ GND2(D+/D-)+ VBUS + GND
通信方式异步、全双工同步、半双工同步、全双工差分、半双工(2.0)
典型速率9600 ~ 115200 bps100 kHz / 400 kHz1 ~ 80 MHz12 Mbps / 480 Mbps
设备数量点对点(1对1)一主多从(地址寻址)一主多从(CS 片选)一主多从(Hub 扩展)
传输距离数米(TTL)/ 15m(RS-232)板内(< 1m)板内(< 0.5m)5m(无 Hub)
是否需要时钟线❌ 无✅ SCL✅ SCLK✅ 差分时钟嵌入数据
应答机制❌ 无✅ ACK/NACK❌ 无✅ 协议层有
硬件复杂度极低
成本极低极低

8.6.2 选型决策树#

8.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 3SPI 最常用的两种时钟模式

思考题#

  1. 如果你的 STM32(3.3V)要连接一个 5V 的 GPS 模块(UART),TX 和 RX 各应该怎么处理电平?
  2. 一条 I²C 总线上挂了 3 个设备,总电容约 20pF,使用 4.7kΩ 上拉电阻是否合适?如果换成 400kHz 快速模式呢?
  3. SPI Flash 要求 CPOL=0, CPHA=0,你的 MCU 应该配置为 Mode 几?
  4. USB Type-C 接口如果只做 USB 2.0 从设备,最少需要接哪几根线?CC 引脚怎么处理?

参考资料#

  1. NXP, I²C-bus specification and user manual, Rev. 7 (UM10204)
  2. USB-IF, USB 2.0 Specification
  3. Texas Instruments, TXB0108 / TXS0102 Datasheet
  4. WCH (南京沁恒), CH340 Datasheet
  5. 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 DatasheetTVS 阵列在 USB 接口的保护电路
BSS138 电平转换电路可参考 NXP AN10441 应用笔记I²C 双向电平转换经典电路
TXB0108 典型应用电路Texas Instruments TXB0108 Datasheet8 通道自动双向电平转换
协议对比表本文 8.6 节自制总结对比表

💡 图片获取建议:以上图片建议使用 KiCad / Fritzing / draw.io 等工具自行绘制,以获得无版权问题的原创配图。也可以在各芯片厂商的 Datasheet 和 Application Note 中找到官方参考电路图。

Comment seems to stuck. Try to refresh?✨