• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

FPGA 学习之路(九)SPI协议通信

互联网 diligentman 3个月前 (10-27) 32次浏览

SPI通信协议

SPI是同步串行通信接口。
SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。SPI通信原理比I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是SSEL(片选,也写作SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。

SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。
SCLK:时钟信号,由主机产生,和I2C通信的SCL有点类似。
MOSI:主机给从机发送指令或者数据的通道。
MISO:主机读取从机的状态或者数据的通道。

在某些情况下,我们也可以用3根线的SPI或者2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI可以不要;当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和MISO都可以不要;如果主机只读取从机送来的数据,SSEL和MOSI都可以不要。 3线和2线的SPI大家要知道怎么回事,实际使用也是有应用的,但是当我们提及SPI的时候,一般都是指标准SPI,都是指4根线的这种形式。

SPI通信的主机也是我们的单片机,在读写数据时序的过程中,有四种模式,要了解这四种模式,首先我们得学习一下2个名词。

CPOL:Clock Polarity,就是时钟的极性。
时钟的极性是什么概念呢?通信的整个过程分为空闲时刻和通信时刻,SCLK在数据发送之前和之后的空闲状态是高电平那么CPOL=1,如果空闲状态SCLK是低电平,那么CPOL=0。
CPHA:Clock Phase,就是时钟的相位。

主机和从机要交换数据,就牵涉到一个问题,即主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据,或者从机在什么时刻输出数据到MISO上而主机什么时刻采样这个数据。同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。又因为数据从产生的时刻到它的稳定是需要一定时间的,那么,如果主机在上升沿输出数据到MOSI上,从机就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要是CPOL的值而定,CPOL=1那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由CPOL决定。那么数据的输出自然就在第二个沿上了。
仔细想一下,这里会有一个问题:就是当一帧数据开始传输第一bit时,在第一个时钟沿上就采样该数据了,那么它是在什么时候输出来的呢?有两种情况:一是SSEL使能的边沿,二是上一帧数据的最后一个时钟沿,有时两种情况还会同时生效。

我们以CPOL=1/CPHA=1为例,把时序图画出来给大家看一下,如图1所示,。
FPGA 学习之路(九)SPI协议通信

大家看图15-1所示,当数据未发送时以及发送完毕后,SCK都是高电平,因此CPOL=1。可以看出,在SCK第一个沿的时候,MOSI和MISO会发生变化,同时SCK第二个沿的时候,数据是稳定的,此刻采样数据是合适的,也就是上升沿即一个时钟周期的后沿锁存读取数据,即CPHA=1。注意最后最隐蔽的SSEL片选,一般情况下,这个引脚通常用来决定是哪个从机和主机进行通信。剩余的三种模式,我把图画出来,简化起见把MOSI和MISO合在一起了,大家仔细对照看看研究一下,把所有的理论过程都弄清楚,有利于你对SPI通信的深刻理解,如图2所示。

FPGA 学习之路(九)SPI协议通信

Verilog程序设计

程序设计采用的通信协议为上图1,即(CPOL=1/CPHA=1)

程序设计步骤:

接收模块:
1)MCU端与FPGA端的数据同步化处理。
SPI数据从MCU输出, MCU与FPGA完全不在同一时钟域,可以采用最简单的D触发器来实现数据的同步。 而上升沿的边沿检测需要消耗两个D触发器,为了保证SPI数据的同步,其他信号也要经过两级触发器输出同步。
接入SPI_DATA 信号和边沿检测SPI_CS和SPI _SCK信号:SPI_SCK上升沿输出数据标志;SPI_CS上升沿为写入数据完成标志。
2)SPI通信协议的设计(数据接收)。
判断SPI_CS是否有效,根据接收使能信号(MCU时序上升沿采样信号)来捕获8位数据,数据的捕获通过计数器计数实现串转并。
3)捕获完成后使能信号的输出。
便于后端响应,输出捕获完成信号标志。

发送模块:
1)MCU端与FPGA端的数据同步化处理。
只需要边沿检测SPI_CS和SPI _SCK信号:SPI_SCK下降沿写入数据标志;SPI_CS上升沿为写入数据完成标志。
2)SPI通信协议的设计(数据接收)。
采用状态机来设计发送协议,设计两个状态,状态1为IDLE等待状态数据输出始终为0,状态2为SEND状态,逐个输出并转串数据。
3)发送数据完成后使能信号的输出。
便于后端响应,输出完成信号标志。信号由CS上升沿决定。

本文部分理论引用自:
http://www.diangon.com/wenku/rd/danpianji/201501/00017903.html


喜欢 (0)