Я работаю над Zynq 7z030 и пытаюсь получить данные о DDR со стороны PL. Я использую код опроса AXI DMA SG, предоставленный в качестве примера xilinx на SDK. (xaxidma_example_sg_poll.c)
После настройки DMA -> Настройка канала RX -> Запуск DMA -> Я ввожу API CheckDmaResult.
Здесь я вызываю XAxiDma_BdRingFromHw API.
while ((ProcessedBdCount = XAxiDma_BdRingFromHw(RxRingPtr,
XAXIDMA_ALL_BDS,
&BdPtr)) == 0) {
}
Этот API вызывает Xil_DCacheInvalidateRange, который возвращает, а затем состояние дескриптора блока остается всегда 0. Таким образом, это приводит к бесконечному циклу XAxiDma_BdRingFromHw. Полный бит никогда не устанавливается.
Это происходит, хотя я вижу, что TREADY S2MM поднимается высоко и получает данные в ILA (встроенный логический анализатор на конце FPGA / конце 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;
}
.....
Может ли кто-нибудь предложить возможные причины или указания, которые я должен рассмотреть, чтобы решить эту проблему ... любое и каждое предложение будет большой помощью.
Заранее спасибо!