ZYNQ 7000系列 cdma 向DDR读写内存时 cache

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);//切记要刷新一下
/************************************************************************************************************************/
 

  • 24
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值