接着前面的帖子,之前想尝试GPMC的burst功能,发现仅仅读出了一个数,原因是因为自己没有开启DMA功能。于是这两周的重点又放在了GPMC+DMA的结合之上。
先重新提一下我的平台和连接,我是要实现FPGA和ARM之间的通信,采用的GPMC接口,同步模式,接口宽度为16bit。FPGA主要是传递1024*1024*16bit图像过来。
由于GPMC的single模式+DMA速率太慢,所以考虑利用GPMC的burst模式+DMA。那么,问题来了。
GPMC侧,我将config1配置为burst模式,pagelength设置为16words,然后rdaccesstime设置为2,rdcycletime设置为3。
DMA侧,由于是ARM去读FPGA,而FPGA侧主要是一个FIFO,所以我们将SRCBIDX和SRCCIDX都配置为0,另外ACNT设置为2,BCNT设置为1024。DSTBIDX设置为1024.然后采用sync_AB读取模式。
DMA中的OPT配置如下:
paramSet.opt = 0u;
paramSet.opt &= EDMA3CC_OPT_DAM_SHIFT; // ~(EDMA3CC_OPT_SAM | EDMA3CC_OPT_DAM);
paramSet.opt |= (1u<<2);
paramSet.opt |= ((EDMAAPP_DMA_TCC_NUM << EDMA3CC_OPT_TCC_SHIFT)
& EDMA3CC_OPT_TCC);
paramSet.opt |= (1u << EDMA3CC_OPT_ITCINTEN_SHIFT);
paramSet.opt |= (1u << EDMA3CC_OPT_TCINTEN_SHIFT);
然后我主要在FPGA侧用chipscope抓GPMC的波形,来观察时序图。
在测试过程中发现,如果ACNT设置为2,则波形如下:ARM侧能够顺利的将7FEA、7FED、7FE0存入DDR中。
但是这速率显然太慢,于是我将rdaccesstime设置为10,rdcycletime设置为26。另外DMA的ACNT设置为32。FPGA抓到的时序会发现CS低电平长度明显大于我们设置的值,且OE低电平对应的后半部分的数在ARM侧都没有获取到。也就是会丢数,效果和这篇帖子相同(https://e2echina.ti.com/question_answer/dsp_arm/sitara_arm/f/25/p/73309/178220?tisearch=e2e-quicksearch&keymatch=GPMC%20DMA#178220
)。而且同时FPGA采样发现GPMC_A这个地址信号会出现递增的现象,而不是我所一直读取的固定地址。
经过一段时间的反复测试发现,我只有在将DMA侧的配置参数ACNT配置为2的时候,GPMC的时序才能和我设置的参数一致,而我一旦将ACNT设置为4或者8、或者更大时,FPGA采集到的GPMC的时序一定和我ARM设置的存在较大差异(就算我DMA侧FWID配合着修改也不行)。但是ACNT配置为2的时候,也导致了一种情况,不管我GPMC那边burst长度设置的多长,不管我accesstime和cycle_time之间的间隔拉的多长,我在一个CS低电平期间都只能读走一个16bit的数,而不是我所想要的一个CS低电平周期内读走好多数走。所以导致现在GPMC+DMA速率也只有30MB左右,也就是很多帖子提到的GPMC single+DMA的速率。
PS:目前DMA配置参考的下图
所以这边咨询下大家的意见,GPMC采用burst模式+DMA结合的时候,请问是否有大神配置成功过,能够一次GPMC的cs低电平期间就读走很多字节数的?是否有关键的地方需要注意配置的?
目前看来,GPMC 的同步burst模式和DMA结合达不到理想的效果,我的邮箱是975316458@qq.com,也希望能和大家交流沟通一下这方面的问题。
Shine:
看看下面的wiki网站是否有帮助?
processors.wiki.ti.com/…/Tips_for_configuring_OMAP35x,_AM35x,_and_AM-DM37x_GPMC_registers
xiaolin wang:
回复 Shine:
谢谢回复,但是不是这个问题引起的!