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→Slave Input):主机向从机的数据传输线
-
MISO (Master Input←Slave Output):从机向主机的数据传输线
数据传输
要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许灵活选择时钟的上升沿或下降沿来采样和/或移位数据。
时钟极性和相位选择
主机除了要设置时钟频率,还要设置与数据传输相关的时钟极性和相位。大多数厂商都将这两个设置选项命名为CPOL
和CPHA
。
CPOL
决定串行时钟极性。CPOL=0
时钟在空闲时处于低电平,时钟的前沿是上升沿、后沿是下降沿。CPOL=1
时钟在空闲时处于高电平,时钟的前沿是下降沿、后沿是上升沿。
CPHA
CPHA=0
时,发出数据的一边( the "out" side)在前一时钟周期的后沿改变数据,同时接收数据的一方( the "in" side )在当前时钟周期的前沿捕获数据。注意:在第一个时钟周期,第一位数据必须在前沿到来之前出现在MOSI
传输线上。CPHA=1
时,发出数据的一边( the "out" side)在当前时钟周期的前沿改变数据,同时接收数据的一方( the "out" side)在同一时钟周期的后沿捕获数据。**注意:**在最后一个时钟周期,从机要在片选失效之前保持MISO
线上的数据。
归纳起来如下图:
以上内容参考:Serial Peripheral Interface、一文读懂 4 线 SPI
如需了解更多信息,请点击上方链接。
Verilog&tb
halftop
即将入行的数字IC设计工程师