SPI(Serial Peripheral Interface)是一种同步串行通信协议,广泛用于MCU与外设之间的短距高速通信。
| 信号 | 方向 | 功能 | GPIO配置 |
|---|---|---|---|
| SCLK | 主→从 | 时钟 | 输出(主机)/输入(从机) |
| MOSI | 主→从 | 主出从入数据 | 输出(主机)/输入(从机) |
| MISO | 从→主 | 主入从出数据 | 输入(主机)/输出(从机) |
| CS | 主→从 | 片选(低有效) | 输出(主机) |
每条SPI信号线使用GPIO单元,但需要额外的时序控制和模式配置。
* SPI Master IO配置
*
* SCLK: 输出模式, 推挽驱动, 4-8mA
* MOSI: 输出模式, 推挽驱动, 4-8mA
* MISO: 输入模式, 施密特触发
* CS[0..N]: 输出模式, 推挽驱动, 4mA
*
* 时钟频率: 1-50MHz (标准SPI)
* 50-200MHz (高速SPI)
* SPI时钟生成器
* 从APB时钟分频得到SCLK
* f_sclk = f_apb / (2 × (prescaler + 1))
* SPI数据移位寄存器
* 发送: 并行数据 → 移位寄存器 → MOSI (MSB/LSB first)
* 接收: MISO → 移位寄存器 → 并行数据
* SPI Slave IO配置
*
* SCLK: 输入模式, 施密特触发
* MOSI: 输入模式, 施密特触发
* MISO: 输出模式, 推挽驱动, 三态(当CS无效时)
* CS: 输入模式, 施密特触发, 低有效
* 从机关键设计:
* 1. CS无效时MISO必须进入高阻态
* 2. 需要快速响应CS下降沿(开始通信)
* 3. SCLK输入需要抗毛刺滤波
SPI有4种工作模式(CPOL×CPHA),决定了时钟极性和采样边沿:
| 模式 | CPOL | CPHA | 空闲SCLK | 采样边沿 |
|---|---|---|---|---|
| 0 | 0 | 0 | 低 | 上升沿 |
| 1 | 0 | 1 | 低 | 下降沿 |
| 2 | 1 | 0 | 高 | 下降沿 |
| 3 | 1 | 1 | 高 | 上升沿 |
* 22-spi-timing.sp
* SPI Mode 0 时序验证仿真
Vddio vddio 0 3.3
Vdd vdd 0 1.0
* SPI时钟 (10MHz, Mode 0: CPOL=0, CPHA=0)
Vsclk sclk 0 pulse 0 3.3 0 2n 2n 48n 100n
* 片选
Vcs cs 0 pwl 0 3.3 10n 3.3 10.02n 0 810n 0 810.02n 3.3
* MOSI数据 (0xA5 = 10100101 MSB first)
Vmosi mosi 0 pwl 0 0 10n 0 10.02n 3.3 110n 3.3 110.02n 0
+ 210n 0 210.02n 3.3 310n 3.3 310.02n 0
+ 410n 0 410.02n 0 510n 0 510.02n 3.3
+ 610n 3.3 610.02n 0 710n 0 710.02n 3.3
* MOSI输入接收器(施密特触发器)
Mp_s1 a mosi vddio vddio pch W=4u L=0.35u
Mp_s2 mosi_sch a vddio vddio pch W=8u L=0.35u
Mp_s3 a mosi_sch vddio vddio pch W=2u L=0.35u
Mn_s1 b mosi 0 0 nch W=4u L=0.35u
Mn_s2 mosi_sch b 0 0 nch W=4u L=0.35u
Mn_s3 b mosi_sch 0 0 nch W=2u L=0.35u
* SCLK输入接收器
Mp_s4 c sclk vddio vddio pch W=4u L=0.35u
Mp_s5 sclk_sch c vddio vddio pch W=8u L=0.35u
Mp_s6 c sclk_sch vddio vddio pch W=2u L=0.35u
Mn_s4 d sclk 0 0 nch W=4u L=0.35u
Mn_s5 sclk_sch d 0 0 nch W=4u L=0.35u
Mn_s6 d sclk_sch 0 0 nch W=2u L=0.35u
* MISO输出驱动
Vmisodata miso_data 0 pwl 0 0 10n 0 10.02n 3.3
Mp_miso miso miso_gate vddio vddio pch W=200u L=0.35u
Mn_miso miso miso_gate 0 0 nch W=80u L=0.35u
Mp_mg miso_gate miso_data cs_b vddio vddio pch W=16u L=0.35u
Mn_mg miso_gate miso_data cs 0 0 nch W=8u L=0.35u
Mp_csb cs_b cs vddio vddio pch W=4u L=0.35u
Mn_csb cs_b cs 0 0 nch W=2u L=0.35u
Cload_miso miso 0 10p
.tran 0.5n 900n
.measure tran tsetup FIND V(mosi_sch) WHEN V(sclk_sch)=1.65 RISE=1
.measure tran miso_trise TRIG V(miso_data) VAL=1.65 RISE=1 TARG V(miso) VAL=1.65 RISE=1
.print tran V(sclk) V(cs) V(mosi) V(mosi_sch) V(miso)
.end
SPI时序仿真结果:
SPI通过多个CS线支持多从机,但每个从机需要独立的CS信号:
SPI主机APB时钟为100MHz。设计分频器生成10MHz、20MHz、50MHz的SCLK。写出分频比设置。
f_sclk = f_apb / (2 × (prescaler + 1))
10MHz: prescaler = 100/(2×10) - 1 = 4
20MHz: prescaler = 100/(2×20) - 1 = 1.5 → 取2, 实际16.7MHz
50MHz: prescaler = 100/(2×50) - 1 = 0 → 实际50MHz
完成本课学习,你已经掌握了SPI接口IO的设计方法!
✅ 已掌握 SPI四线IO ✅ 已掌握 时序设计 ✅ 已掌握 主从配置 ✅ 已掌握 多从机管理
QSPI是SPI的扩展,使用4条数据线并行传输,速率提升4倍:
| 模式 | 数据线 | 等效速率 | 应用 |
|---|---|---|---|
| 标准SPI | 1(MOSI) | 1× | 常规外设 |
| Dual SPI | 2(IO0/IO1) | 2× | 双倍速率Flash |
| Quad SPI | 4(IO0-IO3) | 4× | 高速Flash |
| Octal SPI | 8(IO0-IO7) | 8× | 超高速存储 |
QSPI的数据线需要支持方向切换(命令阶段输入,数据阶段输出):
高速SPI(>25MHz)可能产生EMI问题:
SPI接口在工业环境中面临严重的噪声干扰,需要提高抗扰度。
| 噪声源 | 影响 | 缓解方法 |
|---|---|---|
| 电源纹波 | 时钟抖动 | 独立LDO供电 |
| 地弹 | 数据误码 | 星型接地 |
| 串扰 | 时钟/数据耦合 | 屏蔽走线 |
| EMI | 辐射干扰 | 降低压摆率 |
| ESD | 器件损伤 | TVS保护 |
| 参数 | 符号 | 典型值 | 单位 |
|---|---|---|---|
| IO电压(3.3V) | VDDIO | 3.0-3.6 | V |
| IO电压(1.8V) | VDDIO | 1.62-1.98 | V |
| 核心电压 | VDD | 0.9-1.2 | V |
| ESD二极管Vf | Vf | 0.6-0.8 | V |
| GGNMOS Vt1 | Vt1 | 6-10 | V |
| GGNMOS Vh | Vh | 3-5 | V |
| GGNMOS It2 | It2 | 8-15 | mA/μm |
| SCR Vh | Vh | 1-2 | V |
| SCR It2 | It2 | 50-80 | mA/μm |
| RC钳位时间常数 | τ | 0.5-2 | μs |
| 施密特Vt+ | Vt+ | 2.0 | V |
| 施密特Vt- | Vt- | 1.3 | V |
| 焊盘电容 | Cpad | 2-5 | pF |
| 焊线电感 | Lwire | 1-5 | nH |
| CML驱动电流 | Itail | 4-16 | mA |
| 差分阻抗 | Zdiff | 85-100 | Ω |
| HBM 2kV峰值电流 | Ipeak | 1.33 | A |
| HBM 4kV峰值电流 | Ipeak | 2.67 | A |
| CDM 500V峰值电流 | Ipeak | 5-15 | A |
| LVTTL VIH(min) | VIH | 2.0 | V |
| LVTTL VIL(max) | VIL | 0.8 | V |
I_HBM = V_HBM / R_HBM = V_HBM / 1500ΩV_clamp = Vf + VDD + I×Rbus + V_clamp_internalRC时间常数: τ = R × C谐振频率: f0 = 1/(2π√(LC))差分摆幅: Vdiff = Itail × Rload × 2SSO噪声: V_noise = L × di/dtESD窗口: Window = BVox - margin - (VDD + margin)环路带宽: fBW ≈ fref / (2×N×M)SPI协议虽然简单,但在实际应用中有多种扩展:
传统SPI每时钟周期传输1 bit,通过增加数据线可以成倍提升吞吐率:
标准SPI (1-bit):
SCLK: _|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_
MOSI: D7 D6 D5 D4 D3 D2 D1 D0
→ 8个SCLK周期传输1字节
Dual SPI (2-bit):
SCLK: _|‾|_|‾|_|‾|_|‾|_
IO0: D7 D5 D3 D1
IO1: D6 D4 D2 D0
→ 4个SCLK周期传输1字节
Quad SPI (4-bit):
SCLK: _|‾|_|‾|_
IO0: D7 D3
IO1: D6 D2
IO2: D5 D1
IO3: D4 D0
→ 2个SCLK周期传输1字节
Octal SPI (8-bit):
SCLK: _|‾|_
IO0-7: D7-D0
→ 1个SCLK周期传输1字节
SPI Flash是QSPI最常见的应用,支持高速读写: