TL; DR:Zynq7000 PS內置DMA過早返回「完成」信號。它似乎立即發出信號(我認爲)會填充其內部「MFIFO」,並且不再需要訪問數據源。但是我的SW需要知道它何時實際完成了數據傳輸。Zynq7000 PS DMA「完成」信號太快
PS DMA是否有狀態位來指示傳輸是否完成?賽靈思文檔是不清楚在那幾個DMA寄存器 (http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf,第276頁)
我使用DMA超過泵數據從DDR內存塊的PL IP,使用下面的C代碼:
// Allocate memory in DDR, 1600 bytes PLZ.
char *mem_block = malloc(1600*sizeof(char));
// Fill memory with data (not shown)
// Configure the DMA command
memset(&dmaCmd, 0, sizeof(XDmaPS_Cmd));
dmaCmd.ChanCtrl.SrcBurstSize = 1;
dmaCmd.ChanCtrl.SrcBurstLen = 4;
dmaCmd.ChanCtrl.SrcInc = 1;
dmaCmd.ChanCtrl.DstBurstSize = 1;
dmaCmd.ChanCtrl.DstBurstLen = 4;
dmaCmd.ChanCtrl.DstInc = 0; // Do not increment, (Fixed DST Addr.)
dmaCmd.BD.SrcAddr = (u32)mem_block;
dmaCmd.BD.DstAddr = (u32)0x43c10000; // Destination address (in PL)
dmaCmd.BD.Length = 1600; // Bytes
然後我開始DMA傳輸...
status = XDmaPs_Start(&dmaInst, 0, &dmaCmd, 0);
if (status != XST_SUCCESS) {
printf("ERROR, could not start DMA Txfer.");
return XST_FAILURE;
}
,並等待它完成,從我的IP回讀結果之前。
while (!(Xil_In32(XPAR_PS7_DMA_S_BASEADDR + XDMAPS_INTSTATUS_OFFSET) & 0x00000001)) {
i++; // Waiting for DMA to finish...
}
result = Xil_In32(0x43c10004); // read result from my IP
// Result is available as soon as DMA is finished--on the very next 100MHz fabric clock.
我遇到的問題是,在數據傳輸完成之前,通常會很快讀回此結果。顯然,DMA有時會說,它是在DMA傳輸仍在進行的時候完成的(我可以這麼說,因爲在芯片掃描時,我可以看到讀寫發生時,寫突發仍在發生)。
如何設置我的軟件等待直到DMA爲實際上做過數據傳輸?
謝謝。面對完全相同的問題,你的答案使一切都清楚 –