卡在 API XAxiDma_BdRingFromHw,为什么 S2MM 块描述符的完成位没有设置?
Stuck in API XAxiDma_BdRingFromHw, why doesn't the S2MM Block descriptor's Completed bit Set?
我正在研究 Zynq 7z030,我正在尝试从 PL 端接收 DDR 上的数据。我正在使用 AXI DMA SG 轮询代码,由 xilinx 在 SDK 上作为示例提供。 (xaxidma_example_sg_poll.c)
配置 DMA 后 -> 设置 RX 通道 -> 启动 DMA -> 我输入 API CheckDmaResult。
这里我调用XAxiDma_BdRingFromHwAPI.
while ((ProcessedBdCount = XAxiDma_BdRingFromHw(RxRingPtr,
XAXIDMA_ALL_BDS,
&BdPtr)) == 0) {
}
此 API 调用 Xil_DCacheInvalidateRange,其中 returns 然后块描述符状态始终保持为 0。因此导致 XAxiDma_BdRingFromHw 永远循环。完整的位永远不会设置。
即使我看到 S2MM 的 TREADY 变高并在 ILA 中接收数据(FPGA 上的集成逻辑分析器 end/PL 结束)
,也会发生这种情况
main
....
Status1 = CheckDmaResult(&AxiDma);
.....
-> static int CheckDmaResult(XAxiDma * AxiDmaInstPtr)
....
while ((ProcessedBdCount =
XAxiDma_BdRingFromHw(RxRingPtr,
XAXIDMA_ALL_BDS,
&BdPtr)) == 0) {
}
....
-> XAxiDma_BdRingFromHw(XAxiDma_BdRing * RingPtr, int BdLimit,
XAxiDma_Bd ** BdSetPtr)
....
while (BdCount < BdLimit) {
/* Read the status */
XAXIDMA_CACHE_INVALIDATE(CurBdPtr);
BdSts = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_STS_OFFSET);
BdCr = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_CTRL_LEN_OFFSET);
/* If the hardware still hasn't processed this BD then we are
* done
*/
if (!(BdSts & XAXIDMA_BD_STS_COMPLETE_MASK)) {
break;
}
.....
有人可以提出我应该考虑解决这个问题的可能原因或方向吗..任何和每一个建议都会有很大的帮助。
提前致谢!
问题出在板子上(ESD 损坏)。
一换板DDR就开始接收数据,观察到如下
进一步在调试配置设置中,需要在目标设置下勾选以下内容
重置整个系统
编程 FPGA
在“应用程序”选项卡下
下载申请
停在'main'
- 通过在 'Application ' 字段中指定正确的对应 .elf 文件
我正在研究 Zynq 7z030,我正在尝试从 PL 端接收 DDR 上的数据。我正在使用 AXI DMA SG 轮询代码,由 xilinx 在 SDK 上作为示例提供。 (xaxidma_example_sg_poll.c)
配置 DMA 后 -> 设置 RX 通道 -> 启动 DMA -> 我输入 API CheckDmaResult。 这里我调用XAxiDma_BdRingFromHwAPI.
while ((ProcessedBdCount = XAxiDma_BdRingFromHw(RxRingPtr,
XAXIDMA_ALL_BDS,
&BdPtr)) == 0) {
}
此 API 调用 Xil_DCacheInvalidateRange,其中 returns 然后块描述符状态始终保持为 0。因此导致 XAxiDma_BdRingFromHw 永远循环。完整的位永远不会设置。 即使我看到 S2MM 的 TREADY 变高并在 ILA 中接收数据(FPGA 上的集成逻辑分析器 end/PL 结束)
,也会发生这种情况main
....
Status1 = CheckDmaResult(&AxiDma);
.....
-> static int CheckDmaResult(XAxiDma * AxiDmaInstPtr)
....
while ((ProcessedBdCount =
XAxiDma_BdRingFromHw(RxRingPtr,
XAXIDMA_ALL_BDS,
&BdPtr)) == 0) {
}
....
-> XAxiDma_BdRingFromHw(XAxiDma_BdRing * RingPtr, int BdLimit,
XAxiDma_Bd ** BdSetPtr)
....
while (BdCount < BdLimit) {
/* Read the status */
XAXIDMA_CACHE_INVALIDATE(CurBdPtr);
BdSts = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_STS_OFFSET);
BdCr = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_CTRL_LEN_OFFSET);
/* If the hardware still hasn't processed this BD then we are
* done
*/
if (!(BdSts & XAXIDMA_BD_STS_COMPLETE_MASK)) {
break;
}
.....
有人可以提出我应该考虑解决这个问题的可能原因或方向吗..任何和每一个建议都会有很大的帮助。 提前致谢!
问题出在板子上(ESD 损坏)。 一换板DDR就开始接收数据,观察到如下
进一步在调试配置设置中,需要在目标设置下勾选以下内容
重置整个系统
编程 FPGA
在“应用程序”选项卡下
下载申请
停在'main'
- 通过在 'Application ' 字段中指定正确的对应 .elf 文件