MYIR-ZYNQ7000系列-zturn教程(23):DMA回环测试
开发板环境: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回环测试相关推荐
- 26. GD32F103C8T6入门教程-CAN外设回环测试
1.基础知识 相关stm32CAN外设 外设特征: 3个发送邮箱 2个深度为3个邮箱的接收FIFO 自动重传 自动唤醒 发送.接收时间戳 最大速率1Mbps 3种工作模式 睡眠模式:可以检车总线状态自 ...
- CAN发送和接收数据(回环测试,ok)
https://blog.csdn.net/weixin_40367126/article/details/106189254 回环指令: ip link set down can0 ip link ...
- STM32CubeMX与HAL库学习--简单的CAN回环测试
STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...
- UART串口通信(回环测试)
一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...
- AXI_DMA 回环测试
AXI_DMA 回环测试 概述 MPSOC的PL和PS大带宽数据交互是离不开AXI_DMA的,近期在xazu3eg平太上验证了该IP(用到的是Direct Register Mode),下面分享给正在 ...
- AXI VDMA回环测试
Block Design 搭建如下图所示的硬件系统: 该硬件系统的数据流向为: DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅 ...
- 基于 FPGA 的以太网回环测试verilog实现UDP协议
基于 FPGA 的以太网回环测试verilog实现UDP协议 verilog实现UDP协议: 该 设计使用 UDP 协议,首先通过串口助手接收 PC 发送的 UDP 数据包,然后提取其中的数据部分并使 ...
- ESP3 + ESP-IDF | 串口1 - 简单的串口回环测试
文章目录 一.前言 二.VSCODE + ESP-IDF 2.1.快速创建项目 2.2.选择串口通道,ESP芯片型号 三.代码 3.1.头文件 3.2.全局变量 3.3.app_main( )函数 3 ...
- STM32F1 W5500 TCP Client 回环测试
刚刚接触W5500的时候,做TCP Client回环测试的时候,出现很奇怪的问题,查了好多遍代码,死活连接不上PC网络助手的TCPServer.其实代码本身没什么大问题,PC机的防火墙忘记关闭了.总结 ...
最新文章
- 开发脚本自动部署及监控
- Java实现线程同步的方式
- PWN-PRACTICE-BUUCTF-21
- blob没权限 ie_vuerouter 源码和动态路由权限分配
- 【高并发】JUC中的Executor框架详解2
- 案例:演示JDBC的使用
- swagger测试上传图片报错
- Atitit. Exception in thread main java.lang.Error: Unresolved compilation problem:
- 手把手教你学dsp_大咖问答第13期:如何掌握DSP设计?顾卫钢博士在线为你解答...
- 数学基础 | (3) cs229概率论基础
- 智能车制作1——编码器
- 计算机修改密码拒绝访问,win10系统修改密码拒绝访问的操作步骤
- 共享打印机无法访问计算机,win7系统文件夹和打印机共享后无法访问的解决方法...
- 矩阵的 Jordan 标准型
- hdu5820 Lights
- 光盘显示0字节可用_多么愚蠢的想法:用光盘来代替U盘
- Two Birds with One Stone: Series Saliency for Accurate and Interpretable Multivariate Time Series...
- 小尺寸2.4G SMD贴片天线方案 CA-C03 CrossAir贴片天线
- 计算机系vi论文,vi设计毕业论文-vi设计论文-计算机论文.docx
- Vue.js安装教程
热门文章
- RabbitMq分布式事务解决方案第一篇
- mac升级到 macos ventura 13.0 后,git失效及gitlab认证失败问题
- HISAT2-StringTie-Ballgown有参转录组数据分析
- 亚马逊、苹果等 8 家公司收到 10 起 GDPR 投诉
- html播放rtsp视频,浏览器播放rtsp视频流解决方案
- 一款让订货变得简单的微信订货管理系统
- VS代码片段(snippet)创作工具——Snippet Editor
- 计算机二级office应用,全国计算机二级MS OFFICE题库软件推出-全国二级MS考点
- USB2.0_A型、B型、Mini和Micro接口
- 基于Prometheus的微服务应用监控