2016-05-18 72 views
1

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爲實際上做過數據傳輸?

回答

2

文檔很好僞裝,但我找到了我正在尋找的東西。

當我輸入這個問題時,我意識到這些DMA通道寄存器中必須有一些狀態位。事實上,每個通道都有一個通道狀態寄存器,其中的低4位代表這個頻道。 (我不得不在他們的文檔的附錄B中找到它,在問題中鏈接的文檔的第1201頁)。當DMA觸發完成但仍在傳輸數據時,此4位狀態爲1001(「完成」),並且在通道實際完成時進入0000(「停止」)。

賽靈思甚至在其自動生成的BSP中提供了一個方便的宏來獲取每個通道的狀態寄存器地址的偏移量:XDmaPs_CSn_OFFSET(n)其中n是我的情況下的通道編號-0。

我的修復只是改變我的while循環來檢查通道的狀態去'停止',表示完成傳輸。

while (!(Xil_In32(XPAR_PS_DMA_S_BASEADDR + XDmaPs_CSn_OFFSET(0) & 0x0000000F) != 0x00000000) { 
    // Wait until done 
    i++; 
} 
// Now DMA is truly, really done transferring data. 
// get real result 
result = Xil_In32(0x43C10004); // Read from my IP 

希望這可以節省一些人一些時間&沮喪! :D

+1

謝謝。面對完全相同的問題,你的答案使一切都清楚 –

相關問題