SPI串行通信协议,是一种高速、全双工、同步的通信总线。
一、物理层
SPI 通讯使用3 条总线及片选线,3 条总线分别为SCK、MOSI、MISO,片选线为SS/CS,SPI可以一 个主机连接单个或多个从机,每个从机都使用一个引脚进行片选。 (支持一主一从通讯、一主多从通讯)
SCLK (时钟) —— 时钟信号线MOSI (主机输出 / 从机输入) —— 主机向从机发送数据的线MISO (主机输入 / 从机输出) —— 从机向主机发送数据的线SS/CS (从机选择 / 芯片选择) —— 用于主机选择给哪个从机发送数据的线
二、协议层
SPI协议定义了通讯的开始、停止、数据有效性、时钟同步等。
2.1、SPI基本通讯过程
下图是一个主机通讯时序,主机控制产生:SCK、MOSI、NSS信号,从机控制产生;MISO。
主机通过MISO信号线读取从机数据。
MOSI和MISO的新号只有在NSS为低电平时有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。
2.2、开始和停止信号
NSS 信号线由高变低,是SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
NSS 信号由低变高,是SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
2.3、数据有效性
SPI 使用MOSI 及MISO 信号线来传输数据,使用SCK 信号线进行数据同步。MOSI 及MISO 数据线在SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。。
如下图所示,MOSI 及MISO 的数据在SCK 的上升沿期间变化(红色框图),在SCK 的下降沿时被采样(绿色框图)。即在SCK 的下降沿时刻,MOSI 及MISO 的数据有效。
高电平时表示数据“1”,低电平表示数据“0”。
在其它时刻,数据无效,MOSI 及MISO 为下一次表示数据做准备。
SPI 每次数据传输可以8 位或16 位为单位,每次传输的单位数不受限制。
2.4、时钟极性CPOL、时钟相位CPHA
时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前,NSS线为高电平时SCK的状态)。
时钟相位CPHA是指数据的采样时刻,CPHA=0,MOSI和MISO数据上的信号将在SCK时钟线的“奇数边沿”采样。CPHA=1,数据在SCK的“偶数边沿”采样。
CPOL和CPHA,分别可以是0或1,即对应四种通讯模式。(如下图所示)
举例分析:
CPHA=1时,说明是在SCK偶数边沿采样。
CPOL=1时,SCK在空闲状态为高电平,也就是说开始信号有效后,SCK肯定是高电平到低电平的跳变。
在实际操作过程中,我们怎么设置SPI的极性和相位呢?
1、由从设备硬件决定
SPI从设备,具体是什么模式,需要查看对应的模块手册。
SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;然后再找到关于设备是在上升沿还是下降沿去采样数据,对应着可以推算出CPHA是0还是1了。