SPI 时序参数详解:建立时间、保持时间与数据有效窗口
SPI 通信能不能跑稳,说白了就靠几个时序参数。我刚开始做嵌入式那会儿,总觉得只要把时钟频率算对就行,结果板子一跑起来,数据时不时就错一位。后来用逻辑分析仪一抓,才发现是建立时间不够——嗯,从那以后我再也不敢小看这些参数了。
这一节我们就把 SPI 时序里最关键的几个参数掰开揉碎讲清楚。你搞懂了它们,调试时就知道该看哪里、该调什么。
建立时间(tSU)与保持时间(tH)
这两个参数是所有同步通信的基石。SPI 也不例外。
- 建立时间(tSU):数据在时钟采样沿到来之前,必须提前稳定下来的最短时间。
- 保持时间(tH):数据在时钟采样沿之后,必须继续保持稳定的最短时间。
你可以把时钟沿想象成相机快门。建立时间就是快门按下前,被拍对象必须摆好姿势的时间。保持时间就是快门按下后,对象不能马上动的时间。姿势没摆好就拍,照片肯定糊。
关键点:建立时间和保持时间是由从设备(Slave)决定的。主设备(Master)必须保证输出数据满足这两个窗口。反过来,主设备接收数据时,它自己也有建立时间和保持时间要求。
我在项目中遇到过一块 Flash 芯片,手册上写 tSU 最小是 5ns,tH 最小是 2ns。当时我用的主控 SPI 时钟是 50MHz,周期 20ns。按理说够用,但实际抓波形发现数据变化点离时钟沿只有 3ns。结果就是——读回来的数据偶尔跳变。后来我把时钟降到 40MHz,问题就消失了。说白了,就是建立时间余量不够。
时钟频率(fSCK)
SPI 的时钟频率直接决定了通信速度。但频率不是想提就能提的。它受限于整个链路上最慢的那个环节。
| 限制因素 | 说明 | 典型值 |
|---|---|---|
| 从设备最大频率 | Slave 芯片手册标明的最高支持频率 | 20MHz ~ 100MHz |
| 主设备驱动能力 | Master 的 IO 口能否在高速下输出干净波形 | 取决于 GPIO 驱动强度 |
| PCB 走线长度 | 走线越长,信号反射和衰减越严重 | 超过 10cm 建议降频 |
| 负载电容 | 每个从设备的输入电容会拉慢信号边沿 | 每增加 10pF,边沿变缓约 1-2ns |
我个人习惯是先看从设备手册里的最大 fSCK,然后留 20%~30% 的余量。比如手册写 20MHz,我实际跑 15MHz 或 16MHz。别小看这点余量,它能帮你省掉很多调试时间。
数据有效窗口
这个概念很多人容易忽略。数据有效窗口指的是:在时钟的一个周期内,数据信号保持稳定的那段时间。
你想想看,数据信号不是瞬间跳变的。它从高到低需要上升时间(tR)和下降时间(tF)。在这段时间里,数据是无效的。真正能用的,是信号稳定后的那一段。
实用技巧:用逻辑分析仪抓 SPI 波形时,别只看时钟沿位置。把波形放大,观察数据信号的边沿有多陡。如果边沿时间超过时钟周期的 10%,你就得考虑降频或者调整驱动强度了。
数据有效窗口的计算公式很简单:
数据有效窗口 = 时钟周期 - tR - tF - 建立时间 - 保持时间
这个窗口越大,通信越可靠。窗口越小,对时序的容错能力就越差。我曾经调试一块 LCD 驱动板,数据有效窗口只剩 3ns,稍微有点噪声就出错。后来把 SPI 时钟从 30MHz 降到 20MHz,窗口扩大到 12ns,问题直接解决。
传输延迟(tPD)
传输延迟是信号从发送端到接收端所需要的时间。在 SPI 里,它主要包括:
- PCB 走线延迟:大约每 15cm 走线产生 1ns 延迟
- 驱动芯片内部延迟:从寄存器到引脚的时间
- 接收端输入延迟:信号到达引脚到内部逻辑识别的时间
低速场景下(几 MHz),tPD 基本可以忽略。但一旦跑到 50MHz 以上,tPD 就会开始蚕食你的建立时间窗口。
注意:SPI 的时钟线和数据线走线长度不一致时,会产生 skew(偏斜)。时钟比数据早到,建立时间被压缩;数据比时钟早到,保持时间被压缩。我建议时钟线和数据线走线长度差控制在 5mm 以内。
SPI 时序参数关系图
下面这张图把上面讲的几个参数串在一起。你看一眼就能明白它们之间的逻辑关系。
实际调试中的参数检查清单
每次遇到 SPI 通信问题,我都会按这个顺序排查。你也可以照着来:
- 查手册:确认从设备的 tSU、tH、最大 fSCK 值
- 抓波形:用逻辑分析仪看实际时钟频率是否达标
- 量边沿:测量数据线和时钟线的上升/下降时间
- 算窗口:计算实际数据有效窗口是否大于 tSU + tH
- 看 skew:检查时钟线和数据线的到达时间差
- 调驱动:如果边沿太缓,增大 GPIO 驱动强度
- 降频率:以上都试过还不行,降频是最稳妥的方案
我的经验:逻辑分析仪的采样率至少要是 SPI 时钟的 4 倍,才能准确测量建立时间和保持时间。比如 20MHz 的 SPI,采样率至少 80MHz。采样率不够,测出来的时序参数全是错的。
参数速查表
| 参数 | 符号 | 单位 | 典型范围 | 调试关注点 |
|---|---|---|---|---|
| 建立时间 | tSU | ns | 1 ~ 10 | 数据变化点离时钟沿太近 |
| 保持时间 | tH | ns | 0.5 ~ 5 | 时钟沿后数据立刻变化 |
| 时钟频率 | fSCK | MHz | 1 ~ 100 | 实际频率与手册是否一致 |
| 传输延迟 | tPD | ns | 1 ~ 20 | 走线长度和驱动芯片延迟 |
| 上升时间 | tR | ns | 1 ~ 5 | 边沿太缓说明驱动不足 |
| 下降时间 | tF | ns | 1 ~ 5 | 同上 |
这张表你最好打印出来贴在工位上。每次调 SPI 的时候扫一眼,基本不会漏掉关键参数。