SPI时序参数:建立时间、保持时间、时钟偏斜
讲时序分析之前,咱们先得把SPI的几个核心参数吃透。特别是做高速SPI接口——比如跑50MHz甚至更高——建立时间、保持时间、时钟偏斜这三个家伙,稍微没招呼好,数据就全乱了。
我刚开始做SPI从机设计时,有一版流片回来死活读不到正确的数据。仿真波形看起来漂漂亮亮,一到示波器上就穿帮。查了三天,最后发现是时钟偏斜在作怪。嗯,从那以后我再也不敢小看这些时序参数了。
3.1 建立时间与保持时间——采样窗口的“门框”
在SPI总线上,主设备输出数据,从设备用时钟边沿去捕获。捕获是否成功,取决于数据相对于时钟边沿的“到达窗口”。
- 建立时间(tSU):时钟有效边沿到来前,数据必须保持稳定的最短时间。
- 保持时间(tH):时钟有效边沿到来后,数据必须继续稳定的最短时间。
- 数据有效窗口:建立时间起点 → 保持时间终点,这中间数据不能跳变。
你想想看,如果数据在时钟边沿附近抖动,那就是违反了建立或保持时间。轻则偶发错误,重则整个通信链路崩溃。
3.2 时钟偏斜——看不见的“时差”
时钟偏斜指的是同一时钟信号到达不同寄存器的时刻差异。在SPI中,时钟偏斜主要来自两个地方:
- 主设备内部的时钟树不平衡:驱动MISO和MOSI的触发器可能走不同的路径。
- PCB走线延迟:SCLK、MOSI、MISO的走线长度不同,信号传输时间就有差异。
- 从设备输入路径延迟:从设备的时钟缓冲、I/O pad都会引入额外偏斜。
时钟偏斜会直接吃掉建立或保持时间的余量。比如建立时间要求5ns,时钟偏斜1ns,那你实际只剩4ns的余量了。如果这个余量太小,芯片跑慢一点就翻车。
| 时序参数 | 典型值(50MHz SPI) | 违例后果 |
|---|---|---|
| 建立时间 tSU | 2~5 ns | 采样错误,数据byte错位 |
| 保持时间 tH | 1~3 ns | 亚稳态传播,寄存器出现不定态 |
| 时钟偏斜 | 0.5~2 ns | 建立/保持余量变小,系统容限降低 |
我习惯在设计初期就把这三者放在一个时间轴上画出来。光看数字没用,你得看到它们之间的相互影响。
3.3 典型SPI时序路径分析
以SPI主设备发送数据到从设备为例(主设备输出MOSI数据,从设备在SCLK上升沿采样):
时钟周期T = 20ns(50MHz)
主设备内:
t_clk2q(主设备触发器时钟到输出) = 3ns
t_pcb_mosi(MOSI走线延迟) = 1ns
从设备内:
t_clk_skew(SCLK到达从设备触发器比主设备延迟) = 0.5ns
t_setup_required(从设备要求的建立时间) = 2ns
计算实际建立时间余量:
数据到达从设备触发器的时间 = t_clk2q + t_pcb_mosi = 3 + 1 = 4ns
从设备采样时钟边沿在20ns处(考虑偏斜实际到达20.5ns)
数据在时钟边沿前稳定的时间 = 20.5 - 4 = 16.5ns
余量 = 16.5 - 2 = 14.5ns(充足)
但如果是读操作(从设备输出MISO数据给主设备),主设备需要在时钟边沿后捕获数据,此时保持时间就变得敏感。我遇到过读路径保持时间余量只剩0.1ns的案例,后来不得不加长PCB走线或用IO延时来补救。
3.4 时序违例的“元凶”——组合逻辑与扇出
除了上面讲的直接参数,还有一个隐藏凶手:组合逻辑深度。SPI接口里如果插入了过多的组合逻辑(比如地址译码、数据拼接),会额外增加路径延迟,吃建立时间余量。
另一问题是扇出太大。一个寄存器驱动太多负载,信号上升/下降时间变慢,等效于减小了保持时间窗口。我在一个多芯片SPI总线上遇到过这个现象,最后是增加了时钟缓冲器来分摊负载。
3.5 如何从波形上快速判断违例类型
看一眼实际的波形,就能猜个大概:
- 建立时间违例:数据在时钟边沿太近才稳定,甚至刚好在时钟边沿变化。波形上看,数据变化沿紧贴时钟边沿。
- 保持时间违例:时钟边沿后数据立刻变化。波形上,时钟上升沿刚过去,数据就跳变。
- 时钟偏斜问题:SCLK和MOSI/MISO的上升沿不完全对齐,且差距随频率变化。
我曾用示波器抓过一组波形,数据变化沿正好卡在时钟上升沿上。当时还以为是示波器探针接地不好,后来算了传输延迟才发现是保持时间差了0.3ns。加了一小段走线就好了。
好了,基础知识就这些。下面我们用一张图把这三个参数的关系串起来——
这张图很清楚:建立时间、保持时间和时钟偏斜共同决定了数据有效窗口。其中一个参数变差,窗口就缩小,最终导致采样错误或亚稳态。芯片设计的活儿,说白了就是把这个窗口管好。