SPI(Serial Peripheral Interface)协议

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola推出的一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。

全双工:host能与外围从设备之间的发送线和接收线各自独立,能同时进行发送数据和接收数据

源同步传输

文章内容

  1. SPI介绍
  2. SPI协议通信时序详解
  3. SPI数据传输方式
  4. SPI总线优缺点 

1、SPI介绍

应用场景

SPI协议主要用于短距离的通信系统中,特别是嵌入式系统:

存储器RAM,EEPROM,Flash等

数模转换器A/D, D/A转换器等

驱动接口LED显示驱动器,I/O接口芯片,UART接收器等。

主从模式控制:

SPI以主从方式进行工作,这种模式通常包含一个master和一个或多个slave,需要至少4根线(在单向传输时3根也可以),分别为:

  1. SDO/MOSI(master output slave input):主设备数据输出,从设备数据输入;
  2. SDI/MISO(master input slave output):主设备数据输入,从设备数据输出;
  3. SCLK:时钟信号,由主设备产生
  4. CS/SS:片选信号,主设备控制并用于选择与其通信的从设备。

 

多Slave的SPI协议

SPI协议可以操作在一个master对应一个或者多个slave的条件下,此时有多个CS/SS片选信号,但是一个时间只能有一个片选信号有效。

slave的输出端口MISO都是三态驱动;高电平,低电平和不选中时输出为高阻态

数据交换(data exchanges)

SPI设备之间的数据传输称为数据交换不是数据传输。这是因为SPI设备不能在进行数据通信的过程中仅充当transmitter和recieiver的角色,而是在每个时钟周期内,主从SPI设备都会发送1bit大小的数据,相当于主从设备进行了1bit的数据交换。

在数据的传输过程中,每次接收到的数据必须在下一次数据传输之前被采样,如果之前接收的数据没有被采样,那么这些已经收到的数据可能被丢弃,导致 SPI 模块最终失效,因此,在程序中,一般都会在 SPI 传输完数据之后,去读取 SPI 设备里面的数据,即使这些数据是在我们程序中是没有用的。

2、SPI协议通信时序详解

时钟极性CPOL(表示状态):

时钟极性CPOL用于表示SPI空闲状态是SCLK电平状态;

CPOL=0表示当SCLK=1时处于有效状态,SCLK=0处于空闲状态;

CPOL=1表示当SCLK=0时处于有效状态,SCLK=1处于空闲状态;

时钟相位CPHA(表示收发数据):

时钟相位CPHA则用于表示数据采样发生在第几个边沿。

CPHA=0,表示在第1个边沿进行数据采样,第2个边沿进行数据发送;

CPHA=1,表示在第2个边沿进行数据采样,第1个边沿进行数据发送;

通信模式:

SPI通信具有四种不同的模式,不同的从设备可能在出厂时就配置为某种模式,不可改变;但由于通信双方需要工作在同一模式下,由master的CPOL(时钟极性)和CPHA(时钟相位)决定

SPI通信模式与CPOL和CPHA的关系如下:

Mode0:CPOL=0,CPHA=0;

Mode1:CPOL=0,CPHA=1;

Mode2:CPOL=1,CPHA=0;

Mode3:CPOL=1,CPHA=1;

数据采样和数据传输?

数据采样指SPI主从设备的采样Buffer中的数据,数据传输指主/从设备将采样到的数据传输给从/主设备?

还是说

数据采样是slave传输数据给master,数据传输指master传输数据给slave?

3、SPI数据传输方式

SSPSR为SPI内部的移位寄存器(Shift Register),根据SPI时钟信号状态,向SSPBUF移入或移除数据,每次移动的数据大小由Bus-Width和Channel-Width决定。

Bus_Width是指定地址总线到Master之间数据传输的单位。例如,要往Master里的SSPBUF写入16Byte的数据:要先给Master的配置寄存器设置Bus_Width为Byte,然后往Master的Tx_Data移位寄存器的地址总线的入口写入数据,每次写入1Byte的数据,当写完1个Byte后,Tx_Data以为寄存器会自动的把地址总线传来的1Byte数据移入SSPBUF中,传16个Byte需要重复进行16次。

Channel_Width则是指定Master与Slave之间数据传输的单位。Master内部的移位寄存器会依据Channel_Width自动的把数据从Master_SSPBUF里通过Master_SDO传输到Slave_SDI中,Slave_SSPSR再将数据移入Slave_SSPBUF中。

通常情况下,Bus_Width≥Channel_Width,以保证不会因为Master和Slave之间数据交换的频率比地址总线与Master之间的数据交换频率要快而导致Master_SSPBUF存放的数据无效。

SSPBUF

在每个时钟周期内,Master和Slave之间交换的数据都是SPI内部移位寄存器从SSPBUF中拷贝的。可以通过往SSPBUF对应的寄存器(Tx_Data/Rx_Data register)里读写数据,间接控制SPI设备内部的SSPBUF

例如:在发送数据之前,向Master的Tx-Data寄存器中写入将要发送的数据,这些数据会被Master-SSPSR移位寄存器根据Bus_Width自动移入Master-SSPBUF中,然后被Master-SSPSR根据Channel-Width从SSPBUF移出,通过输出管脚传给Slave。而Slave-SSPSR则将SDI接收到的数据移入到SSPBUF中。与此同时,Slave也进行相同的操作。

值得注意的是,在单次数据传输传输完成后,用户程序可以通过Master的Rx-Data寄存器读取Master设备交换后的数据。

4、SPI总线优缺点

优点

  • 协议简单利于硬件设计和实现,如不需要向I2C协议中每个从器件都需要一个地址;只需要四根线;
  • 全双工协议,允许在同一时间内收发数据;
  • 三态输出的驱动能力强,相对于I2C的开漏输出,抗干扰能力强,传输稳定;
  • 相对于I2C协议,时钟速率快,没有最大限制;
  • 输入输出的大小没有限制,允许传输多个字节;

缺点

  • 片选信号线会随着slave的增加而增加;
  • 传输过程中没有确认信号,不能确定从器件是否收到;在SPI Flash中有read statu这个命令确定slave的状态是狗处于busy;
  • 没有校验机制;

5、SPI代码

原文地址:https://www.cnblogs.com/lizhiqing/p/12694464.html