一、背景描述
二、设计思路
三、SPI的标准协议
四、SPI控制端口寄存器
一、背景描述
在项目中,FPGA实现SPI协议完成slaver器件的寄存器读写,是一个很常见的案例应用。当然,每个人的设计都不相同,比如一个spi器件可能就一个driver驱动,后期再引入一个其他型号的就会有个驱动,维护起来可能不方便。
如果要是只用一个spi master就需要尽可能的兼容,有的器件是16位寄存器,16位的数据,有的器件是8位寄存器,8位的数据,甚至有的是16位寄存器,8位的数据,各种情况很繁琐。后期如果需要对寄存器进行修改,在FPGA内部还不能将寄存器写死,需要开发出接口用于调试,很多人通过vio的方式写入,调试阶段无所谓,毕竟有JTAG可以使用。
若后期生产后,没有JTAG接口如何办?
二、设计思路
一个设计思路,是否可以通过串口、网口等协议帧,从上位机输入控制SPI芯片的读写。当然,PCIe这种直接可以使用xdma的bar空间寄存器映射至SPI的控制寄存器,从而实现SPI芯片的读写。设计框架如下,FPGA需要实现的就是寄存器的映射,完成PC端上位机指令的解析和组帧,通过内部axi4lite的转换接口,实现SPI的底层驱动,同时将回读的SPI器件的数据组帧,以串口、网口或者PCIe的接口发送至上位机,注意PCIe一般是FPGA作为EP,不主动发送,通常是被动响应指令。
三、SPI协议
四线SPI协议,SS或者CS,片选信号;SCK表示SPI的驱动时钟;MISO表示Master Input Slaver output;MOSI表示Master Output Slaver Input。
SPI中时钟极性CPOL和相位CPHA,从下述文字和图中可以简单理解,时钟极性CPOL为1表示时钟空闲时候为高电平,时钟极性为0表示时钟空闲时候为低电平。时钟相位CPHA为0表示采样时钟在奇数时钟边沿时数据有效,时钟相位CPHA为1表示采样时钟在偶数时钟边沿时数据有效。
下图是CPHA=0的传输模式,包括sck的两种时钟极性模式
下图是CPHA=1的传输模式,包括sck的两种时钟极性模式
四、SPI控制端口寄存器
为了设计axilite的寄存器,需要满足SPI的驱动的端口控制,当然,端口包括:SPI的时钟频率、时钟极性、时钟相位、SPI读写控制、SPI写入寄存器地址和数据、SPI回读数据内容等。将SPI驱动的端口的控制,通过axilite寄存器进行二次映射,从而实现SPI接口芯片的驱动控制。