AXI quad SPI没有输出
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没有输出相关推荐
- AXI Quad SPI读写Flash做远程升级
未经允许,本文禁止转载 目录 简介 AXI Quad SPI IP设置 寄存器说明 AXI Quad SPI支持的通用命令 读flash id 读flash 数据 擦除扇区 写flash 数据 注意事 ...
- 【ZYNQ实战】利用AXI Quad SPI快速打通Linux至PL端SPI从设备
关注.星标嵌入式客栈,精彩及时送达 [导读] 前面写过篇介绍ZYNQ基本情况的文章,今天来肝一篇实战文章介绍AXI quad SPI 使用方法,如果你正使用ZYNQ的这个IP,希望对你有所帮助. 初识 ...
- 理解AXI Quad Serial Peripheral Interface(SPI) IP核
reference : PG153-AXI Quad SPI v3.2 LogiCORE IP Product Guide.pdf 在使用MicroBlaze过程中,调用了此IP,所以有必须仔细学 ...
- QSPI(QUAD SPI)基本信息
QSPI(QUAD SPI) 简介 支持单条.两条.四条数据线连接QSPI FLASH.与SPI相比多了两个数据口,支持一个时钟周期内传输4个Bit的数据.支持交替字节阶段. 特性 2.1三种操作模式 ...
- 标准SPI、DUAL SPI、Quad SPI
1. 标准SPI 标准SPI通常就称SPI,它是一种串行外设接口规范,有4根引脚信号:clk , cs, mosi, miso 2. Dual SPI 它只是针对SPI Flash而言,不是针对所有S ...
- 富士通代理Quad SPI铁电FRAM存储器MB85RQ4M
MB85RQ4ML是一种FRAM(铁电随机存取存储器)芯片,采用524,288字×8位的配置,使用铁电工艺和硅栅CMOS工艺技术来形成非易失性存储单元.采用四路串行外设接口(QSPI),可使用四个双向 ...
- quad spi 和qpi的区别
从用法上看,Quad SPI与QPI的区别在于指令输入的方式,Quad SPI模式指令是通过SI(IO0) pin输入的,地址,数据是通过SI(IO0)/SO(IO1)/IO2/IO3传输的,QPI模 ...
- testbench常用任务之SPI slave输出数据
模仿了SPI master从SPI slave读取数据的MiSO数据状态 每8个clk后读取的数据加1 用的一些额外寄存器需要自己声明和初始化 //-------------------------- ...
- LInux命令行参数
原创: Linux 微知识 在大学里面,老师一般会这样教,定义main 函数应该是这样的: 甚至是这样的: 但是其实在 Linux 下,一个正确的main 函数应该被定义为如下: 大家可以看到,mai ...
最新文章
- Maven学习笔记(二) :Maven的安装与配置
- MySQL字符集编码
- 20_集合_第20天(Map、可变参数、Collections)
- Chapter 1 Securing Your Server and Network(2):管理服务的SIDs
- 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)
- 祝贺JeecgBoot获评为2019年度最受欢迎中国开源软件
- jquery-索引2019
- 百度Apollo自动驾驶车辆将在苏州太湖面向民众开放
- 搜索引擎下拉食云速捷详细_详细解析关键词与搜索引擎之间的霸屏关系
- Linux运维问题解决(1)——Linux 定时任务 crontab 配置及示例
- use tool wget for windows download
- CSDN第四届在线编程大赛2014初赛:带通配符的数
- leetcode之奇偶链表
- qt中socket通信流程图_Qt学习 之 Socket通信
- Ubuntu下PHP开发环境LAMP搭建
- switchHosts下载地址
- opnet matlab联合仿真,OPNET与Matlab联合仿真参数设置
- 中国数字化转型的未来与建议
- 常用24位颜色表转换成16位颜色值,让16位lcd使用
- 几点关于STM32CubeProgrammer的内容