4. SPI 时钟频率与波特率参数设置

说到 SPI 的时钟频率,很多朋友第一反应就是「把 SCK 调到主控最高能跑的数值」。嗯,我早年也这么干过,结果从设备死活不响应。后来才明白,时钟频率这件事,不是主控说了算的。

SPI 的时钟信号由主设备产生,叫 SCK 或 SCLK。一个 SCK 周期传送 1 bit 数据。所以波特率(bit rate)和 SCK 频率是 1:1 的关系——你设的 SCK 频率就是实际的数据传输速率。比如 SCK = 10 MHz,那最高理论吞吐就是 10 Mbps。

核心等式:SPI 波特率 = SCK 时钟频率

没有额外的起始位、停止位、校验位,纯二线(MOSI/MISO)同时双向。

4.1 时钟频率的上限在哪?

我做一个项目时,主控 STM32 宣称 SCK 最高 36 MHz,从设备是一块 ADC,手册写最大 SCK 20 MHz。我直接设了 36 MHz,结果读回来的数据全是乱码。后来老老实实降到 18 MHz,一切正常。

所以,时钟频率的上限由三者中最慢的那个决定:

  • 主设备 SPI 时钟源(PLL 分频后能输出的最大值)
  • 从设备支持的最大 SCK(看数据手册,不是所有从设备都能跑 50 MHz)
  • PCB 走线长度和信号完整性(高频下反射、串扰会吃掉时序余量)
限制来源典型数值我踩过的坑
主控 SPI 外设18 MHz – 80 MHz有些 MCU 的 SPI 在高速下需要调整驱动强度
从设备上限1 MHz – 50 MHz传感器和 Flash 芯片差距很大,一定要查手册
PCB 走线超过 10 cm 建议降频我做过一块板子,SCK 线长了 15 cm,10 MHz 就眼图闭合

曾经有个同事把 SCK 设到 40 MHz,从设备是 25 MHz 的 eFuse 芯片,结果每次上电读 ID 有一半概率出错。查了两天才发现是从设备速度不达标。所以——以从设备手册的最大 SCK 为准,再向下取一个常用的分频系数。

4.2 分频系数怎么选?

大部分 MCU 的 SPI 时钟来自系统时钟(AHB/APB 总线时钟)经过一个分频器。分频系数通常是 2 的幂:2、4、8、16、32、64、128、256。有些 MCU 也支持奇数分频,但很少用。

举个例子:APB 时钟 72 MHz,要得到 18 MHz SCK,分频系数就是 72/18 = 4。如果选 8 分频得到 9 MHz,选 2 分频得到 36 MHz。自己算清楚。

分频系数选择步骤

  1. 查出 APB 或 AHB 时钟(比如 84 MHz)
  2. 查出从设备最大 SCK(比如 20 MHz)
  3. 计算可能的分频系数:84 / 2 = 42 MHz(超了),84 / 4 = 21 MHz(超了一点),84 / 8 = 10.5 MHz(安全)
  4. 选 10.5 MHz 或 21 MHz?如果 PCB 很短、从设备余量好,可以试试 21 MHz;否则保守选 10.5 MHz

我个人的习惯是:先按分频系数算出实际 SCK,再对照从设备手册,留 20% 余量。比如从设备标称最大 20 MHz,我实际用 16 MHz 以内。这样做的好处是温度、电压波动时不会翻车。

4.3 波特率与采样沿(CPOL/CPHA)的关系

时钟频率设好了,但数据能不能正确采样,还取决于你配的 CPOL 和 CPHA。这两者决定了 SCK 空闲时的电平以及数据在哪个边沿被采样。

  • CPOL = 0:空闲时 SCK 为低电平
  • CPOL = 1:空闲时 SCK 为高电平
  • CPHA = 0:在第一个边沿(SCK 由空闲变为有效电平的那一下)采样
  • CPHA = 1:在第二个边沿(SCK 回到空闲前的那个边沿)采样

四组模式(Mode 0~3)里最常用的是 Mode 0(CPOL=0, CPHA=0)和 Mode 3(CPOL=1, CPHA=1)。

模式CPOLCPHA采样边沿常见设备
Mode 000上升沿大多数 Flash, ADC
Mode 101下降沿少量传感器
Mode 210下降沿某些 DAC
Mode 311上升沿部分 SD 卡、Wi-Fi 模块

你可能会想:「那我跟从设备时序能对上不就行了?」对,但频率会影响时钟边沿的陡峭程度。高频下(比如 20 MHz 以上),上升沿变缓,采样点偏移会更大。这时候如果 CPHA 配错了,数据可能在错误的位置被锁存。

我曾经遇到一个案例:一个 SPI 温度芯片在 10 MHz 下用 Mode 0 工作正常,但升到 18 MHz 就间歇性读错。用示波器一看,SCK 的上升沿有明显过冲,导致从设备在过冲阶段误判了时钟边沿。最后我降到 12 MHz,同时把边沿驱动强度从 High 调到 Slow,问题解决了。所以频率高了之后,信号完整性会反过来影响模式选择。

4.4 波特率与 SPI 传输延迟

SPI 是全双工,但主从之间需要满足建立时间和保持时间。频率越高,每个 bit 的窗口越窄,留给信号稳定建立的时间就越短。

典型的时序参数:

  • tsu(从设备数据建立时间):从 MISO 数据有效到 SCK 采样边沿的间隔,通常几 ns 到几十 ns
  • th(从设备数据保持时间):采样边沿后数据需保持稳定,通常也是几 ns
  • tpd(传播延迟):SCK 和 MISO 信号从主到从、从到主的线延迟
SCK 频率每位周期典型可用建立窗口
10 MHz100 ns约 60~80 ns(扣除门延迟和线延迟)
20 MHz50 ns约 25~35 ns
40 MHz25 ns可能只剩 10~15 ns

当你发现低频能通、高频不通,多半是时序余量不够了。这时候降频或缩短走线是最直接的解决办法。

实战建议:

  • 先按从设备手册推荐频率的低端起步,比如手册写「最高 20 MHz」,你先设 5 MHz 让通讯通起来
  • 再用示波器抓 SCK 和 MISO,看采样点附近数据是否稳定
  • 逐步提高频率,直到出现误码,然后退回上一档安全频率

4.5 一张图看懂时钟频率与波特率的关系

下面这张框架图把刚才讲的关键点串起来了:从主控时钟源一路到比特流,每个环节都可能成为瓶颈。

SPI 时钟频率与波特率决定因素 主控时钟源 AHB / APB 时钟 (e.g. 84 MHz) SPI 分频器 分频系数 2,4,8,16... SCK 时钟 实际波特率 = SCK 频率 从设备最大 SCK 查手册,留 20% 余量 PCB 走线质量 线长、阻抗、反射、串扰 CPOL / CPHA 模式 采样沿与时钟极性的匹配 最终 SPI 波特率 由三者中的最小值决定 🔍 分频系数 = 主控时钟 / 目标 SCK,取能整除且不超从设备上限的值。实际项目中大多用 4、8、16 分频。

4.6 实际配置中的几个小技巧

  • 先慢后快:新板子第一次调 SPI,用 1 MHz 以下先把收发调通,再提速。避免一上来就被时序问题折磨。
  • 留意 SPI 时钟树:有些 MCU 的 SPI 挂在不同总线上(APB1 vs APB2),最高频率不一样。比如 STM32F4 的 APB2 最高 84 MHz,而 APB1 只有 42 MHz。你挂错了外设总线,分频后可能跑不到预期速度。
  • 测量实际 SCK:用示波器量一下 SCK 引脚,不要盲目相信代码里写的频率。我曾经写 10 MHz,实际测出来只有 8.4 MHz,因为总线时钟跟预期的不同。
  • 注意从设备的 CS 建立时间:有些从设备要求 CS 拉低后等几微秒才能开始传数据。如果 SCK 频率很高,CS 保持时间不够也会导致通讯失败。

我个人的配置流程:先读从设备手册,记下最大 SCK 和要求的模式。然后查 MCU 参考手册,找到 SPI 外设挂在哪个时钟树上。接着手动算两个分频方案:一个保底(比如 4 MHz),一个激进(比如 16 MHz)。先用保底方案调通上层逻辑,再用激进方案跑稳定性测试。

4.7 避坑总结

回顾一下,时钟频率和波特率的设置其实就三个约束:主控能输出多少、从设备能接受多少、信号在板子上能跑多快。任何一个不满足,数据就出错。

我曾经犯过一个低级错误:两块板子 SPI 直连,我设了 30 MHz SCK,但线长只有 3 cm,按理说没问题。结果发现是电源纹波太大,影响了从设备的内部 PLL,导致采样相位抖动。后来在从设备电源脚加了一颗 0.1 µF 电容,降回 24 MHz,世界清净了。

所以别只看时钟频率本身,信号完整性、电源质量、甚至温度都可能让一个「看似合理」的频率变成陷阱。