D2--FPGA SPI接口通信2022-08-03

1.SPI简介
SPI是串行外设接口()的缩写,通常说SPI接口或SPI协议都是指SPI这一种串行外设接口规范 。相对于串口,SPI是一种高速的(可达10Mb\s以上),全双工,同步的通信总线 。串口是点对点的全双工的异步通信,因此要通信双方按照相同的约定(指起始、暂停位、波特率)才能在数据上同步,准确通信 。而SPI是一种同步通信的总线结构,同步是指有专门时钟线用来同步源端和目的端,总线结构是指主从之分,通常是一个设备做主,可以多个设备做从,也正因为如此才有了CS片选线,指定所选从设备 。
而在实际的应用中,通常也只是一主一从 。SPI接口多应用于Flash、ADC、LCD控制器,CMOS寄存器配置接口等场景 。SPI在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议 。
2.时序
SPI有四根线,如下,
(1)MISO–Input Slave ,主设备数据输入,从设备数据输出;

D2--FPGA SPI接口通信2022-08-03

文章插图
(2)MOSI–Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK –Clock,时钟信号,由主设备产生;
(4)CS – Chip ,从设备使能信号,由主设备控制 。
SPI有四种数据传输的时序模式,这是有设备的属性的决定的,用CPOL和CPHA表示这四种时序 。CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0(1),空闲电平为低电平(高电平);CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,则在每个周期的第二个时钟沿采样 。通常使用的是MODE0模式,即CPOL=CPHA=0,空闲时为低电平,在第一个时钟沿采样 。其他几种模式如果需要可以上网搜索,资料很多 。
使用SPI接口时需要注意,很多SPI接口的芯片并不是标准的SPI协议,可能是稍有变化,例如对哪个沿采样会有明确的说明 。此外,还有一种可能是在SPI协议的基础上进一步做限制,例如要求一次读写过程结束后CS必须拉高等 。SPI要求是高位在前,MSB的方式 。还有就是SPI一个时钟周期必然要执行接收一位数据和发送一位数据 。
3.Dual、Qual模式
上面描述的就是标准SPI,有4根引脚信号:clk , cs, mosi, miso 。针对SPI Flash而言,有Dual SPI和Qual SPI两种模式,这是因为,Flash器件的全双工并不常用,因此扩展mosi和miso的用法,让它们工作在半双工,用以加倍数据传输 。也就是对于Dual SPI Flash,可以发送一个命令字节进入dual mode,这样mosi变成SIO0( io 0),mosi变成SIO1( io 1),这样一个时钟周期内就能传输2个bit数据,加倍了数据传输 。与Dual SPI类似,Qual SPI Flash增加了两根I/O线(SIO2,SIO3),目的是一个时钟内传输4个bit 。
4.例程设计与代码解读
如图所示,把模块的输入输出分成两个部分,一个部分为图示左侧的与其他模块交互的接口,另一部分为图示右侧与物理管脚相连 。信号为外部的脉冲信号,收到该脉冲执行一次8Bit的发送动作,和8Bit的接收动作 。通过VIO产生信号和要发送的数据信号data[7:0],将板卡上的mosi和miso管脚相连,判断发送数据和接收数据是否一致,若一致则点亮led 。由于缺乏带SPI设备的板卡,故设计此例程 。一次发送动作结束后会产生的脉冲信号,在发送动作执行过程中,持续为拉高状态 。另外,作为同步时钟直接决定传输数据的速度,通常在10Mb/s以下,或者依据对端设备来指定 。
在使用SPI设备时可以修改此驱动模块以满足需求,左侧信号与外部设备交互,当busy拉高的时候不允许发送信号;可以对data信号采用多路选择器,以完成某些固定的指令或者读写操作;同样,数据的位宽也可以扩展 。另外,实际使用的时候应该使用cs管脚,按照相关设备的要求灵活运用该管脚 。