资源描述:
《基于niosii的dma传输总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、最近练了一段时间的DMA传输,现做如下的总结,分享自己获得心得以及遇到的一些问题。 在系统运行时,当需要传输大量数据时,可以采用DMA的方式进行传输,以解脱出CPU来处理其他命令。NiosII中的DMA传输有以下三种形式:1、存储器到存储器这种情况下需要同时打开发送通道和接收通道,而且源地址和目标地址都是自增的。tx=alt_dma_txchan_open("/dev/dma_0");//打开发送通道dma_res=alt_dma_txchan_send(tx,tx_buf,32,NULL,NULL);//tx_buf是源地址rx=alt_dm
2、a_rxchan_open("/dev/dma_0");//打开接收通道dma_res=alt_dma_rxchan_prepare(rx,rx_buf,32,dma_done,NULL);//rx_buf是目标地址,dma_done()是DMA完成后被调用的回调函数。2、存储器到外设这种情况下只要打开发送通道,而且源地址是自增的,目标地址是固定的。tx=alt_dma_txchan_open("/dev/dma_0");//打开发送通道alt_dma_txchan_ioctl(tx,ALT_DMA_TX_ONLY_ON,(void*)dst_ad
3、dr);//dst_addr是目标地址dma_res=alt_dma_txchan_send(tx,tx_buf,32,dma_done,NULL);//tx_buf是源地址3、外设到存储器这种情况下只要打开接收通道,而且源地址是固定的,目标地址是自增的。rx=alt_dma_rxchan_open("/dev/dma_0");//打开接收通道alt_dma_rxchan_ioctl(rx,ALT_DMA_RX_ONLY_ON,(void*)source_addr);//source_addr是源地址dma_res=alt_dma_rxchan_p
4、repare(rx,rx_buf,32,dma_done,NULL);//rx_buf是目标地址其中通过alt_dma_txchan_ioctl,alt_dma_rxchan_ioctl还可以设置每次发送和接收的字节数。下面给出两个实例,说明DMA传输的过程。1、存储器到存储器下面程序为SDRAM到onchip-memory的数据传输。硬件连接图示:程序如下:#include#include#include#include"system.h"staticvolatileintrx_
5、done=0;intrc;alt_dma_txchantxchan;alt_dma_rxchanrxchan;staticcharbuff[256];void*tx_data=(void*)buff;/*源地址*/void*rx_buffer=(void*)0x01801000;/*目标地址,从上图看到0x01801000为onchip-memory的地址*///DMA传输结束回调函数staticvoiddone_t(void*handle,void*data){ rx_done++; }intmain(intargc,char*ar
6、gv[],char*envp[]){/*打开发送通道*/if((txchan=alt_dma_txchan_open("/dev/dma"))==NULL){ printf("Failedtoopentransmitchannel"); exit(1);}/*打开接收通道*/if((rxchan=alt_dma_rxchan_open("/dev/dma"))==NULL){ printf("Failedtoopenreceivechannel"); exit(1);}/*开始发送数据*/if((rc=alt_dma_txc
7、han_send(txchan, tx_data, 128, NULL, NULL))<0){ printf("Failedtoposttransmitrequest,reason=%i",rc); exit(1);}/*开始接收数据*/if((rc=alt_dma_rxchan_prepar
8、e(rxchan, rx_buffer,