开发板环境:vivado 2017.4 ,开发板型号xc7z020clg400-1,这个工程主要使用DMA进行回环测试

先将DDR内写入数据,然后DMA通过MM2S将数据从DDR读出并写入到fifo中,再通过S2MM将数据从

fifo中读出写入到DDR中构成一个回环。

step1 调用一个zynq核并配置

调用zynq核

勾选HP0

勾选reset管脚

勾选SD卡和uart (不同的开发板会有所差异)

将SDIO设置为50M  (不同的开发板会有所差异)

将FCLK0设置为100M  (不同的开发板会有所差异)

选择DDR型号  (不同的开发板会有所差异)

勾选PL中断

配置完成后,如下图所示

step2  调用dma和fifo进行配置,并将各个模块连接起来

调用一个dma核

按照截图中的进行配置

这里调用的fifo,直接默认的设置就可以了

调用System Reset 、axi_interconnect按照如下配置就可以了

调用一个concat核,这里直接用默认配置

按照下图进行连接

地址分配(DDR大小根据自己开发板进行分配)

step3  综合、生成顶层文件、生成bit文件

综合

生成顶层文件

生成bit文件

step4  导出硬件配置,打开SDK

导出硬件配置

打开SDK

step5  新建fsbl和新建一个dma_test工程

新建fsbl

在dma_test工程的src目录下生成一个dma_test.c文件

再将这个主程序复制到这个dma_test.c文件中

#include "xaxidma.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "xscugic.h"#define DMA_DEV_ID          XPAR_AXIDMA_0_DEVICE_ID
#define INT_DEVICE_ID     XPAR_SCUGIC_SINGLE_DEVICE_ID
#define INTR_ID           XPAR_FABRIC_AXI_DMA_0_S2MM_INTROUT_INTR#define MAX_PKT_LEN        32#define TEST_START_VALUE  0x0#define NUMBER_OF_TRANSFERS  1/** Function declaration*/
int XAxiDma_Setup(u16 DeviceId);
static int CheckData(void);
int SetInterruptInit(XScuGic *InstancePtr, u16 IntrID, XAxiDma *XAxiDmaPtr) ;XScuGic INST ;XAxiDma AxiDma;u8 TxBufferPtr[MAX_PKT_LEN] ;
u8 RxBufferPtr[MAX_PKT_LEN] ;int main()
{int Status;xil_printf("\r\n--- Entering main() --- \r\n");Status = XAxiDma_Setup(DMA_DEV_ID);if (Status != XST_SUCCESS) {xil_printf("XAxiDma Test Failed\r\n");return XST_FAILURE;}xil_printf("Successfully Ran XAxiDma Test\r\n");xil_printf("--- Exiting main() --- \r\n");return XST_SUCCESS;}int SetInterruptInit(XScuGic *InstancePtr, u16 IntrID, XAxiDma *XAxiDmaPtr)
{XScuGic_Config * Config ;int Status ;Config = XScuGic_LookupConfig(INT_DEVICE_ID) ;Status = XScuGic_CfgInitialize(&INST, Config, Config->CpuBaseAddress) ;if (Status != XST_SUCCESS)return XST_FAILURE ;Status = XScuGic_Connect(InstancePtr, IntrID,(Xil_ExceptionHandler)CheckData,XAxiDmaPtr) ;if (Status != XST_SUCCESS) {return Status;}XScuGic_Enable(InstancePtr, IntrID) ;Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) XScuGic_InterruptHandler,InstancePtr);Xil_ExceptionEnable();return XST_SUCCESS ;}int XAxiDma_Setup(u16 DeviceId)
{XAxiDma_Config *CfgPtr;int Status;int Tries = NUMBER_OF_TRANSFERS;int Index;u8 Value;/* Initialize the XAxiDma device.*/CfgPtr = XAxiDma_LookupConfig(DeviceId);if (!CfgPtr) {xil_printf("No config found for %d\r\n", DeviceId);return XST_FAILURE;}Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);if (Status != XST_SUCCESS) {xil_printf("Initialization failed %d\r\n", Status);return XST_FAILURE;}if(XAxiDma_HasSg(&AxiDma)){xil_printf("Device configured as SG mode \r\n");return XST_FAILURE;}Status = SetInterruptInit(&INST,INTR_ID, &AxiDma) ;if (Status != XST_SUCCESS)return XST_FAILURE ;/* Disable MM2S interrupt, Enable S2MM interrupt */XAxiDma_IntrEnable(&AxiDma, XAXIDMA_IRQ_IOC_MASK,XAXIDMA_DEVICE_TO_DMA);XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DMA_TO_DEVICE);Value = TEST_START_VALUE;for(Index = 0; Index < MAX_PKT_LEN; Index ++) {TxBufferPtr[Index] = Value;Value = (Value + 1) & 0xFF;}/* Flush the SrcBuffer before the DMA transfer, in case the Data Cache* is enabled*/Xil_DCacheFlushRange((UINTPTR)TxBufferPtr, MAX_PKT_LEN);for(Index = 0; Index < Tries; Index ++) {Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) TxBufferPtr,MAX_PKT_LEN, XAXIDMA_DMA_TO_DEVICE);if (Status != XST_SUCCESS) {return XST_FAILURE;}Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,MAX_PKT_LEN, XAXIDMA_DEVICE_TO_DMA);if (Status != XST_SUCCESS) {return XST_FAILURE;}while ((XAxiDma_Busy(&AxiDma,XAXIDMA_DEVICE_TO_DMA)) ||(XAxiDma_Busy(&AxiDma,XAXIDMA_DMA_TO_DEVICE))){/* Wait */}}/* Test finishes successfully*/return XST_SUCCESS;}static int CheckData(void)
{u8 *RxPacket;int Index = 0;u8 Value;RxPacket = RxBufferPtr;Value = TEST_START_VALUE;xil_printf("Enter Interrupt\r\n");/*Clear Interrupt*/XAxiDma_IntrAckIrq(&AxiDma, XAXIDMA_IRQ_IOC_MASK,XAXIDMA_DEVICE_TO_DMA) ;/* Invalidate the DestBuffer before receiving the data, in case the* Data Cache is enabled*/Xil_DCacheInvalidateRange((UINTPTR)RxPacket, MAX_PKT_LEN);for(Index = 0; Index < MAX_PKT_LEN; Index++) {if (RxPacket[Index] != Value) {xil_printf("Data error %d: %x/%x\r\n",Index, (unsigned int)RxPacket[Index],(unsigned int)Value);return XST_FAILURE;}Value = (Value + 1) & 0xFF;xil_printf("RxPacket[%08x] = %08x\n\r",Index,RxPacket[Index]);}return XST_SUCCESS;
}

右击Create Boot Image   生成BOOT.bin文件

将BOOT.bin文件拷贝到开发板运行,可以看到串口打印了32个8位数据,这个是接收buffer里的数据

下面是对程序的部分分析

1.

#define MAX_PKT_LEN        32           //这里是值发送多少个8位数据,这里是发送32个8位数据#define TEST_START_VALUE    0x0   //往ddr里写数据,写入的第一个起始数据#define NUMBER_OF_TRANSFERS    1   //回环测试的次数,这里只进行一次回环测试

2.

 XAxiDma_IntrEnable(&AxiDma, XAXIDMA_IRQ_IOC_MASK,XAXIDMA_DEVICE_TO_DMA);设置S2MM使能中断,这里操作的是0x30这个寄存器,当然这里也不只是设置了中断也配置了其它的控制位
具体请参考这个DMA手册

具体的设置请参考DMA手册的0x30寄存器设置

3

 XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DMA_TO_DEVICE);关闭MM2S使能中断,这里操作的是0x00这个寄存器,这里不仅是关闭MM2S中断也配置了其它的控制位
具体请参考这个DMA手册

4


Value = TEST_START_VALUE;for(Index = 0; Index < MAX_PKT_LEN; Index ++) {TxBufferPtr[Index] = Value;Value = (Value + 1) & 0xFF;}这里往TxBuffer里填充32个8位数据

5

Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) TxBufferPtr,MAX_PKT_LEN, XAXIDMA_DMA_TO_DEVICE);启动dma发送,将发送buffer里的数据通过MM2S读出并写入到fifo里

6

         Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,MAX_PKT_LEN, XAXIDMA_DEVICE_TO_DMA);启动dma接收,将fifo里数据读出并且通过S2MM接口写入到ddr里

7

while ((XAxiDma_Busy(&AxiDma,XAXIDMA_DEVICE_TO_DMA)) ||(XAxiDma_Busy(&AxiDma,XAXIDMA_DMA_TO_DEVICE))){检测发送和接收通道是否处于空闲状态,这个类似于while(tx || rx),只有当发送和接收都处于空闲为0时
才会跳出while语句,不然就会一直在这里等待

MYIR-ZYNQ7000系列-zturn教程(23):DMA回环测试相关推荐

  1. 26. GD32F103C8T6入门教程-CAN外设回环测试

    1.基础知识 相关stm32CAN外设 外设特征: 3个发送邮箱 2个深度为3个邮箱的接收FIFO 自动重传 自动唤醒 发送.接收时间戳 最大速率1Mbps 3种工作模式 睡眠模式:可以检车总线状态自 ...

  2. CAN发送和接收数据(回环测试,ok)

    https://blog.csdn.net/weixin_40367126/article/details/106189254 回环指令: ip link set down can0 ip link ...

  3. STM32CubeMX与HAL库学习--简单的CAN回环测试

    STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...

  4. UART串口通信(回环测试)

    一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...

  5. AXI_DMA 回环测试

    AXI_DMA 回环测试 概述 MPSOC的PL和PS大带宽数据交互是离不开AXI_DMA的,近期在xazu3eg平太上验证了该IP(用到的是Direct Register Mode),下面分享给正在 ...

  6. AXI VDMA回环测试

    Block Design 搭建如下图所示的硬件系统: 该硬件系统的数据流向为: DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅 ...

  7. 基于 FPGA 的以太网回环测试verilog实现UDP协议

    基于 FPGA 的以太网回环测试verilog实现UDP协议 verilog实现UDP协议: 该 设计使用 UDP 协议,首先通过串口助手接收 PC 发送的 UDP 数据包,然后提取其中的数据部分并使 ...

  8. ESP3 + ESP-IDF | 串口1 - 简单的串口回环测试

    文章目录 一.前言 二.VSCODE + ESP-IDF 2.1.快速创建项目 2.2.选择串口通道,ESP芯片型号 三.代码 3.1.头文件 3.2.全局变量 3.3.app_main( )函数 3 ...

  9. STM32F1 W5500 TCP Client 回环测试

    刚刚接触W5500的时候,做TCP Client回环测试的时候,出现很奇怪的问题,查了好多遍代码,死活连接不上PC网络助手的TCPServer.其实代码本身没什么大问题,PC机的防火墙忘记关闭了.总结 ...

最新文章

  1. 开发脚本自动部署及监控
  2. Java实现线程同步的方式
  3. PWN-PRACTICE-BUUCTF-21
  4. blob没权限 ie_vuerouter 源码和动态路由权限分配
  5. 【高并发】JUC中的Executor框架详解2
  6. 案例:演示JDBC的使用
  7. swagger测试上传图片报错
  8. Atitit.  Exception in thread main java.lang.Error: Unresolved compilation problem:
  9. 手把手教你学dsp_大咖问答第13期:如何掌握DSP设计?顾卫钢博士在线为你解答...
  10. 数学基础 | (3) cs229概率论基础
  11. 智能车制作1——编码器
  12. 计算机修改密码拒绝访问,win10系统修改密码拒绝访问的操作步骤
  13. 共享打印机无法访问计算机,win7系统文件夹和打印机共享后无法访问的解决方法...
  14. 矩阵的 Jordan 标准型
  15. hdu5820 Lights
  16. 光盘显示0字节可用_多么愚蠢的想法:用光盘来代替U盘
  17. Two Birds with One Stone: Series Saliency for Accurate and Interpretable Multivariate Time Series...
  18. 小尺寸2.4G SMD贴片天线方案 CA-C03 CrossAir贴片天线
  19. 计算机系vi论文,vi设计毕业论文-vi设计论文-计算机论文.docx
  20. Vue.js安装教程

热门文章

  1. RabbitMq分布式事务解决方案第一篇
  2. mac升级到 macos ventura 13.0 后,git失效及gitlab认证失败问题
  3. HISAT2-StringTie-Ballgown有参转录组数据分析
  4. 亚马逊、苹果等 8 家公司收到 10 起 GDPR 投诉
  5. html播放rtsp视频,浏览器播放rtsp视频流解决方案
  6. 一款让订货变得简单的微信订货管理系统
  7. VS代码片段(snippet)创作工具——Snippet Editor
  8. 计算机二级office应用,全国计算机二级MS OFFICE题库软件推出-全国二级MS考点
  9. USB2.0_A型、B型、Mini和Micro接口
  10. 基于Prometheus的微服务应用监控