SPI时序理解
传输模式
时钟极性CPOL和时钟相位CPHA
CPOL:表示当SCLK空闲idle的时候,其电平值是高电平1还是低电平0
CPHA:表示的是数据采样是在第几个边沿(edge),0对应第一个边沿,1对应第二个边沿
CPOL和CPHA两两组合一共有4中模式
CPHA=0 表示第一个边沿采样
模式0:对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
模式2:对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
CPHA=1表示第二个边沿采样
- 模式1:对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;
- 模式3:对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

常用模式0和模式3
传输时序
时序图

模式0时序图

需要重点理解两个概念:
- 上升沿采样:指的是从设备在CLK的上升沿(低电平->高电平跳变)读取MOSI线上的数据,这是从设备的接受动作。此时要求MOSI线上的数据必须已经稳定,不能处于跳变状态,否则从设备会采样到错误值。
- 上升沿前输出数据:指的是主设备在CLK上升沿来之前,就要把传输的当前数据(如bit1)输出到MOSI线上,目的是给数据留出稳定时间,确保上升沿采样时数据已经处于固定电平
以传输bit1为例分析MOSI采样和输出的过程
- 步骤 1:主设备 “提前输出” 当前位数据(CLK 上升沿前)
当主设备选中从设备(/SS 信号有效)后,会在 CLK 上升沿到来前的 “空闲阶段”(CPOL=0 时 CLK 为低电平),就把 bit1 的电平(如高电平 1)输出到 MOSI 线上,并保持不变()。文档图 3 验证了这一点:bit1 的输出时刻比 CLK 上升沿早半个时钟周期,此时 CLK 仍处于低电平,尚未进入上升沿阶段。 - 步骤 2:从设备 “上升沿采样” 当前位数据
当 CLK 从低电平跳变为高电平(上升沿)时,从设备检测到这个跳变,立即读取此时 MOSI 线上的稳定数据(即主设备提前输出的 bit1),完成采样动作(、)。此时采样的 “原材料”,正是主设备在上升沿前就准备好的。 - 步骤 3:主设备 “下降沿更新” 下一位数据
采样完成后,CLK 从高电平跳变为低电平(下降沿),主设备会立即将 MOSI 线上的电平更新为下一位数据(如 bit2 的电平),为下一个时钟周期的采样做准备()。注意:这一步更新的是 “下一位”,而非当前已采样的 bit1—— 当前位数据的采样已在上升沿完成,下降沿的操作不影响已传输的位。
主设备需要提前在CLK上升沿之前将数据(即bit1电平)输出到MOSI线上(即准备好数据,为采样提供稳定数据),不然在上升沿从设备就要采样了。至于采样是否必须在上升沿期间完成还是说在CLK高电平期间仍可以继续采样这个暂时不做深入研究(即采样时间是否为:CLK上升沿+CLK高电平保持期间)。
在CLK高电平结束之后,就来到了CLK的下降沿,这个时候主设备又要将数据(即BIT2)输出到MOSI线上,至于主设备在CLK下降沿开始的时候将数据输出到MOSI线上的时间是否包括CLK低电平的时间(即输出数据的时间是否为:CLK下降沿+CLK低电平保持期间)这个暂时不做研究。
以传输bit1为例分析MISO采样和输出的过程
步骤 1:从设备 “/SS 有效后立即输出” 当前位数据(SCLK 上升沿前)
与主设备在 MOSI 线上 “提前半个时钟周期输出” 不同,从设备在 MISO 线上的输出触发条件是 **/SS 信号有效 **(主设备拉低 / SS 选中从设备):一旦 / SS 有效,从设备会立即将当前要传输的 bit1 电平(如高电平 1)输出到 MISO 线上,并保持稳定,无需等待 SCLK 的上升沿(、)。
文档图 4 对此有明确验证:图中 / SS 信号变为低电平(有效)后,MISO 线立即输出 bit1(值为 1),此时 SCLK 仍处于空闲低电平状态,为后续主设备采样留出了充足的稳定时间(、)。步骤 2:主设备 “SCLK 上升沿采样” MISO 线上的数据
当主设备生成的 SCLK 从低电平跳变为高电平(上升沿)时,主设备会检测这个跳变,并立即读取此时 MISO 线上的稳定数据 —— 即从设备在 / SS 有效后输出的 bit1,完成 “主设备采样 MISO 数据” 的动作(、)。
这一步与 MOSI 线的 “从设备上升沿采样” 逻辑完全同步,均依赖 SCLK 的第一个跳变沿,确保主从设备的收发动作在同一时钟基准下进行()。步骤 3:从设备 “SCLK 下降沿更新” MISO 线上的下一位数据
SCLK 上升沿的采样动作完成后,当 SCLK 从高电平跳变为低电平(下降沿)时,从设备会立即将 MISO 线上的电平更新为下一位要传输的数据(如 bit2 的电平),为下一个时钟周期的主设备采样做准备(、)。
与 MOSI 线类似,MISO 线的 “更新” 动作仅针对 “下一位数据”,不会影响已在上升沿被主设备采样的当前位(bit1),保证数据传输的连续性和正确性。
区别:
- MOSI 线(主→从):主设备输出数据的触发与 / SS 无关,仅在 SCLK 上升沿前的空闲阶段输出();
- MISO 线(从→主):从设备输出数据的触发是 / SS 有效,有效后立即输出第一位数据()。
参考:SPI总线协议介绍.pdf