【分享】解决ZDMA应用例子xzdma_simple_example.c的“ZDMA Simple Example Failed”问题

作者:hankf,Xilinx Employee

ZDMA应用例子xzdma_simple_example.c 缺省只运行一次。

在XZDma_SimpleExample()里的XZDma_SelfTest( )之后,把运行部分放进一个循环体,可以多次运行。测试工具是Xilinx SDK 2018.2.

但它没有清除 Total byte count寄存器,多次运行后,会溢出, 出现错误"ErrorStatus: 0x8",打印“ZDMA Simple Example Failed”。

在循环体中,添加下述代码,可以清除Totalbyte count寄存器,避免出现错误"ErrorStatus: 0x8"。

/* Clear the TOTAL BYTE COUNT register to avoid the BYTE_CNT_OVRFLW
*interupt from being set
*/
XZDma_WriteReg((ZdmaInstPtr->Config.BaseAddress),
XZDMA_CH_TOTAL_BYTE_OFFSET, 0x00000000U);

SDK 2018.3里的ZDMA驱动, 在函数 XZDma_Reset( ) 清除了这个寄存器。

SDK 2018.3的FSBL,已经清除了这个寄存器。在 SDK 2018.3 ChangeLog, 有如下描述

- Clear total byte counter after every cycle of ADMA to prevent byte count overflow
interrupt from being set.

SDK 2018.3的FSBL的函数XFsbl_AdmaCopy(), 有如下代码。

/* Clear the TOTAL BYTE COUNT register to avoid the BYTE_CNT_OVRFLW
*interupt from being set
*/
XFsbl_Out32(ADMA_CH0_ZDMA_CH_CTRL0_TOTAL_BYTE_COUNT,0x00000000U);

推荐阅读