ZYNQ 当CDMA控制DDR读写时,cortex arm 芯片会开启cache模式,用simple transfer 模式时,DDR并不会在传输后直接更改,而是放在cache中,需要刷新后才会进入DDR中。
解决方法:
1、关闭cache(不建议)
2、每次读写完毕以后刷新Xil_DCacheFlushRange(内存地址, DATA_LENGTH);(建议)
这是一段简单的cdma simple mode transfer 的模板。
/*cdma向PL侧传输数据**************************************************************************************************************/
// 定义 CDMA 实例和回调函数
XAxiCdma AxiCdmaInstance;
XAxiCdma_Config *CfgPtr;
/* Initialize the XAxiCdma device.
*/
CfgPtr = XAxiCdma_LookupConfig(CDMA_DEV_ID);
if (!CfgPtr) {
return XST_FAILURE;
}
Status = XAxiCdma_CfgInitialize(&AxiCdmaInstance, CfgPtr,CfgPtr->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/* Flush the SrcBuffer before the DMA transfer, in case the Data Cache
* is enabled
*/
Xil_DCacheFlushRange((UINTPTR)DDR_BASEADDR, DATA_LENGTH);//源DDR地址
Xil_DCacheFlushRange((UINTPTR)0x1f000000, DATA_LENGTH); //0x1f000000目标DDR地址
/* Disable interrupts, we use polling mode
*/
XAxiCdma_IntrDisable(&AxiCdmaInstance, XAXICDMA_XR_IRQ_ALL_MASK);
int cdma_thansfor_Mode=XAxiCdma_IsSimpleMode(&AxiCdmaInstance);
Status = XAxiCdma_SimpleTransfer(&AxiCdmaInstance, DDR_BASEADDR,0x1f000000, DATA_LENGTH, NULL, NULL);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
while (XAxiCdma_IsBusy(&AxiCdmaInstance)) {
/* Wait */
}
Xil_DCacheFlushRange((UINTPTR)0x1f000000, DATA_LENGTH);//切记要刷新一下
/************************************************************************************************************************/