SPI协议及其Verilog实现

简介

SPI(Serial Peripheral Interface)是一个串行的同步传输协议,不同于Uart和IIC,没有起始位和结束位而是以时钟沿来同步和传输;不同于采用数据包的形式,数据可以连续不中断地传输。是一种一对多的传输协议。4线SPI是全双工的接口,而3线SPI是半双工接口,本篇采用更通用的4线SPI来介绍。

接口

SPI总线有4根逻辑信号线:

  • SLCLK:串行时钟(由主机产生)

  • SS/CS(Slave Select/Chip Select):片选信号(由主机产生),通常是一个低电平有效信号

  • MOSI (Master Output\toSlave Input):主机向从机的数据传输线

  • MISO (Master Input\leftarrowSlave Output):从机向主机的数据传输线

数据传输

要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许灵活选择时钟的上升沿或下降沿来采样和/或移位数据。

时钟极性和相位选择

主机除了要设置时钟频率,还要设置与数据传输相关的时钟极性和相位。大多数厂商都将这两个设置选项命名为CPOLCPHA

  • CPOL决定串行时钟极性。
    • CPOL=0时钟在空闲时处于低电平,时钟的前沿是上升沿、后沿是下降沿。
    • CPOL=1时钟在空闲时处于高电平,时钟的前沿是下降沿、后沿是上升沿。
  • CPHA
    • CPHA=0时,发出数据的一边( the "out" side)在前一时钟周期的后沿改变数据,同时接收数据的一方( the "in" side )在当前时钟周期的前沿捕获数据。注意:在第一个时钟周期,第一位数据必须在前沿到来之前出现在MOSI传输线上。
    • CPHA=1时,发出数据的一边( the "out" side)在当前时钟周期的前沿改变数据,同时接收数据的一方( the "out" side)在同一时钟周期的后沿捕获数据。**注意:**在最后一个时钟周期,从机要在片选失效之前保持MISO线上的数据。

归纳起来如下图:

通过CPOL和CPHA选择SPI模式

以上内容参考:Serial Peripheral Interface一文读懂 4 线 SPI

如需了解更多信息,请点击上方链接。

Verilog&tb

verilog

tb

即将入行的数字IC设计工程师