PCI9054进行DMA操作时,如何设置FIFO?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCI9054进行DMA操作时,如何设置FIFO?相关的知识,希望对你有一定的参考价值。

我用9054去读FPGA中FIFO的数据,采用DMA方式,刚开始读到的数都正确,但是之后就全为0了。我想应该是9054内部FIFO空满设置的问题,请问应该怎么设置??急等高手!!

参考技术A FIFO有full和empty标志。要先读取full标志,全满再读整个FIFO。可以使用两个FIFO交替工作,所谓的ping pong FIFO,不要使用什么半满、半空标志,不靠谱。可以先用计数器填充FIFO来验证读取逻辑是否正确。使用API函数时,DMA读每个数据(32 bit)都有ADSn信号过来,这个要注意。追问

我采用的FPGA内部FIFO的深度是256的,为了验证DMA过程,我先往FIFO中写了100个数(从0到99),然后用DMA方式去读取数据,前面100个数都正确,100个数之后应该稳定为99才对,测试的结果却是:读一会儿正常,过一会就全为0了,之后就全为0了。而且这个过程没有规律,就是每次测试都不重复,但是前一百个数都正常。请问为?

追答

前一百个数都正常,因为你只写了这100个。后面没数据了,你还读,当然乱了,不能保证后面的数据输出是99,FIFO手册没写,就不靠谱。

如何使stm32用dma进行串口发送,设置DMA_Mode中的Circular和normal问题

大侠,初学stm32,想用dma的方式用串口给pc发送定长的数据,但是我想要按照我的时间发送。假设sendbuff[20],是我要发送的数据,我都设置好了,在DMA_Mode中用的是DMA_Mode_Normal,之后我想在发送时,重新对dma设置,使能,但是没有执行发送的代码,只是第一次发送成功,这是为什么呢,有没有这种问题的完美解决方案,谢谢大侠。

参考技术A 如果没开中断就用查询的方式,下面是DMA1
Channel5的,其他通道类似
/*
等待DMA传输完成
*/
while
(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
/*
清除DMA完成标志
*/
DMA_ClearFlag(DMA1_FLAG_TC5);
/*
关闭DMA传输
*/
DMA_Cmd(DMA1_Channel5,
DISABLE);
执行完上面后就可以接着下一次发送了,中断方式类似,只是要在中断里执行后两个操作,不需要等待

以上是关于PCI9054进行DMA操作时,如何设置FIFO?的主要内容,如果未能解决你的问题,请参考以下文章

pcie与DMA求助

pci9054 不能正常关机

我做的PCI卡(用PCI9054)+FPGA,插到电脑上之后电脑不能启动,可能是啥原因呢?

转:FIFO和DMA

DMA 如何与 PCI Express 设备一起使用?

PCI总线 DMA burst 基本概念