SPI(串行外围设备接口)总线是一种基于时钟同步的高速全双工串行通信总线。通常包含四根信号线,分别为sdi(串行数据输入),sdo(串行数据输出),sclk(串行移位时钟)、cs(从使能信号)构成。
图1 SPI总线连接关系(点对点)
图2 一主机对多从机
SPI总线采用主从模式(Master Slave)架构,支持多从机模式应用,但实际芯片只支持单主机工作,其中cs信号决定了唯一与主设备通信的从设备。若没有cs信号,则只能存在一个从设备。主从机发送与接收数据是同时完成的。
在SPI操作中,数据是同步进行发送和接收的。数据传输的时钟基于来自自主处理器的时钟脉冲。最常用的时钟设置是基于时钟极性(CPOL)和时钟相位(CPHA)两个参数。时钟极性设置时钟空闲时的电平(高电平还是低电平),时钟相位设置读取和发送数据时的时钟沿(上升沿还是下降沿)。通过对时钟极性以及时钟相位的设置,SPI总线有四种工作模式。使用最广泛的是SPI0和SPI3方式,若CPOL=0,串行同步时钟的空闲状态为低电平,若CPOL=1,则串行同步时钟的空闲状态为高电平。CPHA能够选择两种不同的传输协议之一进行数据传输。若CPHA=0,在串行时钟的第一个跳变沿数据被采集,若CPHA=1,在串行同步时钟的第二个跳变沿数据被采集。四种模式时序分析如下:
- CPOL=0,CPHA=0
图3 SPI0模式时序图
由上图可以看出,SPI0模式时,当数据未发送以及数据发送后,SCK都是低电平,在SCK第一个沿时,数据是稳定的,同时在第二个沿时,MOSI与MISO会发生变化,也就是在时钟的第一个沿进行数据采样,数据输出在第二个沿上。
- CPOL=0,CPHA=1
图4 SPI1模式时序图
由上图可以看出,SPI1模式时,当数据未发送以及数据发送后,SCK都是低电平,在SCK第一个沿时,MOSI与MISO会发生变化,在第二个沿时数据是稳定的,也就是在时钟的第一个沿进行数据输出,数据采样在第二个沿上。
- CPOL=1,CPHA=0
图5 SPI2模式时序图
由上图可以看出,SPI2模式时,当数据未发送以及数据发送后,SCK都是高电平,在SCK的第一个沿时,数据是稳定的,在SCK的第二个沿时,MOSI与MISO会发生变化,即在时钟的第一个沿时进行数据采样,在时钟的第二个沿时进行数据输出。
- CPOL=1,CPHA=1
图6 SPI3模式时序图
由上图可以看出,SPI3模式时,当数据未发送以及数据发送后,SCK都是高电平,在SCK的第一个沿时,MOSI与MISO会发生变换,在SCK的第二个沿时,数据是稳定的。即在时钟的第一个沿进行数据输出,在时钟的第二个沿进行数据采样。
综上所述,可以看出,当CPHA=0时,表示数据的采样在时钟周期的第一个沿上,而具体的时钟沿由CPOL决定,则数据输出在第二个沿。当CPHA=1时,表示数据的输出在时钟的第一个沿上,同样具体的时钟沿由CPOL决定,则第二个数据采样在第二个沿。
从上面时序可以看出,SPI的主从设备内部均为一个8位的移位寄存器。SPI的实现结构如下:
图7 SPI实现结构
实际实现时,可以利用主机的sclk信号作为移位时钟信号,按照高位在前,低位在后的顺序,依次将总线上的数据送入内部移位寄存器,从而完成SPI的接收与发送。