AXI quad SPI没有输出(已解决)

在使用ZYNQ的AXI quad SPI时遇到以下问题:
使用loopback可以成功,但是使用示波器测量引脚却没有输出。


问题描述:

最近在用ZYNQ的AXI quad SPI拓展接口,却遇到了这个问题:
添加AXI quad SPI核,编译完毕后。使用官方例程,loopback模式可以跑通,但是正常输出模式无法工作,且用示波器测试引脚输出没有波形。

IP核AXI quad SPI的设置如下:

程序为AXI quad SPI官方的 xspi_polled_example:

/***************************** Include Files *********************************/#include "xparameters.h"    /* XPAR parameters */
#include "xspi.h"     /* SPI device driver */
#include "xspi_l.h"
#include "xil_printf.h"/************************** Constant Definitions *****************************//** The following constants map to the XPAR parameters created in the* xparameters.h file. They are defined here such that a user can easily* change all the needed parameters in one place.*/
#define SPI_DEVICE_ID       XPAR_SPI_0_DEVICE_ID/**  This is the size of the buffer to be transmitted/received in this example.*/
#define BUFFER_SIZE     12/**************************** Type Definitions *******************************//** The following data type is used to send and receive data on the SPI* interface.*/
typedef u8 DataBuffer[BUFFER_SIZE];/***************** Macros (Inline Functions) Definitions *********************//************************** Function Prototypes ******************************/int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId);/************************** Variable Definitions *****************************//** The instances to support the device drivers are global such that the* are initialized to zero each time the program runs.*/
static XSpi  SpiInstance;    /* The instance of the SPI device *//** The following variables are used to read and write to the  Spi device, they* are global to avoid having large buffers on the stack.*/
u8 ReadBuffer[BUFFER_SIZE];
u8 WriteBuffer[BUFFER_SIZE];/*****************************************************************************/
/**
*
* Main function to call the Spi Polled example.
*
* @param   None
*
* @return  XST_SUCCESS if successful, otherwise XST_FAILURE.
*
* @note        None
*
******************************************************************************/
int main(void)
{int Status;/** Run the Spi Polled example.*/Status = SpiPolledExample(&SpiInstance, SPI_DEVICE_ID);if (Status != XST_SUCCESS) {xil_printf("Spi polled Example Failed\r\n");return XST_FAILURE;}xil_printf("Successfully ran Spi polled Example\r\n");return XST_SUCCESS;
}/*****************************************************************************/
/**
*
* This function does a minimal test on the Spi device and driver as a
* design example. The purpose of this function is to illustrate how to use
* the XSpi component using the polled mode.
*
* This function sends data and expects to receive the same data.
*
*
* @param   SpiInstancePtr is a pointer to the instance of Spi component.
* @param   SpiDeviceId is the Device ID of the Spi Device and is the
*       XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h.
*
* @return  XST_SUCCESS if successful, otherwise XST_FAILURE.
*
* @note
*
* This function contains an infinite loop such that if the Spi device is not
* working it may never return.
*
******************************************************************************/
int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId)
{int Status;u32 Count;u8 Test;XSpi_Config *ConfigPtr;   /* Pointer to Configuration data *//** Initialize the SPI driver so that it is  ready to use.*/ConfigPtr = XSpi_LookupConfig(SpiDeviceId);if (ConfigPtr == NULL) {return XST_DEVICE_NOT_FOUND;}Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr,ConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Perform a self-test to ensure that the hardware was built correctly.*/Status = XSpi_SelfTest(SpiInstancePtr);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Run loopback test only in case of standard SPI mode.*/if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) {return XST_SUCCESS;}/** Set the Spi device as a master and in loopback mode.*/Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION |XSP_LOOPBACK_OPTION);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Start the SPI driver so that the device is enabled.*/XSpi_Start(SpiInstancePtr);/** Disable Global interrupt to use polled mode operation*/XSpi_IntrGlobalDisable(SpiInstancePtr);/** Initialize the write buffer with pattern to write, initialize the* read buffer to zero so it can be verified after the read, the* Test value that is added to the unique value allows the value to be* changed in a debug environment.*/Test = 0x10;for (Count = 0; Count < BUFFER_SIZE; Count++) {WriteBuffer[Count] = (u8)(Count + Test);ReadBuffer[Count] = 0;}/** Transmit the data.*/XSpi_Transfer(SpiInstancePtr, WriteBuffer, ReadBuffer, BUFFER_SIZE);/** Compare the data received with the data that was transmitted.*/for (Count = 0; Count < BUFFER_SIZE; Count++) {if (WriteBuffer[Count] != ReadBuffer[Count]) {return XST_FAILURE;}}return XST_SUCCESS;
}

编译下载之后,串口提示运行成功,

将loopback模式关闭,设置为禁止loopback,CPOL = 1 CPHA = 1。

Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION |XSP_LOOPBACK_OPTION);
//修改为禁止loopback,CPOL = 1 CPHA = 1
Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION |XSP_CLK_PHASE_1_OPTION | XSP_CLK_ACTIVE_LOW_OPTION);

然后,把mosi引脚和miso引脚短接。然后编译、下载,提示运行错误

使用示波器测量SCK、mosi引脚,发现没有波形。


原因分析:

然后在Xilinx的论坛上发现也有人反馈这个问题,最后原因好像是:
因为SS0的引脚一直输出是高电平引起的,我后来将程序修改为持续向SPI发送数据,发现确实是SS0引脚一直是高电平(刚烧写完程序,SS0也会持续一段时间的高电平)。
个人认为可能是SPI自动选择从机编号发生了问题。


解决方案:

参考论坛中的解决方法,具体解决方案:
将从机选择设置为手动选择(XSP_MANUAL_SSELECT_OPTION)

Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION |XSP_CLK_PHASE_1_OPTION | XSP_CLK_ACTIVE_LOW_OPTION | XSP_MANUAL_SSELECT_OPTION);

然后再在SPI禁止中断语句之后,加入选择从机编号的语句。(1号从机的选择引脚就是SS0)

    /** Disable Global interrupt to use polled mode operation*/XSpi_IntrGlobalDisable(SpiInstancePtr);XSpi_SetSlaveSelect(SpiInstancePtr, 0x01);  //选择从机编号

经过以上修改后,再次编译烧写,程序运行正确。

AXI quad SPI没有输出相关推荐

  1. AXI Quad SPI读写Flash做远程升级

    未经允许,本文禁止转载 目录 简介 AXI Quad SPI IP设置 寄存器说明 AXI Quad SPI支持的通用命令 读flash id 读flash 数据 擦除扇区 写flash 数据 注意事 ...

  2. 【ZYNQ实战】利用AXI Quad SPI快速打通Linux至PL端SPI从设备

    关注.星标嵌入式客栈,精彩及时送达 [导读] 前面写过篇介绍ZYNQ基本情况的文章,今天来肝一篇实战文章介绍AXI quad SPI 使用方法,如果你正使用ZYNQ的这个IP,希望对你有所帮助. 初识 ...

  3. 理解AXI Quad Serial Peripheral Interface(SPI) IP核

    reference :   PG153-AXI Quad SPI v3.2 LogiCORE IP Product Guide.pdf 在使用MicroBlaze过程中,调用了此IP,所以有必须仔细学 ...

  4. QSPI(QUAD SPI)基本信息

    QSPI(QUAD SPI) 简介 支持单条.两条.四条数据线连接QSPI FLASH.与SPI相比多了两个数据口,支持一个时钟周期内传输4个Bit的数据.支持交替字节阶段. 特性 2.1三种操作模式 ...

  5. 标准SPI、DUAL SPI、Quad SPI

    1. 标准SPI 标准SPI通常就称SPI,它是一种串行外设接口规范,有4根引脚信号:clk , cs, mosi, miso 2. Dual SPI 它只是针对SPI Flash而言,不是针对所有S ...

  6. 富士通代理Quad SPI铁电FRAM存储器MB85RQ4M

    MB85RQ4ML是一种FRAM(铁电随机存取存储器)芯片,采用524,288字×8位的配置,使用铁电工艺和硅栅CMOS工艺技术来形成非易失性存储单元.采用四路串行外设接口(QSPI),可使用四个双向 ...

  7. quad spi 和qpi的区别

    从用法上看,Quad SPI与QPI的区别在于指令输入的方式,Quad SPI模式指令是通过SI(IO0) pin输入的,地址,数据是通过SI(IO0)/SO(IO1)/IO2/IO3传输的,QPI模 ...

  8. testbench常用任务之SPI slave输出数据

    模仿了SPI master从SPI slave读取数据的MiSO数据状态 每8个clk后读取的数据加1 用的一些额外寄存器需要自己声明和初始化 //-------------------------- ...

  9. LInux命令行参数

    原创: Linux 微知识 在大学里面,老师一般会这样教,定义main 函数应该是这样的: 甚至是这样的: 但是其实在 Linux 下,一个正确的main 函数应该被定义为如下: 大家可以看到,mai ...

最新文章

  1. Maven学习笔记(二) :Maven的安装与配置
  2. MySQL字符集编码
  3. 20_集合_第20天(Map、可变参数、Collections)
  4. Chapter 1 Securing Your Server and Network(2):管理服务的SIDs
  5. 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)
  6. 祝贺JeecgBoot获评为2019年度最受欢迎中国开源软件
  7. jquery-索引2019
  8. 百度Apollo自动驾驶车辆将在苏州太湖面向民众开放
  9. 搜索引擎下拉食云速捷详细_详细解析关键词与搜索引擎之间的霸屏关系
  10. Linux运维问题解决(1)——Linux 定时任务 crontab 配置及示例
  11. use tool wget for windows download
  12. CSDN第四届在线编程大赛2014初赛:带通配符的数
  13. leetcode之奇偶链表
  14. qt中socket通信流程图_Qt学习 之 Socket通信
  15. Ubuntu下PHP开发环境LAMP搭建
  16. switchHosts下载地址
  17. opnet matlab联合仿真,OPNET与Matlab联合仿真参数设置
  18. 中国数字化转型的未来与建议
  19. 常用24位颜色表转换成16位颜色值,让16位lcd使用
  20. 几点关于STM32CubeProgrammer的内容

热门文章

  1. 数据结构_队列_mindmap
  2. 数组array的一些用法
  3. 4种动态加载JS的方法
  4. 支持Windows 7的CAD—AutoCAD Civil 3D 2010
  5. 人人都是 DBA(X)资源信息收集脚本汇编
  6. html egg mac os 10.7,HTML Egg
  7. linux md5sum获取文件指纹数值并使用cut切割
  8. 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
  9. npm常用命令:ini他、install、remove及编译运行工程、使用淘宝npm镜像
  10. helm部署minio