TI中文支持网
TI专业的中文技术问题搜集分享网站

关于mcbsp的ad采集和DMA的问题

我使用了mcbsp对AD进行采集,需要把采集的数据放入存储卡,因此采用了乒乓缓存的方式,每采一个数,用DMA搬移到内存,一块内存满后,dma产生中断,改变目的地址,存另一块内存,并且cpu开始往存储卡里存数,因为MCBSP的不停地在采数,那怎么才能保证DMA中断时,数据不丢失(因为现在有丢失的点),因为我要改变目的地址了。手册上说用自动初始化,在DMA搬移的同时检查ENDPROG位,是零的话就可以为下一个块传输配置环境了。    现在我的做法是:    初始化DMA时,先配好第一个块的参数,使用自动初始化,使能dma,结束编程(置位ENDPROG),(这样DMA应该会工作,并把配置寄存器的值复制到工作寄存器,再清零ENDPROG,),然后等待ENDPROG清零,再配置下一个块传输的参数,可是程序执行时,ENDPROG一直都是1,而且DMA不工作,不知道这是为什么,请各位大神们帮忙分析分析。   如果我在初始化中不等待ENDPROG清零,不配置第二个块传输参数,DMA就工作了,但这样会在两个块传输之间丢失几点数据。肿么办?

   简而言之就是,怎么用dma把mcbsp源源不断的数据不丢失的搬到乒乓缓存中,以供cpu把数据存到存储卡

Tony Tang:

是你配置流程的问题,下面是我很早以前配置McBSP EDMA的代码,希望对你有所帮助。

 // Read the DMA status registers to clear it so new interrupts will be seen#if 1    DMA_RGETH(hDmaRcv, DMACSR);

    // Start receive DMA    DMA_start(hDmaRcv);           // Start transmit DMA    //DMA_start(hDmaXmt);      // Now that the DMA config regs have been transferred to the working // regs we need to reprogram the rcv dst and xmt src config regs    addr = ((Uint32)gBufferRcvPong) << 1;    DMA_RSETH(hDmaRcv, DMACDSAL, addr & 0xffff);    DMA_RSETH(hDmaRcv, DMACDSAU, (addr >> 16) & 0xffff); #endif

赞(0)
未经允许不得转载:TI中文支持网 » 关于mcbsp的ad采集和DMA的问题
分享到: 更多 (0)