原创 S3C2410下DMA的使用

2009-4-8 21:14 5235 7 9 分类: MCU/ 嵌入式

DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。


DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。


S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同。


那么怎么使用DMA呢,S3C2410内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。


步骤与要点:


1.       数据从哪里来,到哪里去?


使用DMA当然首先我们要知道数据的流向,DISRCx寄存器是DMA初始源寄存器存放了数据的源地址。DIDSTxDMA的初始目的寄存器,应该存放数据的目的地址。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


2.       数据走得什么总线?地址是否是固定的?


我们还要知道源与目的数据存储设备是在什么总线上(AHB系统总线,一般是高速的比如内存,APB外围总线低速的,比如SDUART);


以及数据传输结束以后起始地址还原到发送前的起始地址呢,还是在现在的末尾+1做为新的起始地址。


这些设置在DISRCCxDIDSTCx两个寄存器里面配置。


 


3.       数据以什么方式传输?源与目的是什么设备?要不要自动重载?


需要确定数据的传输方式有请求还是握手(推荐使用HANDSHAKE,根据上面的总线确定与什么时钟同步(HCLKPCLK),是单元传输还是突发传输,是以字节传输还是字传输,是否重载。是单服务(只发送一次)还是多服务(不停循环发送),以及数据的传送大小。


选择源与目的设备,这里DMA控制器支持:


   Ch0:nXDREQ0,UART0,SDI,Timer,USB EP1


   Ch1: nXDREQ1,UART1,I2SSDI,SPI0,USB EP2


   Ch2:I2SSDO,I2SSDI,SDI,Timer, USB EP3


   Ch3:UART1,SDI,SPI1,Timer, USB EP4


最后还要确定中断是不是传输结束发生(CURR_TC记数是不是0)。


这些都在DCONx中设置。


4.       怎么开始传输DMA和停止DMA,这些在DMASKTRIG中设置。


 


下面是DMASD卡中使用的一段示例:


 


SD卡读的DMA设置:


pISR_DMA0=(unsigned)DMA_end; //DMA中断服务函数入口地址,一次DMA传送结束发生rINTMSK = ~(BIT_DMA0); //DMA中断


rDISRC0=(int)(Tx_buffer);  //源地址在内存  就是从内存读数据到SD


rDISRCC0=(0<<1)+(0<<0);  //内存的总线是 AHB, 地址是自动增加inc


rDIDST0=(U32)(SDIDAT);  // 目的地址SD


rDIDSTC0=(1<<1)+(1<<0); // 在总线APB, 地址是固定的因为SDFIFO是固定大的  


rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;


//handshake握手模式, PCLK同步,发送完产生中断, 单元传输, 单服务, SDI


//不自动重载,每次发送一个字,发送大小


rDMASKTRIG0=(0<<2)+(1<<1)+0;  //不停止, DMA0 channel 启动,不用SW触发


 


SD卡写的相应代码


pISR_DMA0=(unsigned)DMA_end;


rINTMSK = ~(BIT_DMA0);


rDISRC0=(int)(Tx_buffer);                              


rDISRCC0=(0<<1)+(0<<0);                            


rDIDST0=(U32)(SDIDAT);                             


rDIDSTC0=(1<<1)+(1<<0);                            


rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;                                                        


rDMASKTRIG0=(0<<2)+(1<<1)+0; 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户539229 2009-5-23 13:54

如果你采样数据量不是很大的话,DMA完成速度完全可以实现的,你只要嵌套个时间中断,或者在操作系统下设置好时间片就行了。这个你具体测试一下,给的最小采样时间间隔应该大于DMA传送一次的时间。

用户192790 2009-5-21 16:14

楼主若是使用DMA方式来控制AD采样,很短时间间隔内进行多次采样的话,这个程序该怎么构造~~?
相关推荐阅读
用户539229 2010-01-23 22:52
vmware下debian5的安装配置以及vmtools的安装使用
一.安装vmware6.5.21.下载vmware6.5.2http://4.scdx3.crsky.com/software/vmware_652.rar2.下载vmware6.5.2汉化包http...
用户539229 2009-12-29 12:57
最新诺基亚Qt4.6的上下位机移植手记,触摸屏支持
一.PC for Winxp下的开发环境的搭建诺基亚收购Qt以后,开发了自己的集成开发环境Qt Creater。这是一个非常强大的工具,上手也很快。登陆:http://qt.nokia.com/dow...
用户539229 2009-12-11 20:14
Omap3evm下android开发第一例hello下位机运行实践
1.       驱动的安装<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 1.1...
用户539229 2009-12-09 19:01
android的windows下开发环境的搭建与hello第一例
Android的SDK的官方网址如下官方网址:http://androidappdocs.appspot.com/sdk/index.html<?xml:namespace prefix = o...
用户539229 2009-11-28 13:21
Omap3下Goole的Android操作系统的实现 相当于山寨智能机啦
首先要有一个:OMAP3EVM平台的开发板 我用的是OMAP35x的TI的评估板还要有一个SD卡 TI花了很大的功夫打造了OMAP3智能手机开发平台,给用户提供了SDK包,GDK包,以及双核的Davi...
用户539229 2009-11-08 19:50
OMAP35x下OneNand的分析以及x-loader的介绍
OMAP35x下OneNand的分析以及x-loader的介绍<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条