[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-13 SPI通信协议原理

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1概述

[2 SPI时序协议](#2 SPI时序协议)

[2.1 CPOL=0 CPHA=0](#2.1 CPOL=0 CPHA=0)

[2.2 CPOL=0 CPHA=1](#2.2 CPOL=0 CPHA=1)

[2.3 CPOL=1 CPHA=0](#2.3 CPOL=1 CPHA=0)

[2.4 CPOL=1 CPHA=1](#2.4 CPOL=1 CPHA=1)

[3 SPI驱动程序基本模块](#3 SPI驱动程序基本模块)

[4 FPGA时序要求](#4 FPGA时序要求)


1概述

SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是 Motorola 公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于 EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上,是常用的、重要的低速通讯协议之一。本节我们主要学习SPI通信的原理。

SPI 通信协议简介:

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 selce)t从设备选择,该信号由Master主机产生

寻址方式:

需要注意对于SPI控制器数据位宽可以X1 X2 X4 X8方式,SS选通的外设根据控制器的设计也可以支持多个。当有多个SPI Slave与SPI Master相连时,都共同使用SCK、MOSI、MISO这三条总线,每一个SPI Master都有独立的片选信号(SS),通过SS片选信号来决定和哪台从设备进行通信。更复杂的SPI控制器才能通过SS信号进行总线的竞争实现多主机的仲裁。

以下方案中主控制器通过SS0~SS1可以选通多个SPI外设。当主设备要和某个从设备进行通信时,主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平,根据从机而定)表示选中该从设备。如果使能多个SS片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

通信过程:

要开始SPI通信,主机必须发送时钟信号,并通过使能SS信号选择从机。只有片选信号SS拉低(或者拉高),MOSI和MISO在SCLK每一个周期传送一位数据。SPI总线在进行数据传送时,没有硬性规定先传送高位还是低位,但是通信双方要约定好相同的传送方式,一般采用先传送高位,后传送低位。例如下图,MOSI和MISO同时从高位开始传输,一个字节传送完成后无需应答即可开始下一个字节的传送,八个时钟周期即可完成一个字节数据的传送。

多从机配置:

主机可以通过将从机的CS片选信号来选择要与之通信的从机,从机可以采用常规模式连接,或采用菊花链模式连接。

常规SPI模式

主机上可以有多个CS引脚,允许多个从机并联接线。如果主机只有一个CS引脚,则可以通过菊花链将多个从器件连接到主机。所有从机的片选信号连接在一起,所有从机同时接收同一SPI时钟,来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。然而在这种方法中,当数据从一个从机传SDO播到下一个从机SDI时,会有周期延迟。

菊花链SPI模式

2 SPI时序协议

米联客的FPGA入门课程以标准的SPI控制器来说明,SPI的数据位宽是X1方式来讲解协议本身和标准控制器的设计,SS选通信号可以不使用,并且SPI控制器不支持仲裁功能。这种标准的协议作为入门学习是最佳选择,对于SPI的扩展应用,比如X4模式访问QSPI 接口的FLASH,我们可以在应用方案部分继续讨论。

SPI总线传输有4种不同的模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的,但我们的通信双方必须是工作在同一模式下。SPI总线的工作方式由时钟极性(Clock Polarity ,CPOL)与时钟相位(Clock Phase ,CPHA)来定义。我们可以通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式。

CPOL(时钟极性)

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

CPHA(时钟相位)

对于SPI主控制器决定了数据的更新时刻设计,对于SPI从控制器决定了数据的采样时刻。当时钟相位为0时(CPHA=0),在sclk的第1个跳变沿采样;当时钟相位为1时(CPHA=1),在sclk的第2个跳变沿采样;

以下我们给出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代码时序设计专题篇"****相关课程内容。

相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner2 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20202 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子3 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议