LXW_OnePiece

弱小和无知不是生存的障碍,傲慢才是。

导航

通信协议:SPI

Posted on 2021-09-22 14:44  尾巴_US  阅读(378)  评论(0)    收藏  举报

SPI协议简介

      SPI是Serial Perripheral Interface的简称,是由Motorola公司推出的一种高速全双工的总线协议。

 

      与IIC类似,SPI也是采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制器,从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。一般由SCLK、CS、MOSI,MISO四根线组成,有的地方可能是:SCK、SS、SDI、SDO等名称,都是一样的含义,当有多个从机存在时,通过CS来选择要控制的从机设备。和标准SPI类似的协议,还有TI的SSP协议,区别主要在片选信号的时序上。

 

4线还是3线?

当我们谈到SPI时,默认情况下都是指标准的4线制Motorola SPI协议,即SCLK,MOSI,MISO和CS共4根数据线,标准4线制的好处是可以实现数据的全双工传输。当只有一个主机和一个从机设备时,只需要一个CS,多个从机需要多个CS,各数据线的介绍:

 

  • SCLK,时钟信号,时钟频率即SPI速率,和SPI模式有关
  • MOSI,主机输出,从机输入
  • MISO,主机输入,从机输出
  • CS,从机设备选择,低电平有效

3线制SPI,根据不同的应用场景,主要有以下2种类型:

 

  • 只有3根线:SCLK,CS和DI或DO,适用于单工通讯,主机只发送或接收数据。
  • 只有3根线:SCLK,SDIO和CS,这里的SDIO作为双向端口,适用于半双工通讯,比如ADI的多款ADC芯片都支持双向传输。  

4种工作模式

既然是进行数据传输,双方就要明确从机在什么时刻去采样主机发出的数据,主机在什么时刻去读取从机发来的数据。对于STM32等MCU自带的硬件SPI外设来说,可能没有那么重要,只需要配置一下模式就行了,但是对于使用使用GPIO模拟实现SPI的时序,这一点是非常重要的,这就涉及到SPI标准协议的工作模式了,通过CPOL(Clock Polarity)时钟极性和CPHA(Clock Phase)时钟相位的不同组合,可以分为4种模式。

 

一般从机器件的工作模式是固定的,主机需要采用一样的工作模式,双方才能正常“交流”。

 

CPOL=0表示,SCK在空闲状态时为0
CPOL=1表示,SCK在空闲状态时为1
CPHA=0表示,在SCK第一个边沿时输入输出数据有效
CPHA=1表示,在SCK第二个边沿时输入输出数据有效
这四种模式中,应用最广泛的是模式0和3,大多数SPI器件都同时支持这两种工作模式,其实这些都不重要,具体采用什么模式,看你的器件手册就知道了。

 

以我最近工作中使用到的一款Cypress的铁电存储器FM25V05为例,在其官方DataSheet上介绍同时支持SPI Mode 0和Mode 3,

 

根据后面的时序图,可以得知SPI mode 0的读写时序,图中可以看出SCK空闲状态为低电平,主机数据在每个上升沿被从机采样,数据输出同理。

 

      对于SPI mode0,SCK空闲状态为高电平,主机数据在每个上升沿被从机采样,数据输出同理。

 

      模式1和模式2同理,模式1即CPOL=0CPHA=1SCK空闲为0,在SCK第二个边沿时数据有效,即SCK下降沿有效。

 

      模式2即CPOL=1CPHA=0SCK空闲为1,在SCK第一个边沿时数据有效,即SCK下降沿有效。

 

 

 

      在一些自带SPI硬件外设的MCU上,设置主机的SPI模式非常简单,只需要配置几个寄存器的值即可,而且是写了SCK高电平还是低电平,和第一个还是第二个边沿,不用去记忆等于0还是等于1。以STM32F103硬件SPI配置为例:

1 SPI_InitTypeDef  SPI_InitStruct;
2 
3 SPI_InitStruct.SPI_Mode =SPI_Mode_Master;       //
4 .....
5 SPI_InitStruct.SPI_CPOL =SPI_CPOL_High; //SCK空闲时为高电平
6 SPI_InitStruct.SPI_CPHA =SPI_CPHA_1Edge;//SCK第一个边沿有效
7 .....