📚 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 Flash | 50~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 = 33ns2.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 ≈ 77MHz3.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 Flash | 50~133MHz |
| 传感器 | 5~10MHz |
| OLED | 15~40MHz |
| ADC | 3~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]]
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞|⭐ 收藏|👀 关注
如果你在调试过程中遇到了其他问题,
欢迎在评论区 💬留言,我们一起探讨。
关注我,一起交流底层开发的那些事儿!🚀