我现在做LPC2378的GPDMA驱动程序,连续地址(即Channel Linked List Item Registers (DMACCxLLI)等于0)时,测试了内存到内存的DMA传输,没有问题.[只发生一次中断就传输完成] 现有一个经测试没有问题的SD卡驱动程序,我把这个程序改成用GPDMA实现. 初步尝试用GPDMA方式读SD卡,发现程序最多只能读出64byte字节(SD/MMC FIFO的大小),而我希望能读任意字节.感觉对DMA的原理似乎也不太清楚,有些地方比较迷糊,特来请教: 1.SD/MMC的FIFO是64byte的连续空间,我配置GPDMA通道的时候,是不是需要用分散地址,即需要配置LLI表?因为读外设的时候,源地址不是连续的,一直都是读一个32byte的数组(half Fifo). 2.这个表如何建?好像除第一个Linked List,后面源地址,目标地址,配置都是一样的,那LLI都指向第二个就可以了? 3.如果不是用分散地址,GPDMA的中断是每32byte产生(假如brust size配置为32)?中断服务函数中需要进行哪些操作,才能使它能持续的将数据读完?我现在就是只能进中断一次,读出32/64byte,后面的数据没法读完了. 4.GPDMA里的brust(并发?)传输和single传输是什么意思?有什么区别? 5.burst size什么意思?我用的时候好像配置成8,16,32对传输结果没什么影响,只是TransferSize决定要传多少数据.而且最好配置为外设FIFO的一半,为什么? .........
不好意思,比较乱,不懂的地方太多了,总之就是我的GPDMA程序用在SD卡读写的时候出问题了,尤其不知道DMA完成32*N字节的传输是一次搞定还是中断多次,中断中如何配置等等....
先行谢过,若那位好心人,能提供一点DMA的资料或DMA SD卡驱动程序参考一下最好了,我手头只有一个LPC2378的user manual,比较麻烦,没有的帮忙顶一下也成...
|