热门搜索 :
考研考公
您的当前位置:首页正文

ADSP2106x中DMA的应用

来源:伴沃教育


进行详细分析。

2 ADSP2106x中的DMA

下面首先对ADSP2106x中的DMA做概要介绍,然后对

ADSP2106x中的片内DMA控制器可以同时控制10个通道的DMA,完成下列类型的数据传输操作: ·内存 外存或外部存储器映射设备 ·内存 其他ADSP2106x的内存

·内存 串行口 ·内存 Link口 ·内存 外部设备 ·外存 外部设备

·内存 主机接口

丰富的数据流向可以使ADSP2106x实现对各种外设的接口;另外,由于ADSP2106x的内存是双口SRAM,因此在进行上述DMA操作单元仍可以读写内存,使DMA操作与内部运算处理达到高度的并行性。当然,应尽量避免二者同时对同一内存地址进行读写。 每个DMA通道都有一个(或两个)用FIFO实现的数据缓存器,最大的缓冲深度为6级,用以提高DMA数据传输率。所有的DMA这10个数据缓存器来完成的,这些缓存器如表1所示。其中通道1、3、6、7都是两个缓存器共用一个DMA通道。所有数据缓存器映射到内存的前256个地址中。

DMA的编程是通过内部核心处理单元或外部主机对片内有关的I/O寄存器设置来实现的,这些I/O口寄存器也被映射到内存与DMA操作有关的I/O寄存器除了前面的数据缓存器外,主要还包括: ·DMA控制寄存器:DMAC6~9,LCTL,STCTL0~1,SRCTL0~1。

·地址-计数寄存器:II0~9,IM0~9,C0~9,EI6~9,EM6~9,EC6~9。 ·链式操作指针寄存器:CP0~9。

·二维操作寄存器(也可作DMA通用寄存器):GP0~9,DA0~5,DB0~5。 ·DMA状态寄存器:DMASTAT。 DMA设置传输过程一般如下:

(1)设置对应通道的地址-计数寄存器。

(2)设置对应通道的DMA控制寄存器,并将其中的DMA使能位设为有效。 (3)开始DMA数据传输。

(4)DMA传输结束后,产生对应的中断,程序对中断进行处理。 3 几种常用的DMA操作

在基于ADSP2106x的DSP系统的开发过程中,最常用到以下几种DMA操作:内存与外存、内存与主机、内存与外设、内存与换。

3.1 内存与外存间的DMA

内存与外存间的DMA传输可用DMA通道6~9这四个通道中的任一个。这里用一个例子来说明,假如要把内存地址0x26000~数用DMA通道6传送到外存0x400000~4003ff中,可用下面的编程来实现: /*设置内存地址-计数寄存器*/ R0=0x26000;

DM(II6)=R0; /*设置内存起始地址*/ R0=1

DM(IM6)=R0; /*设置内存地址增加值*/ R0=1024;

DM(C6)=R0 /*设置内存读数次数*/ /*设置外存地址-计数寄存器*/ R0=0x400000;

DM(E16)=R0; /*设置外存起始地址*/ R0=1;

DM(EM6)=R0; /*设置外存地址增加值*/ R0=1024;

DM(EC6)=R0; /*设置外存写数次数*/ R0=0x0205;

DM(DMAC6)=R0;;/*设置DMA控制寄存器 DMAC6*/

/*设置为Master和从内存读数方

式,并使能DMA*/

/*DMA通道6开启DMA传数操作*/

这里需要说明两点:(1)I/O寄存器不能用立即数来直接赋值,而要通过通用寄存器R0~15或USTAT0~1来赋值;(2)于数据的宽度有8、16、32和48几种方式,通过DMA传输时,内存和外部接口上的宽度可以不同,因此对应的读写次数可能不同部计数器要分别设置。

对于外部存储器映射设备,其接口地址是固定的,此时内存与该外设间DMA的编程更加简单。比如某外设的地址设在0x400000~0x263ff中的1024个数用DMA通道6传送到该外设接口上,只需把上面程序中的EM6设为0即可。 3.2 内存与主机间的DMA

在ADSP2106x芯片上包含了一个主机(host)接口,可以使其方便地与通用16位或32位计算机相连接,此时,通用计算机就作机,它可对ADSP2106x的片内存储器进行访问。通常情况下,为了减少主机对ADSP2106x寻址的地址线根数,以降低硬件复杂性106x的I/O寄存器(有256个)寻址,寻址的地址线只需8根 1 。BittWare公司的ADSP2106xEZ-LAB开发板即采用了此种方式主机与ADSP2106x内存间的数据交换大多是通过DMA完成的。下面通过运行在微机上的一段C语言程序来说明,此时EZ-LAB板插槽上,微机作为ADSP2106x的主机,ADSP2106x的I/O寄存器可由微机通过ISA总线上的I/O口来访问。该程序把数据d[1024]通ADSP2106x内存0x26000~0x263ff中。具体程序如下: #injclude\"conio.h\"

#include \"def21060.h\" /*ADSP I/O寄存器地址定义文件*/ #include :stdio.h\"

#define ADDR 0X402 /*定义ADSP地址线对应 的ISA总线I/O口地址*/

#define DATA 0x404 /*定义ADSP数据线对应 的ISA总线I/O口地址*/ main() {int n,d[1024];

/*设置ADSP中DMA通道6的地址-计数寄存器及控制寄存器*/ outpw(ADDR,II6); /*寻址起始地址寄存器II6*/ outpw(DATA,0x6000);/*设置II6的低16位*/ outpw(DATA,0x2); /*设置II6的高16位*/

outpw(ADDR,IM6); /*寻址地址增加寄存器IM6*/ outpw(DATA,1); /*设置IM6的低16位*/ outpw(DATA,0); /*设置IM6的高16位*/ outpw(ADDR,C6); /*寻址计数寄存器C6*/ outpw(DATA,1024); /*设置C6的低16位*/ outpw(DATA,0); /*设置C6的高16位*/ outpw(ADDR,DMAC6); /*寻址DMA控制寄存器

DMAC6 */

outpw(DATA,0x41); /*设置DMAC6的低16位*/ outpw(DATA,0); /*设置DMAC6的高16位*/ /*ADSP的DMA通道6设为16/32位模式, 并开启就绪,等待微机传数*/

/*微机向DMA通道6的数据缓存器EPB0中连续写入数据d[.]*/ outpw(ADDR,EPB0); /*寻址DAM通道6的数 据缓存器EPB0*/

for(n=0;n<1024;n++)

{outpw(DATA,d[n]); /*写数据d[n]*/ outpw(DATA,0); /*高16位写0*/ } }

对以上程序需要说明的有两点:(1)ADSP2106x的地址线和数据线是通过ISA总线上两个I/O口地址(ADDR和DATA)来线为16位,而ADSP2106x的I/O寄存器和内存的数据都为32位,因此微机要用高、低16位分别传输,同时把DMA6设置为16/32位模详细情况可参见文献[1]。 3.3 内存与外设间的DMA

对于某些外部设备,其输入或输出是与某个外部时钟同步的,而与ADSP2106x的读写时钟不相干。当这样的设备与ADSP2106法是在接口端加FIFO或双口RAM,把ADSP2106x的读写与该外设的输入或输出时钟隔离开来。但ADSP2106x芯片本身提供了更灵即DMA通道7和8的握手DMA方式(Handshake),可以完全省去FIFO或RAM,其典型应用电路如图2所示。

图中以8位数据线宽度为例,以DMA通道7为输出,对应的握手信号为DMAR1和DMAG1;以DMA通道8为输入,对应的握手信号整个电路只用到了最常用的74273和74374芯片,外设的读写时钟最高可达40MHz。在这种握手DMA方式中,外设不占用ADSP2106x关于上面电路的详细情况,在此不再赘述。

下面给出设置握手DMA的对应程序。这里假设要从外设2中输入1024个数据到内存0x26000~0x264ff中,则需对DMA通道8

R0=0x26000;

/*设置内存地址-计数寄存器*/

DM(II8)=R0; /*设置内存起始地址*/ R0=1;

DM(IM8)=R0; /*设置内存地址增加值*/ R0=1024;

DM(C8)=R0; /*设置内存写数次数*/ /*设置外存计数寄存器*/ R0=1;

DM(EM8)=R0; /*设置外存地址增加值*/ R0=1024;

DM(EC8)=R0; /*设置外存输入次数*/ R0=0x401;

DM(DMAC8)=R0; /*设置DMA控制寄存器 DMAC8*/

/*设置为Handshake和向内存写数方式,并使能DMA*/

/*DMA通道8开启,等待外设的输入时钟,每接 收到一个时钟,输入一次*/

对上面程序需要说明的是:虽然电路中没有用到外存地址,但外存计数寄存器EM7和EC7也必须设置。 如果要向外设1中输入数据,则需要对DMA7进行类似的编程。 3.4 内存与Link口间的DMA

ADSP2106x具有很强的并行工作能力,不需加任何外部仲裁电路,6片ADSP2106x和一个主机就可以很方便连在一起并行工作据交换既可以通过共享的外部数据、地址总线来实现,也可采用点对点的Link口来完成。6个Link口是ADSP2106x芯片所独有的个Link口包含4根数据线、一个时钟线和一个应答信号线,最高的数据传输率为40Mbyte/s。

用Link口进行片间数据交换,通常情况下都要采用DMA方式,这样才能将其优点充分发挥。在使用DMA方式进行Link口通讯时-计数寄存器的设置外,还要进行传输速率选择寄存器(LCOM)和缓存-口配对寄存器(LAR)的设置;最后设置DMA控制寄存器操作。

假设有两片ADSP2106x,它们相互间用Link5口相连;我们要把第一片内存0x26000~0x263ff中的1024个数用Link5口传输000~0x23fff处,则两片ADSP2106x的DMA编程设置如下: /*第一片*/ r0=0X3f000;

dm(LCOM)=r0; /*把Link口设为2x clock*/ r0=0xfff7f;

dm(LAR)=r0; /*link port5--> link buffer2, 对应DMA通道4*/

r0=0X26000; dm(II4)=r0; /*设置起始地址*/ r0=1024; dm(C4)=r0; /*设置读数次数*/ r0=1; dm(IM4)=r0; /*设置地址增加值*/ r0=0Xb00; dm(LCTL)=r0; /*enable output DMA*/ /*第二片*/ r0=0X3f000; dm(LCOM)=r0; /*把Link口设为2x clock*/ r0=0xfff7f; dm(LAR)=r0; /*link port5-->link buffer 2,对 应DMA通道4*/ r0=0x23000; dm(II4)=r0; /*设置起始地址*/ r0=1024; dm(C4)=r0; /*设置读数次数*/ r0=1; dm(IM4)=r0; /*设置地址增加值*/ r0=0x300; dm(LCTL)=r0; /*enable input DMA*/ 对于上面的两段程序,应分别加载到两片ADSP2106x中。需要说明的是:Link Buffer 2对应DMA通道4。如果把其他的Lin5配对,则需设置与该Buffer对应的DMA通道。 ADSP2106x中DMA操作功能强大,形式多样,除了本文所介绍的部分外,还有链式DMA、二维DMA等,因此要全部掌握并熟练应的。通过对各种DMA的应用,可以使数据进出芯片变得更加流畅,也可以使其核心处理单元的运算能力发挥到极致

文章录入:雀鹰

【发表评论】【加入收藏】【告诉好友】【打印

最新热点

常用晶体管3极管资料大全4 [图文]滤波原理 [组图]整流电路 [组图]自制充电器

常用晶体三极管参数表 自动控制电器

基于EDA设计的交通灯控制系 集成电路型号功能对照表 常用的51芯片-AT89C51 SPI接口介绍

最新推荐

常用晶体管3极管资料大全4 常用晶体管3极管资料大全4 常用晶体管3极管资料大全4 常用晶体管3极管资料大全4 二极管、双极型晶体管、场 常用场效应管及晶体管参数 [组图]555应用举例

[组图]含受控源的简单电路 [组图]无源三端电路的等效 [组图]电磁干扰滤波电容器

相关文章

新型以太网控制器ENC28J6PCI PC TV参考平台支持控创RISC构架COM模块面向MSP430与I2C总线接口技高性价比的MSP430应用系新型条形码扫描器大大简基于Linux平台的视频会基于USB-Host的大容量数凌阳启动大学“二五计划坚固型企业数字助理MC70

网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 |

因篇幅问题不能全部显示,请点此查看更多更全内容

Top