本帖最后由 Milinker_XU 于 2016-1-16 12:09 编辑
这一章节中我们在mis603开发板上,实现一个SPI回传实验。由于开发板没有对应的SPI接口,因此我们使用IO口来进行测试。 ◎紧接上一工程,在XPS中添加AXI SPI Interface的IP。
◎在弹出的XPS CoreConfig中,将ip命名为spi_0,其他选择默认,无需做修改。
◎将IP添加到工程中。
◎可以看到,spi_0的IP挂在了axilite_0的总线下。
◎在Ports下配置SPI的输出,SPISEL我们不需要,选择No connection。
◎保存后在mis603_soc.mhs文件中可以看到对应的SPI IO定义。
◎在ucf文件中,设置引脚约束。在mis603中,我们使用P10的4个IO来进行配置,分别为C16,B16,A14,E10。如下图所示。
◎约束文件中,将SCK约束成全局时钟,其他随便。
◎保存工程后,在HardwareGenerate NetList下产生网表。完成后,返回ISE工程。 ◎使用Processes下的Generrate TOP HDL source产生MB的顶层文件。
◎编译工程,产生bit文件。编译完成后,打开SDK文件,查看system.xml下有没有IP版本号,如果没有,重启SDK。
◎在SDK下新建个工程,工程命名为SPI_LOOP。
◎以helloworld作为模板,生成工程文件和BSP开发包。
◎将helloworld.c文件重命名为spi_loop.c。同样,在src中新建几个文件:1.spi_init.c文件,包含spi传输初始化;2.spi_loop.h,包含必要的头文件。 ◎spi_init.c文件中主要进行SPI初始化和SPI的读写操作。具体的寄存器操作,可以查看对应的函数和文件。 /* * spi_init.c * * Created on: 2016-1-16 * Author: Administrator */ #include "spi_loop.h" int ControlReg; /*初始化SPI*/ void SPI_Init(u16 DeviceId) { XSpi_Initialize(&Spi,DeviceId);//初始化SPI XSpi_Reset(&Spi);// 复位SPI ControlReg = XSpi_GetControlReg(&Spi);//读控制寄存器 //写状态寄存器 XSpi_SetControlReg(&Spi, ControlReg | XSP_CR_MASTER_MODE_MASK); XSpi_IntrGlobalDisable(&Spi);//禁止中断 //读控制寄存器 ControlReg = XSpi_GetControlReg(&Spi) &(~XSP_CR_TRANS_INHIBIT_MASK); XSpi_SetControlReg(&Spi, ControlReg |XSP_CR_ENABLE_MASK);//设置控制寄存器 } u8 SPI_ReadWriteByte(u8 TxData) { int StatusReg; u16 retry=0; do { retry++; if(retry>=0XFFFE)return 0; StatusReg = XSpi_GetStatusReg(&Spi); } while ((StatusReg & XSP_SR_TX_EMPTY_MASK) == 0); //等待发送寄存器为空,开始写数据 XSpi_WriteReg(Spi.BaseAddr, XSP_DTR_OFFSET,TxData); retry=0; do{ retry++; if(retry>=0XFFFE)return 0; StatusReg = XSpi_GetStatusReg(&Spi); }while (StatusReg & XSP_SR_RX_EMPTY_MASK); //等待接收寄存器为空,开始接收数据 return XSpi_ReadReg(Spi.BaseAddr,XSP_DRR_OFFSET); } |
◎spi_loop.h文件中,仍然包括必要的头文件和函数的声明。 /* * spi_loop.h * * Created on: 2016-1-16 * Author: Administrator */ #ifndef SPI_LOOP_H_ #define SPI_LOOP_H_ #include <stdio.h> #include "platform.h" #include "xil_types.h" #include "xspi.h" #include "xparameters.h" XSpi Spi; void SPI_Init(u16 DeviceId); u8 SPI_ReadWriteByte(u8 TxData); #endif /* SPI_LOOP_H_ */ |
◎spi_loop.c文件中,进行spi的循环测试。定义两个数据receive和send,宽度为8bit。send初始化为FF。讲数据通过MISO发送出去,再通过MOSI收回来。 #include "spi_loop.h" int main(void) { u8 receive,send=0xFF; SPI_Init(XPAR_SPI_0_DEVICE_ID); while(send--) { receive=SPI_ReadWriteByte(send);//发送y 同时完成一次接受 xil_printf("read %x\r\n",receive); } return 0; } |
◎在mis603开发板上,将P10的5号引脚(B16)和7号引脚(A14)用跳线帽或杜邦线连接起来。 ◎在ISE中启动IMPACT将bit文件下载到mis603中,再运行SDK中的SPI_LOOP。可以看到console控制台下打印出了spi寄存器中读出的数据,也就是我们发送的数据,从FE-00。
◎本章节中实现的SPI回传实验,操作起来并不复杂。用户在使用这个IP在对其他复杂的驱动进行操作时,可以选择参考下Xilinx官方的一些例程。当然其他的ip也可参考该目录下提供的例子。
|