通讯协议(SPI)

(本内容主要参考野火教程)

SPI简介

SPI协议即串行外围设备接口,是一种高速全双工的通信总线。

物理连接示意图

通讯协议(SPI)

SPI通讯使用 3 条总线及片选线,3条总线分别为 SCK、MOSI、MISO,片选线为SS:
SS( Slave Select):片选信号线,也称为 NSS、CS。SPI 协议中没有设备地址,它使用 SS 信号线来寻址,当主机要选择从设备时,把该从设备的 SS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。

SCK (Serial Clock):时钟信号线,用于通讯数据同步。由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样。

MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

CPOL/CPHA及通讯模式:

SPI一共有四种通讯模式,主要区别是总线空闲时 SCK的时钟状态以及数据采样时刻。由“时钟极性 CPOL”和“时钟相位 CPHA”决定。

时钟极性 CPOL是指 SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即 SPI通讯开始前、 NSS 线为高电平时 SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1 时,则相反。

时钟相位 CPHA是指数据的采样的时刻,当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK的“偶数边沿”采样。

通讯协议(SPI)

我们来分析这个 CPHA=0的时序图。首先,根据 SCK在空闲状态时的电平,分为两种情况。SCK信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。
无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在图中可以看到,采样时刻都是在 SCK的奇数边沿。注意当 CPOL=0 的时候,时钟的奇数边沿是上升沿,而CPOL=1 的时候,时钟的奇数边沿是下降沿。所以 SPI的采样时刻不是由上升/下降沿决定的。MOSI和 MISO 数据线的有效信号在 SCK的奇数边沿保持不变,数据信号将在 SCK奇数边沿时被采样,在非采样时刻,MOSI和 MISO 的有效信号才发生切换。 

类似地,当 CPHA=1 时,不受 CPOL的影响,数据信号在 SCK的偶数边沿被采样,见图 24-4。

通讯协议(SPI)

由 CPOL及 CPHA 的不同状态,SPI分成了四种模式,见表 24-1,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。 

通讯协议(SPI)