之前一直用SPI器件, 但是呢,没有从根本上理解这个通信协议,这一篇文章将主要介绍硬件设计
1. 什么是SPI协议?
SPI(Serial Perripheral Interface,串行外围设备接口)是摩托罗拉(Motorola)公司推出的一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。常作为MCU外设芯片串行扩展接口,主要应用于EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器和数字信号解码器之间。
2. SPI通信原理
2.1 采用主从模式的控制方式
SPI规定了两个SPI设备之间通信必须由主设备(Master)来控制次设备(Slave),Master设备可以通过对Slave设备进行片选来控制多个Slave设备,SPI协议还规定Slave设备本身不能产生或控制时钟信号,必须由Master设备通过SCLK管脚提供给Slave设备,没有Clock,则Slave设备不能正常工作。
2.2 采用同步方式传输数据
Master设备需要根据从机的工作模式等来配置控制寄存器并产生相应的时钟信号,从而保证数据在两个设备之间是同步传输的。
2.3 数据传输
SPI设备数据传输的工作原理如图1所示,Master中的8位数据寄存器和Slave中的8位数据寄存器通过信号线(MOSI、MISO)连接而组成一个分布式的16位数据寄存器;当执行数据传输操作时,该16位寄存器按照Master提供的时钟信号(SCLK)串行移动8位,所以Master和Slave中寄存器的数据就实现了数据交换;之后再被自动装入接收缓冲器中,并将接收缓冲器满标志位(BF)和中断标志位(SSPIF)置为高电平;而Master或Slave检测到标志位发生变化后,就会去读取接收缓冲器中的数据,这样就完成了一次通信过程。
3. SPI总线结构
3.1 引脚功能及模式
由SPI工作原理可知,SPI总线需要包含两条信号线(MOSI、MISO)和一条时钟线(SCLK),但是由于SPI是一个多从机系统,所以需要增加1条从设备选择信号线(SS)来选择需要通信的Slave设备(每个Slave设备都需要单独的从设备选择信号来控制)。这四条信号线的详细作用介绍如下:
- SS(Slave Select):从设备选择信号线,常称为片选(Chip Select)信号线。当有多个SPI从设备与主机相连时,设备的其它信号线SCLK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;而每个从设备都有独立的这一条CS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。当主机要选择从设备时,把该从设备的CS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯;所以SPI通讯以CS线置低电平为开始信号,以CS线被拉高作为结束信号。
- MOSI(Master Output Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
- MISO(Master Input Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
- SCLK(Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为Fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
扩展:SPI通信有4种不同的模式,不同的从设备可能在出厂就是配置为某种模式,这是无法改变的;但我们的通信双方必须工作在同一模式下,所以我们可以通过对CPOL(时钟极性)和CPHA(时钟相位)的配置来设置我们的主设备的工作模式;CPOL是用来配置SCLK的电平的空闲态或者有效态时的电平,CPHA是用来配置数据采样是发生在上升沿还是下降沿。具体如下:
- Mode0:CPOL=0,CPHA=0;空闲态时SCLK=0,数据在上升沿采样,在下降沿移位;
- Mode1:CPOL=0,CPHA=1;空闲态时SCLK=0,数据在下降沿采样,在上升沿移位;
- Mode2:CPOL=1,CPHA=0;空闲态时SCLK=1,数据在上升沿采样,在下降沿移位;
- Mode3:CPOL=1,CPHA=1;空闲态时SCLK=1,数据在下降沿采样,在上升沿移位;
需要注意的是:因为我们的SPI通信并不像UART或者IIC通信那样有专门的通信周期、专门的通信起始信号、专门的通信结束信号;所以我们的SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么保持高电平要么保持低电平。
3.2 多从机拓扑结构
多器件连接的拓扑结构如下图所示,主从机的SCLK、MOSI和MISO相连接, 而有多少个从设备的话,在主机端就需要多少个SS(CS)管脚进行片选选择。cs是低电平有效, 如果需要选择哪个器件的话, 一般需要将该管脚拉低,所以在我们电路设计时,该管脚可以加上拉电阻。
3. 常见SPI电路设计
我们以GD25Q127CSIG为例,来讲讲SPI硬件设计。如下图所示,各个管脚解释如下:
- CE脚为片选信号,由于是低电平触发,所以该管脚接了上拉电阻,默认不选中它
- WP管脚为写保护,该管脚给低电平时,写保护打开,主机不能写入数据,这里关闭写保护,上拉至VCC
- HOLD管脚为暂停收发控制管脚,该管脚给低电平时,表示不管此时该芯片在收还是发数据,将暂停收发过程,直接忽略数据。