ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SPI技术系列 03 · SPI 速度与电气约束

SPI技术系列 03 · SPI 速度与电气约束

📚 I2C 技术系列 · 持续更新中

本系列从推挽电气层一路打到 Linux spi 子系统,把"四根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。

👉 想系统追更,戳这里查看完整专栏:
【SPI 技术系列】
👉 其他技术系列专栏,欢迎关注、交流、共同成长:
【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】


本篇定位:器件标 50MHz,SPI 能不能配 50MHz 跑?答案常常是"不能"。本篇讲 SPI 频率上限的来源——驱动能力 + 走线 + 负载电容 + 边沿 + 建立保持约束,让你会算"实际能跑多快"。

标称速度 ≠ 实际速度
Flash 标 50MHz,你配 50MHz 读取出错,降速到 30MHz 才行。原因:PCB 走线 SI、负载电容、控制器驱动能力、采样窗口约束。会算实际速度上限,是 SPI 工程的必备技能。对照 【I2C 技术系列 06】I2C 速度模式与时序参数 看,理解速度约束的共通思路。


目录

  • 一、SPI 频率上限的来源
    • 1.1 各环节典型值
    • 1.2 短板效应(木桶)
  • 二、SCK 周期与移位约束
    • 2.1 SCK 周期 = 1/fSCK
    • 2.2 移位寄存器约束
    • 2.3 控制器分频
    • 2.4 占空比
  • 三、建立保持时间约束
    • 3.1 tSU(建立时间)/ tHD(保持时间)
    • 3.2 采样窗口
    • 3.3 速度上限(采样约束)
    • 3.4 主机读 MISO 的额外约束
  • 四、时钟失真影响
    • 4.1 Jitter(抖动)
    • 4.2 Skew(偏斜)
    • 4.3 失真对速度的限制
    • 4.4 DDR 模式约束
  • 五、SoC 控制器最高频率
    • 5.1 控制器限制
    • 5.2 QSPI 控制器
    • 5.3 DMA 限制
  • 六、实际速度估算
    • 6.1 估算流程
    • 6.2 估算示例
    • 6.3 降速排查法
  • 七、关键问题 Q&A
      • Q1:器件标 50MHz,配 50MHz 出错,为什么?
    • Q2:QSPI 50MHz 等效 SDR 多少?
    • Q3:SPI 速度和走线长度什么关系?
    • Q4:采样窗口怎么算?
    • Q5:DDR 模式为什么对 SI 更敏感?
    • Q6:SPI 最高频率能到多少?
  • 八、实战案例
    • 案例 1:W25Q 配 104MHz 不稳定
    • 案例 2:传感器只能跑 5MHz
    • 案例 3:SPI 显示屏 40MHz 刷屏花
    • 案例 4:DMA 跟不上 SPI,UNDERRUN
    • 案例 5:PLL 切换瞬间 SPI 错乱
    • 案例 6:多从总线高速失败
  • 九、本篇小结与速查
    • 核心要点
    • 速度估算速查
    • 降速排查表
    • 延伸阅读
    • 参考资料

一、SPI 频率上限的来源

SPI 能跑多快,受多个环节约束,取最短板:

实际频率上限 = min( 控制器最高频率, 从机最高频率(器件 spec), SI 约束(走线 + 负载 + 边沿), 采样窗口约束(tSU + tHD + 余量), 时钟失真约束(Jitter + Skew) )

1.1 各环节典型值

环节典型上限
MCU 控制器(STM32)25~50MHz(F1)/ 100MHz+(H7)
RISC-V SoC 控制器50~200MHz
W25Q Flash50~104MHz(QSPI)/ 133MHz(Octal)
传感器(LIS3DH)5~10MHz
OLED(ILI9341)15~40MHz(写)
ADC(MCP3008)3MHz / MAX6675 4MHz

1.2 短板效应(木桶)

  • Flash 标 104MHz,但控制器只能 50MHz → 实际 50MHz
  • 控制器能 100MHz,但走线 SI 限 60MHz → 实际 60MHz
  • 全链路最慢环节决定实际速度

嵌入式视角:别只看器件标称
W25Q128 标 133MHz,配 133MHz 跑不通,查了一圈发现是 PCB 走线 SI 限制。速度是全链路的木桶,器件标称只是其中一块板。工程上先按器件标称的 50~70% 配,稳定后再逐步提频。


二、SCK 周期与移位约束

2.1 SCK 周期 = 1/fSCK

fSCK = 50MHz → T = 20ns fSCK = 30MHz → T = 33ns

2.2 移位寄存器约束

每次 SCK 边沿,移位寄存器移一位。约束:

  • tHIGH(SCK 高电平)≥ 移位寄存器建立时间 + 余量
  • tLOW(SCK 低电平)≥ 移位寄存器保持 + 余量
  • 典型:移位寄存器 ns 级,50MHz(20ns)够用

2.3 控制器分频

fSCK = fPCLK / 分频系数 STM32: 分频系数 = 2,4,8,...,256(BR[2:0]) fPCLK=42MHz → 可选 21M/10.5M/5.25M/... DesignWare SPI: 分频更灵活 fSCK = fPCLK / (2 × (1 + CLKDIV))
  • 控制器分频系数是离散的(2 的幂或步进)
  • 实际 fSCK 可能略低于目标

2.4 占空比

  • SCK 占空比通常 50%
  • 高速时占空比失真(< 45% 或 > 55%)压缩采样窗口
  • DDR 模式(上下沿采样)对占空比敏感,要求 45~55%

三、建立保持时间约束

3.1 tSU(建立时间)/ tHD(保持时间)

SCK ‾‾‾‾‾‾‾\___/‾‾‾‾‾‾\___/‾‾ ↑采样沿 MOSI ‾‾‾\_______X___________ ←tSU→←tHD→ 建立 保持
  • tSU:MOSI 在 SCK 采样沿前需稳定的时间
  • tHD:MOSI 在 SCK 采样沿后需保持的时间
  • 器件 datasheet 给值(几 ns)

3.2 采样窗口

采样窗口 = T_SCK - tSU - tHD 例:50MHz(T=20ns),tSU=5ns,tHD=5ns 采样窗口 = 20 - 5 - 5 = 10ns (MOSI 必须在这 10ns 内稳定)
  • 频率越高,T 越小,采样窗口越窄
  • 窗口 < 0(即 tSU + tHD > T)→ 无法采样,速度上限

3.3 速度上限(采样约束)

fSCK_max ≤ 1 / (tSU + tHD + tmargin) tmargin:余量(几 ns,给 Jitter/Skew/边沿) 例:tSU=5,tHD=5,tmargin=3 → fmax ≤ 1/13ns ≈ 77MHz

3.4 主机读 MISO 的额外约束

主机发 SCK,从机按 SCK 驱动 MISO,MISO 传回主机采样:

Master 发 SCK ──→ Slave 收 ──→ Slave 驱动 MISO ──→ Master 采样 总时延 = SCK 走线时延 + 从机响应时延 + MISO 走线时延
  • 这个时延吃掉采样窗口
  • 高速时(50MHz+),时延占比大,需走线等长 + 低时延从机

四、时钟失真影响

4.1 Jitter(抖动)

  • SCK 周期的随机波动
  • 来源:PLL 相位噪声、电源噪声、串扰
  • 典型几十 ps,高速时占采样窗口比例大

4.2 Skew(偏斜)

  • 多通道间 SCK 到达时刻差(02 篇)
  • 多从 SPI 各从 SCK 时差
  • QSPI 多数据线 SCK 对数据线时差

4.3 失真对速度的限制

有效采样窗口 = T - tSU - tHD - tJitter - tSkew fSCK_max ≤ 1 / (tSU + tHD + tJitter + tSkew + tmargin)
  • Jitter + Skew 越大,速度上限越低
  • 高速 SPI 要低 Jitter 时钟源 + 等长走线

4.4 DDR 模式约束

  • DDR 上下沿都采样,采样窗口 = T/2
  • 50MHz DDR 等效 100MHz SDR 的采样压力
  • 对 Jitter/Skew 更敏感,严格等长

五、SoC 控制器最高频率

5.1 控制器限制

  • 控制器有最高 fSCK(由 PCLK 和分频器决定)
  • STM32F1: fPCLK/2,最高 18~36MHz
  • STM32H7: 最高 100MHz+(独立 SPI 时钟)
  • RISC-V SoC: 50~200MHz(看 IP)

5.2 QSPI 控制器

  • QSPI 控制器有独立高频时钟
  • 支持 DDR,等效翻倍
  • W25Q 用的 QSPI 控制器(如 STM32 QSPI / RK QSPI)可达 100MHz+ DDR

5.3 DMA 限制

  • DMA 传输速度要跟上 SPI 速度
  • 50MHz SPI = 50MB/s(8bit)/ 200MB/s(32bit QSPI)
  • DMA 带宽不足 → UNDERRUN/OVERRUN

六、实际速度估算

6.1 估算流程

1. 查器件 spec fmax(Flash 104MHz) 2. 查控制器 fmax(60MHz) 3. 估算 SI 约束: tr = 2.2 × Rdrv × Cload 若 tr > T/4 → SI 限速 4. 估算采样约束: fmax = 1 / (tSU + tHD + tJitter + tSkew + 余量) 5. 取 min(器件, 控制器, SI, 采样) 6. 实际取估算值的 70% 留余量

6.2 估算示例

场景:W25Q128(104MHz QSPI)+ STM32H7(100MHz QSPI)+ 5cm 走线 + QSPI DDR

1. 器件:104MHz 2. 控制器:100MHz 3. SI:tr=2ns(QSPI 6 线等长 + 33Ω 串联),L_crit=5.8cm,5cm < 临界,OK 4. 采样:tSU=3,tHD=3,tJitter=0.2,tSkew=0.3,余量=2 → fmax=1/8.5ns≈118MHz 5. min(104,100,118)=100MHz 6. 实际配 80MHz DDR(等效 160MB/s),稳定

6.3 降速排查法

  • 配目标速度出错,降到 1/2 测试
  • 半速稳定 → SI 或采样约束问题
  • 半速还错 → 协议/CS/模式问题(非速度)

七、关键问题 Q&A

Q1:器件标 50MHz,配 50MHz 出错,为什么?

A:可能性:① PCB 走线 SI 不足(反射/串扰);② 负载电容大,tr 退化;③ 采样窗口不足(tSU+tHD+Jitter > T);④ 控制器驱动能力弱;⑤ 走线不等长,Skew 大。降速测试,稳定则属速度问题,查 SI 和采样约束。

Q2:QSPI 50MHz 等效 SDR 多少?

A:QSPI 50MHz SDR = 4 bit × 50MHz = 200Mbit/s = 25MB/s。若 DDR 模式,50MHz DDR = 4 bit × 50MHz × 2 = 400Mbit/s = 50MB/s。QSPI 速度 = 位宽 × 频率 × (DDR 翻倍?)。

Q3:SPI 速度和走线长度什么关系?

A:走线长 → 负载电容大 → tr 大 → SI 变差。50MHz 走线 < 10cm 一般 OK,> 20cm 要做匹配。1MHz 走线几米都行(理论,但 SPI 不用于长距离)。

Q4:采样窗口怎么算?

A:T - tSU - tHD - tJitter - tSkew = 有效采样窗口。窗口 > 0 才能采样。窗口 < 5ns 高速时危险,要优化(等长、低 Jitter、降速)。

Q5:DDR 模式为什么对 SI 更敏感?

A:DDR 上下沿都采样,采样窗口 = T/2,比 SDR 窄一半。同样的 Jitter/Skew 占比翻倍,所以 DDR 要更严格等长 + 更低 Jitter + 更短走线。

Q6:SPI 最高频率能到多少?

A:商用器件:Octal-SPI Flash 可达 200MHz DDR(等效 400MB/s)。板级 SI 限制实际多在 100~150MHz DDR。实验室极限 200MHz+ 需要严格 SI 设计。日常工程 50~100MHz 已是高速。


八、实战案例

案例 1:W25Q 配 104MHz 不稳定

现象:W25Q128 标 104MHz,配 104MHz QSPI 读取偶发错。

分析:走线 8cm,QSPI 6 线未严格等长(差 10mil),104MHz DDR 采样窗口仅 ~5ns,Skew 0.5ns 占比大。

解决:6 线蛇形等长(误差 < 3mil),加 22Ω 串联,降到 80MHz DDR 稳定。

案例 2:传感器只能跑 5MHz

现象:LIS3DH 标 10MHz,配 10MHz 偶发数据错。

分析:查 datasheet,LIS3DH 的 tSU+tHD=15ns,fmax=1/15ns≈66MHz… 但实际限制在"CS 到首 SCK"和"读命令时序"上,有效速度受限。

解决:配 5MHz,稳定。传感器类器件标称速度常含水分,按 50% 配。

案例 3:SPI 显示屏 40MHz 刷屏花

现象:ILI9341 配 40MHz 刷屏,偶发花屏。

分析:40MHz 边沿 2.5ns,走线 15cm 超临界,无匹配,反射让 MOSI 振铃。

解决:MOSI/SCK 串 33Ω,降到 30MHz,稳定。

案例 4:DMA 跟不上 SPI,UNDERRUN

现象:QSPI 80MHz DMA 写 Flash,偶发 UNDERRUN。

分析:QSPI 80MHz × 4bit = 320Mbit/s = 40MB/s,DMA 带宽不足(总线竞争),FIFO 空,数据欠载。

解决:提高 DMA 优先级 / 增大 FIFO 阈值 / 降速到 50MHz。

案例 5:PLL 切换瞬间 SPI 错乱

现象:系统动态调频,PLL 切换时 SPI 偶发数据错。

分析:PLL 切换瞬间 SCK Jitter 暴增,采样窗口被吃。

解决:SPI 传输期间禁止 PLL 切换,或切换后等稳定再传。

案例 6:多从总线高速失败

现象:3 从共享 SPI,40MHz 读取从机 2 失败,从机 0/1 正常。

分析:从机 2 SCK 走线最长(15cm),Skew 大,采样窗口不足。

解决:SCK 蛇形等长,各从 SCK 等长,40MHz 稳定。


九、本篇小结与速查

核心要点

  • 速度上限 = min(控制器, 器件, SI, 采样窗口, 时钟失真)
  • 实际配速取估算值的 50~70% 留余量
  • SI 约束:tr = 2.2 × Rdrv × Cload,tr > T/4 限速
  • 采样窗口 = T - tSU - tHD - tJitter - tSkew,> 0 才能
  • DDR 模式采样窗口减半,SI 要求翻倍严
  • QSPI 速度 = 位宽 × 频率 ×(DDR 翻倍)
  • Jitter/Skew 高速时占比大,要低 Jitter + 等长
  • 降速测试是排查速度问题的金标准

速度估算速查

环节数据
W25Q Flash50~133MHz
传感器5~10MHz
OLED15~40MHz
ADC3~10MHz
STM32 控制器25~100MHz
QSPI 等效4×f(DDR 8×f)bit/s

降速排查表

配速稳定?推断
50MHz错速度问题
25MHz对SI/采样约束
25MHz错协议/CS/模式问题
1MHz错硬件/连线问题

延伸阅读

  • [[01-SPI电气特性与物理层]] —— 驱动能力
  • [[02-SPI信号完整性与时钟分布]] —— SI 详解
  • [[06-I2C速度模式与时序参数]] —— I2C 速度对比
  • [[07-SPI双线四线八线-QSPI-Octal]] —— QSPI 速度
  • [[13-SPI调试与排查]] —— 速度问题排查

参考资料

  • W25Q Datasheet(频率/时序)
  • STM32 Reference Manual(SPI 分频)
  • DesignWare SSI Databook
  • JEDEC JESD216(Flash 时序)

SPI 技术系列 00· 总目录 · 上一篇:[[02-SPI信号完整性与时钟分布]] ·下一篇:[[04-SPI协议与时序详解-CPOL-CPHA]]


✨ 感谢你的阅读 ✨

技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:

👍 点赞|⭐ 收藏|👀 关注

如果你在调试过程中遇到了其他问题,
欢迎在评论区 💬留言,我们一起探讨。

关注我,一起交流底层开发的那些事儿!🚀


RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进