基于NiosII的DMA传输总结.doc

基于NiosII的DMA传输总结.doc

ID:51308778

大小:184.50 KB

页数:6页

时间:2020-03-10

基于NiosII的DMA传输总结.doc_第1页
基于NiosII的DMA传输总结.doc_第2页
基于NiosII的DMA传输总结.doc_第3页
基于NiosII的DMA传输总结.doc_第4页
基于NiosII的DMA传输总结.doc_第5页
资源描述:

《基于NiosII的DMA传输总结.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

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_dma_rxchan_o

2、pen("/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_addr);//dst_addr是目标地址d

3、ma_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_prepare(rx,rx_buf,32,dma_done,N

4、ULL);//rx_buf是目标地址其中通过alt_dma_txchan_ioctl,alt_dma_rxchan_ioctl还可以设置每次发送和接收的字节数。下面给出两个实例,说明DMA传输的过程。1、存储器到存储器下面程序为SDRAM到onchip-memory的数据传输。硬件连接图示:程序如下:#include#include#include#include"system.h"staticvolatileintrx_done=0;intrc;alt_dma_txchantxchan;alt_dm

5、a_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*argv[],char*envp[]){/*打开发送通道*/if((txchan=alt_dma_txc

6、han_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_txchan_send(txchan,                                tx_data,    

7、                            128,                                NULL,                                NULL))<0){   printf("Failedtoposttransmitrequest,reason=%i",rc);   exit(1);}/*开始接收数据*/if((rc=alt_dma_rxchan_prepare(rxchan,                                   rx_buffer,       

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。