4. 时钟分频与波特率配置:SPI时钟源选择、分频系数计算、最大时钟频率限制、匹配从器件时序要求
时钟配置这事儿,说简单也简单,说坑也真坑。我见过不少工程师,SPI通信调不通,最后发现是时钟频率配错了。要么太快从机跟不上,要么太慢浪费带宽。今天咱们就把这块彻底捋清楚。
4.1 SPI时钟源从哪来?
SPI的时钟源,说白了就是系统时钟经过一系列分频器后喂给SPI外设的。不同芯片厂家的路径不太一样,但大体逻辑是相通的。
| 时钟层级 | 典型来源 | 说明 |
|---|---|---|
| 系统主时钟 | PLL输出 / 外部晶振 | 通常几百MHz,不能直接给SPI用 |
| 外设总线时钟 | AHB / APB 分频后 | SPI外设挂在这个总线上 |
| SPI模块时钟 | 外设时钟再经SPI内部预分频 | 最终决定SCK频率 |
我习惯先查芯片手册里的时钟树,找到SPI模块的时钟源路径。比如STM32的SPI1挂在APB2上,SPI2/3挂在APB1上,两者的基础时钟可能不一样。你想想看,如果APB1时钟是36MHz,APB2是72MHz,同样的分频系数,出来的SCK频率差一倍。
4.2 分频系数怎么算?
SPI的波特率,就是SCK的频率。计算公式很简单:
SCK频率 = SPI模块时钟 / 分频系数
分频系数通常是2的幂次,比如2、4、8、16……一直到256。有些高端芯片支持奇数分频,但大部分MCU只支持2的幂次分频。
举个例子:
- SPI模块时钟 = 72MHz
- 目标SCK = 10MHz
- 分频系数 = 72 / 10 = 7.2
- 取最接近的2的幂次 → 8
- 实际SCK = 72 / 8 = 9MHz
嗯,这里要注意,实际频率往往不是整数。9MHz跟10MHz差10%,很多从机是能接受的,但有些苛刻的器件就不行。
4.3 最大时钟频率限制——谁说了算?
SPI能跑多快,不是由主控单方面决定的。我踩过这个坑:主控宣称支持50MHz SPI,结果接了个从机,死活调不通。后来发现从机只支持10MHz。
限制因素有三个:
- 主控SPI模块上限——芯片手册里会写,比如“SPI最大时钟频率= fPCLK/2”
- 从机支持上限——从机数据手册里的“Maximum SPI Clock Frequency”
- PCB走线限制——这个容易被忽略。频率高了,信号反射、串扰都会出来
我曾经在一个项目里,SPI时钟配到20MHz,示波器一看,SCK波形已经圆得不像话了。降到10MHz,波形立马干净。所以别光看手册,实际波形才是真理。
| 限制来源 | 典型值 | 怎么查 |
|---|---|---|
| 主控SPI模块 | 36MHz / 50MHz | 芯片手册SPI章节 |
| 从器件 | 10MHz / 20MHz | 从器件数据手册 |
| PCB走线 | 取决于长度和布局 | 实测波形判断 |
4.4 匹配从器件时序要求
每个SPI从机都有自己的时序要求,不只是频率。我列几个常见的:
- SCK最大频率——刚才说过了
- SCK高/低电平最小宽度——占空比不一定50%
- 数据建立时间(tSU)——数据必须在SCK边沿前稳定
- 数据保持时间(tH)——数据必须在SCK边沿后保持
- CS片选到第一个SCK的延迟——有些从机需要CS先拉低等一会儿
举个例子,某款ADC芯片要求:
SCK频率 ≤ 20MHz
tSU ≥ 10ns
tH ≥ 10ns
CS拉低到第一个SCK上升沿 ≥ 50ns
如果你配了20MHz,SCK周期是50ns,半周期25ns。建立时间要求10ns,看起来够。但别忘了,主控的输出延迟、PCB走线延迟都会吃掉一部分时序裕量。我一般会留30%以上的余量。
4.5 时钟极性(CPOL)和相位(CPHA)的影响
时钟配置不只是频率,还有极性和相位。这两个参数决定了数据在SCK的哪个边沿采样。
| 模式 | CPOL | CPHA | SCK空闲电平 | 数据采样边沿 |
|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 上升沿 |
| 模式1 | 0 | 1 | 低电平 | 下降沿 |
| 模式2 | 1 | 0 | 高电平 | 下降沿 |
| 模式3 | 1 | 1 | 高电平 | 上升沿 |
主从必须配成一样的模式,否则数据全错。我遇到过最诡异的情况:示波器看波形完全正确,但数据就是不对。后来发现从机手册里写的是模式0,但实际需要模式1。这种坑,只能靠仔细读手册加实测验证。
4.6 多设备级联时的时钟分配
级联多个SPI设备时,时钟分配要特别注意。每个从机的SCK输入都是并联的,所以所有从机共享同一个SCK频率。
问题来了:如果级联的从机中,有一个只支持10MHz,其他支持50MHz,那整个总线只能跑10MHz。别想着给快的设备单独提速,做不到。
我画了一张图,帮你理解时钟在级联系统中的流向:
从图上能看明白吧?所有从机共享一条SCK总线,最慢的那个决定了整条总线的速度上限。我建议在设计阶段就把所有从机的频率要求列个表,取最小值作为设计目标。
4.7 实际调试步骤
说了这么多理论,来点实际的。我一般按这个步骤配置和调试SPI时钟:
- 查手册:确认主控SPI模块时钟频率,确认从机最大SCK频率和时序要求
- 算分频:目标SCK = min(主控能力, 从机能力) × 0.7,然后找最接近的分频系数
- 配寄存器:设置分频系数、CPOL、CPHA
- 看波形:用示波器抓SCK和MOSI/MISO,确认频率正确、波形干净
- 测通信:发已知数据,收回来对比,确认无误
- 压测:连续跑100万次通信,看有没有偶发错误