13 SPI通信协议原理

发布时间 2023-12-29 11:29:34作者: 米联客(milianke)

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA

登录米联客(MILIANKE)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!

1 概述

SPI是一种串行总线接口,也是各类嵌入式设备以及FPGA应用开发中常用的一种串行通信接口。SPI的接口速度可以最高到上百兆,因此SPI接口不仅仅可以应用于低速设备进行合理的时序设计,也可以用于一些高速串行外设通信。

采用SPI接口的设备一般兼顾低速通信和上百兆的高速通信,比如最常见的FPGA的配置FLASH,最高可以支持100Mbps以上。FPGA内置的SPI配置控制器,可以支持多数据总线方式:X1 X2 X4 X8模式,这样大大提高配置速度,减少配置时间,另外比如高精度ADC芯片AD7606,可以采用自定义SPI协议完成多路高精度ADC的实时采集。

相比嵌入式单片机或者ARM已经集成了的SPI控制器,FPGA的SPI控制器完全由逻辑代码实现,我们可以在FPGA上自己设计SPI控制器然后应用于我们的项目中。

学习FPGA一定要具备非常熟练的FPGA代码设计能力,作为入门学习,掌握SPI串行控制器设计的意义不仅仅是SPI的实用性,更重要的是通过这些简单接口时序的设计,增加初学者原创代码的设计能力,创造能力,这些基础的能力是我们以后面对复杂问题,解决FPGA代码构架设计、通信接口设计、时序逻辑设计的关键能力。

对于SPI Master主设备信号(所谓的主设备也就是所有的数据发送或者发起者):

SCLK:spi clock时钟,由MASTER发送

MOSI:master out slave in主控制器数据发送

MISO:master in slave out控制器数据接收

SS:slave selcet从设备选择,该信号由master主机产生,

对于SPI SLAVE设备:

SCLK:spi clock时钟,该时钟由Master主机产生

SIMO:slave in master out从机接收来自主机发送的数据

SOMI:slave out master in从机发送数据

SS:slave selcet从设备选择,该信号由master主机产生

需要注意对于SPI控制器数据位宽可以X1 X2 X4 X8方式,SS选通的外设根据控制器的设计也可以支持多个。更复杂的SPI控制器才能通过SS信号进行总线的竞争实现多主机的总裁。

以下方案中主控制器通过SS0~SS2可以选通多个SPI外设。

米联客的FPGA入门课程以标准的SPI控制器来说明,SPI的数据位宽是X1方式来讲解协议本身和标准控制器的设计,SS选通信号可以不使用。

2 SPI时序协议

米联客FPGA入门教程部分讲解的SPI协议为SPI标准协议,即数据通信总线为X1模式,并且SPI控制器不支持冲裁功能。这种标准的协议作为入门学习是最佳选择,对于SPI的扩展应用,比如X4模式访问QSPI 接口的FLASH,我们可以在应用方案部分继续讨论。

SPI串行同步时钟可以设置为不同的极性(Clock Polarity ,CPOL)与相位(Clock Phase ,CPHA)。

CPOL(时钟极性):

决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。当时钟极性为0时(CPOL=0),SCK信号线在空闲时为低电平;当时钟极性为1时(CPOL=1),SCK信号线在空闲时为高电平;

CPHA(时钟的相位):

对于SPI主控制器决定了数据的更新时刻设计,对于SPI从控制器决定了数据的采样时刻。当时钟相位为1时(CPHA=1),在SCK信号线的第二个跳变沿进行采样。

以下我们给出CPOL和CPHA的共计4种情况。

SCLK:SPI的总线时钟

DATA:SPI的总线数据

Sendstrobe:SPI 控制器内部程序发送数据的触发信号

CapStroble:SPI 接收制器内部程序采样数据的触发信号

2.1 CPOL=0 CPHA=0

CPOL=0 CPHA=0默认SCLK为低电平,对于发送方,对于第1个bit数据提前放到总线,建议提前0.5个SCK周期,对于接收方,数据在第1个SCLK跳变沿采样,并且容易满足时序约束。

2.2 CPOL=0 CPHA=1

CPOL=0 CPHA=1默认SCLK为低电平,对于发送方,在第1个SCLK的跳变沿更新(对于第一个bit数据可以提前放到总线)对于接收方,数据在第2个SCLK跳变沿采样,并且容易满足时序约束。

2.3 CPOL=1 CPHA=0

CPOL=1 CPHA=0默认SCLK为高电平,对于发送方,对于第1个bit数据提前放到总线,建议提前0.5个SCK周期,对于接收方,数据在第1个SCLK跳变沿采样,并且容易满足时序约束。

2.4 CPOL=1 CPHA=1

CPOL=1 CPHA=1默认SCLK为高电平,对于发送方,在第1个SCLK的跳变沿更新(对于第一个bit数据可以提前放到总线)对于接收方,数据在第2个SCLK跳变沿采样,并且容易满足时序约束。

3 SPI驱动程序基本模块

一个基本的SPI Master驱动程序至少包含用于产生SCLK的时钟分频单元、发送数据并串移位模块和接收数据串并移位模块。

一个基本的SPI Slave驱动程序至少包含接收数据的串并移位模块和发送数据的并串转换模块。

4 FPGA时序要求

基于FPGA的程序设计一定要时刻考虑程序能够满足时序要求,如下图所示。最佳的采样时刻在数据的中心位置,这样可以获得最大的Tsu(数据建立时间)和Thd(数据保持时间)。关于更多时序方面的设计要求可以参考"米联客FPGA代码时序设计专题篇"相关课程内容。