[X]关闭

Mis603开发板MB SOC开发教程:第八章 SPI回传实验

文档创建者:Milinker_XU
浏览次数:6433
最后更新:2016-01-16
本帖最后由 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中,我们使用P104IO来进行配置,分别为C16B16A14E10。如下图所示。


◎约束文件中,将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也可参考该目录下提供的例子。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 2

贾文洋

发表于 2016-1-16 12:56:39 | 显示全部楼层

回复

使用道具 举报

uisrc

发表于 2016-1-16 14:11:57 | 显示全部楼层

越努力越幸运!加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则