当前位置:   article > 正文

zynq 中PL DMA 无法将数据从PL搬运到DDR

pl dma

环境:JFMQL20S484 复旦微国产SOC处理器(对标zynq XC7Z020)

项目:XX项目

子项目:存储模块控制逻辑

项目描述:PL实现FLASH阵列控制逻辑(NFC ip),PS实现以太网协议栈、freeRTOS和 NFC控制,PC通过以太网下发控制指令,实现对FLASH阵列的芯片选择、读、写、擦除、读速率测试、写速率测试等功能。

现象1:在FREERTOS 操作系统下,PS发送读FLASH命令,PL内的NFC启动读操作时序,然后将读到的数据存储到FIFO中,DMA将数据从FIFO中搬运到DDR中,但是在PS端去读DDR的内容,没有数据;

现象2:在裸机状态下,DMA可以将数据搬运到DDR中。

现象分析:操作系统和裸机状态的差异在是否使能CACHE,裸机没有使能CACHE,所以DMA可以直接将数据搬运到DDR中,但是操作系统需要使能CACHE,DMA将数据搬运到DDR中后,CACHE中的数据没有更新,所以PS无法读取到数据;

通过在网上查阅资料,zynq中PL向PS中搬运数据,需要调用以下函数:

  1. //写点什么到发送缓冲区sendram
  2. Xil_DCacheFlushRange((u32)sendram,sizeofbuffer);//将内容刷新至DDR
  3. //启动发送DMA过程。。。。
  4. //启动接收DMA过程。。。。。
  5. Xil_DCacheInvalidateRange((u32)recvram,sizeofbuffer);//将DDR内容拉进Cache
  6. //从recvram中读取数据吧!

通过调用复旦微提供的类似库函数,数据还是无法搬运到DDR中,联系了复旦微的技术人员,得到的答复是需要在接收数据之前调用invalidate_dcache_range(unsigned long start, unsigned long stop)函数,

在发送数据之前需要调用flush_dcache_range(unsigned long start, unsigned long stop)函数,修改之后,PL数据可以通过DMA搬运到DDR中。

这就是国产处理器与进口的差异所导致的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/975808
推荐阅读
相关标签
  

闽ICP备14008679号