[X]关闭

<求助>:关于AXI_DMA回环测试的问题

文档创建者:KcMeterCEC
浏览次数:16423
最后更新:2018-04-25
 
本帖最后由 KcMeterCEC 于 2016-10-24 15:57 编辑

大家好,
       我尝试把PL的数据传送至DDR中,发现官方提供了一个AXI_DMA回环测试的例程。
然后我使用了最简单的轮询模式代码,验证发送的数据是否被正确接收。当然测试程序也通过了。

然后我做了一些改动:
官方例程中发送和接收缓存都是以1字节对齐的,一共发送了32字节。
1、我将缓存改为4字节对齐:      
u32 *TxBufferPtr;
u32 *RxBufferPtr;
u32 Value;

TxBufferPtr = (u32 *)TX_BUFFER_BASE;
RxBufferPtr = (u32 *)RX_BUFFER_BASE;

2、同时发送以及接收函数修改为:

Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,MAX_PKT_LEN * sizeof(Value), XAXIDMA_DEVICE_TO_DMA);
Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) TxBufferPtr,MAX_PKT_LEN * sizeof(Value) , XAXIDMA_DMA_TO_DEVICE);

此时 MAX_PKT_LEN 的值依然为32,也就是说我一共会发送和接收128字节的数据。
3、同理验证函数(CheckData)也作以下修改

static int CheckData(void)
{
        u32 *RxPacket;
        int Index = 0;
        u32 Value;

        RxPacket = (u32 *) RX_BUFFER_BASE;
        Value = TEST_START_VALUE;

        /* Invalidate the DestBuffer before receiving the data, in case the
         * Data Cache is enabled
         */
#ifndef __aarch64__
        Xil_DCacheInvalidateRange((UINTPTR)RxPacket, MAX_PKT_LEN);
#endif

        for(Index = 0; Index < MAX_PKT_LEN; Index++) {
                xil_printf("rx ->%d = 0x%x\r\n",Index,RxPacket[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;
        }

        return XST_SUCCESS;
}

4、出现问题:
接收缓存依然只能接收到正确的32字节数据,其余数据都是乱的!
我尝试过将MAX_PKT_LEN改为 小于或等于8,也就是传送的数据小于或等于32。整个过程就正常了。
5、尝试解决方案
5.1我反复看过AXI_DMA的手册,IP核设置中,与传送数据大小有直接关系的只有"Width of Buffer Length Register"这个位有关,
计算公式为2的N次方。比如现在IP核默认的是14bit,则DMA控制器可以传送的最大字节数为16K字节。远远超过128字节

5.2查看例程中的MAX_PKT_LEN也并没有给DMA的哪个寄存器赋值,进入调试模式查看接收缓存在超过32字节的位置也确实为随机数。

6、以下为一些实际截图

当设置MAX_PKT_LEN 为9,也就是发送数据为36字节时的串口输出:

当设置MAX_PKT_LEN 为5,也就是发送数据为20字节时的串口输出:

vivado 框图

axi_dma设置







本帖子中包含更多资源

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

x

发表评论已发布 11

KcMeterCEC

发表于 2016-10-21 16:29:05 | 显示全部楼层

问题解决了,是因为没有清除足够的发送缓存所造成的。
也就是应该修改清除发送缓存为:
Xil_DCacheFlushRange((UINTPTR)TxBufferPtr, MAX_PKT_LEN * sizeof(uint32_t));

那么结贴了!

uisrc

发表于 2016-10-22 08:07:03 | 显示全部楼层


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

使用道具 举报

uisrc

发表于 2016-10-22 08:13:49 | 显示全部楼层

欢迎分享源码。。。
越努力越幸运!加油!

KcMeterCEC

发表于 2016-10-24 15:58:33 | 显示全部楼层

admin 发表于 2016-10-22 08:13
欢迎分享源码。。。

回大大,源码已经上传了。其实真的很简单,自己当时太粗心了......


uisrc

发表于 2016-10-25 12:00:58 | 显示全部楼层

多谢分享
越努力越幸运!加油!
回复

使用道具 举报

lanejim

发表于 2016-10-25 15:30:32 | 显示全部楼层

我也在做axi dma的测试,只不过是在linux下,测试始终不通过,希望可以交流下,我的测试信息
dma1chan0-dma1c: #0: tx test timed out
dma1chan0-dma1c: #1: tx test timed out
dma1chan0-dma1c: #2: tx test timed out
dma1chan0-dma1c: #3: tx test timed out
dma1chan0-dma1c: #4: tx test timed out

冷血

发表于 2017-8-24 15:29:23 | 显示全部楼层

KcMeterCEC 发表于 2016-10-21 16:29
问题解决了,是因为没有清除足够的发送缓存所造成的。
也就是应该修改清除发送缓存为:
Xil_DCacheFlushR ...

你好,我想问一下,pl端的dma的中断是怎么来控制的,是通过last信号么,如果是这样的话那么dma寄存器里的长度寄存器有什么用?

tangshunchen

发表于 2017-9-12 15:40:50 | 显示全部楼层

请求大神能不能提供我下MATH_IP封装包或者代码,对verilog不熟悉卡了两天了
万分感谢!我的邮箱号tangshunchen@163.com

windy

发表于 2017-12-21 22:56:08 | 显示全部楼层

学习了,正在做这方面的研究。
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则