ADSP2116中DMA的应用_DSP论文
关键词:dma 链式dma 浮点系列芯片 adsp2116x
1 DMA概述
直接内存存取(DMA)是计算机系统提高运行效率的一项重要技术。它可以在CPU运行指令的同时,使系统从外部存储器或设备中存取数据熞部梢栽诤诵拇理器不参与的情况下由专用的DMA设备存取数据。
对于DSP芯片来讲,DMA的作用尤为重要。众所周知,DSP芯片主要面向实时信号处理熎浜诵脑怂悴考具有很高的运算速度,常以MFLOPS(每秒百万次浮点运算)来衡量。ADSP2116x的速度为600MFLOPS煷怂俣仁且源娲⒃谛酒内部存储器中的程序和数据为前提的。在DSP内部,一般采用多总线的哈佛结构熓据总线和程序总线相互独立,即指令的存取和数据的存取并行不悖,另外,在AD-SP2116x内部还有各种接口总线,可用以提高数据的流通能力,而在芯片的外部,所有的总线都被合并在一起了。为了发挥DSP核心运算单元的高速运算能力,必须先把外部数据传输到片内存储器中。使用DMA操作可以减少核心处理器的负担,提高运算速度。另一方面,DSP系统总要与各种外部信号打交道熕从外部输入数字信号,经过各种算法处理后,还要输出给其它外部设备。不仅如此,对于很多应用系统熓据的输入和输出常常是连续不断的。试想熑粲茫模樱械暮诵牟考完成数据的输入和输出,将无法发挥DSP的高速运算能力。而AD公司的ADSP2116x系列则集成了DMA控制器,从而可用DMA来完成数据的输入和输出。
高效的DSP系统通常采用图1所示的结构。该结构的内部带有输入、输出缓冲区,而数据的获得则依靠DMA控制器。这样,核心运算单元就可以专门进行信号处理,而将外界数据的获取交给 DMA来完成。
2 ADSP2116x中的DMA
2.1 ADSP2116x中DMA的数据传输类型
ADSP2116x中的DMA包含14条独立通道,可完成下列类型的数据传输操作:
●片内存储器与片外存储器或片外设备之间的传输操作;
●片内存储器与其它ADSP2116x的片内存储器之间的传输操作;
●片内存储器与主处理器之间的传输操作;
●片内存储器与串行口之间的传输操作;
●片内存储器与Link口之间的传输操作;
●片内存储器与SPI口之间的传输操作;
●片外存储器与片外设备之间的传输操作。
2.2 ADSP2116x中与DMA有关的寄存器
DMA的编程实际上是通过内部核心处理单元或外部主机对片内有关的I/O寄存器设置来完成的,与DMA有关的I/O寄存器如表1所列。控制寄存器主要用来设置数据传输的方向、数据格式、是否链式等操作;参数寄存器用来设置数据传输的地址、数目等;数据缓存器则主要用来缓存传输的数据,以提高数据的传输率。这些I/O寄存器都被映射到片内存储器的前256个地址上。
表1 adsp2116x中的dma缓存器
dma通道号 | 控制寄存器 | 参数寄存器 | 数据缓存器 | 说 明 |
0 | spctl0 | ii0a,im0a,cp0a,gp0a | rx0a,tx0a | 串口0a |
1 | ii0b,im0b,c0b,cp0b,gp0b | rx0b,tx0b | 串口0b | |
2 | spctl1 | ii1a,im1a,c1a,cp1a,gp1a | rx1a,tx1a | 串口1a |
3 | ii1b,im1b,c1b,cp1b,gp1b | rx1b,tx1b | 串口1b | |
4 | spctl2 | ii2a,im2a,c2a,cp2a,gp2a | rx2a,tx2a | 串口2a |
5 | ii2b,im2b,c2b,cp2b,gp2b | rx2b,tx2b | 串口2b | |
6 | spctl3 | ii3a,im3a,c3a,cp3a,gp3a | rx3a,tx3a | 串口3a |
7 | ii3b,im3b,c3b,cp3b,gp3b | rx3b,tx3b | 串口3b | |
8 | lctlspictl | iilb1,imlb1,clb1,cplb1,gplb1 iistx,imsrx,csrx,gpsrx | lubf0 spirx | link0口spi发送口 |
9 | iilb1,imlb1,clb1,cplb1,gplb1 iistx,imstx,cstx,gpstx | lubf1 spitx | link1口spi发送口 | |
10 | dmac10 | iiep0,imep0,cep0,cpep0,gpep0,eiep0,emep0,ecep0 | epb0 | 外部接口0 |
11 | dmac11 | iiep1,imep1,cep1,cpep1,gpep1,eiep1,emep1,ecep1 | epb1 | 外部接口1 |
12 | dmac12 | iiep2,imep2,cep2,cpep2,gpep2,eiep2,emep2,ecep2 | epb2 | 外部接口2 |
13 | dmac13 | gpep3,eiep3,cep3,cpep3,gpep3,eiep3,emep3,ecep3 | epb3 | 外部接口3 |
2.3 ADSP2116x中DMA一般传输过程的设置
DMA一般传输过程的设置步骤如下:
(1)设置对应通道的参数寄存器
(2)设置对应通道的DMA控制寄存器,并将其中的DMA使能位设为有效
(3)开始DMA数据传输
(4)DMA传输结束后,产生对应的中断,并通过程序对中断进行处理。
2.4 ADSP2116x中的链式DMA
为了减少由DMA引起的中断,ADSP2116x中的DMA控制器提供了链式DMA功能。所谓链式DMA,是指在当前的DMA结束时,I/O处理器能够自动加载DMA参数并开始下一个DMA传输。利用这种特性,程序能够设置多个具有不同属性的DMA传输。在链式DMA过程中,通常先把每次DMA传输的有关参数写成一个传输控制块(TCB),并把它们存储在片内。传输过程中,在当前的DMA结束时,I/O处理器将对链式指针寄存器(CPx)进行控制以使其指向存储在片内的下一个TCB。
表2 tcb中各相关参数寄存器的排列顺序
地 址 | 外部口 | link口和串口 |
cpx+0x00040000 | iiepx | iix |
cpx-1+0x00040000 | imepx | imx |
cpx-2+0x00040000 | cepx | cx |
cpx-3+0x00040000 | cpepx | cpx |
cpx-4+0x00040000 | gpepx | gpx |
cpx-5+0x00040000 | eiepx | |
cpx-6+0x00040000 | emepx | |
cpx-7+0x00040000 | ecepx | |
cpx-8+0x00040000 | - |
CPx在链式DMA中具有非常重要的作用,它是一个19位的寄存器,其中低18位是偏移地址,在ADSP2116x中,这组偏移地址加上0x00040000后才是片内存储器中的实际地址,其中最高一位为中断控制位。该位在被设置的情况下,I/O处理器将在链式DMA结束时产生一个中断,实际上CPx指向的是TCB的最大地址,在TCB中,各有关DMA参数寄存器的排列顺序如表2所列。表中的“x”代表所用到的DMA通道。链式DMA传输过程的设置步骤如下:
(1)在片内存储器中设置好所有的TCB
(2)设置对应通道的控制寄存器,并将其中的DMA使能位和链式使能位设为有效
(3)将第一个TCB的最大地址写到CPx中,并开始链式DMA的传输
(4)传输结束后,产生对应的中断。
有两点要特别注意:第一是链式DMA只能发生在同一DMA通道内;二是SPI口不支持链式DMA。
3 几种常用的DMA操作
在基于ADSP2116x的DSP系统开发过程中,最常用的操作是片内存储器和片外存储器之间的DMA、link口之间的DMA、串口之间的DMA以及SPI之间的DMA等几种。限于篇幅,本文只介绍前面两种。
3.1 片内存储器和片外存储器之间的DMA
片内存储器与片外存储器之间的DMA传输可用通道10~13这四个通道中的任意一个来进行。下面通过一个例子来说明这种传输。假定要把片内存储器地址0x50000~0x5001f中的32个数据熇用DMA通道10传送到片外存储器0x2000000~0x200001f中,则可用下面的程序来实现:
R0=0;dm(DMAC10)=R0; //清空对应通道的DMA控制寄存器
//设置片内存储器参烽寄存器
R0=0x50000; dm(IIEP0)=R0; //设置片内存储器起始地址
R0=1; dm(EMEP0)=R0; //设置片内存储器地址增加值
R0=32; dm(ECEP0)=R0; // 设置片内存储器计数寄存器
//设置片外参数寄存器
R0=0x2000000( dm煟牛桑牛校埃=R0 //设置片外存储器起始地址
R0=1; dm(IMEP0)=R0; //设置片外存储器地址增加值
R0=32; dm(CEP0)=R0; //设置片外存储器计数寄存器
//设置对应通道的DMA控制寄存器
Ustat1=0x00000000;
Bit set ustat1 MASTER|PMODE4|TRAN|DEN;
Dm(DMAC10)=ustat1; // 设置为master和无打包模式,并开始DMA传输
上面的例子是一般的DMA传输。而如果需要进行两段或两段以上的数据传输,则要在中断后重新设置参数寄存器,在这种情况下,用链式DMA更有利于提高核心处理单元的效率。假定要把片内存储器地址0x50000~0x5001f中的32个数据和0x50040~0x5007f中的64个数据利用DMA通道10分别传送到片外存储器0x2000000~0x200001f和0x2000040~0x200007f中,可用下面的程序来实现:
VAR tcb1[8] = 32, //ECEP0
1, //EMEP0
0x2000000, // EIEP0
0, // GPEP0
tcb2+7-0x40000, // CPEP0,保证第一次DMA结束后自动加载第二个TCB
32, // CEP0
1, // IMEP0
0x50000; // IIEP0
VAR tcb2[8]=64,1,0x2000040,
// ECEP0, EMEP0, EIEP0,0 //GPEP0
0x40000, //CPEP0,保证第二个DMA结束后产生DMA中断
64,1,0x50040;//CEP0, IMEP0, IIEP0
r0=0,
dm(DMAC10)=r0; //清空对应通道的DMA控制器
ustat0=0x00000000;
bit set ustat0 INT32 |MASTER|PMODE4|CHEN|DEN|TRAN;
dm(DMAC10)=ustat0; //设置为master和无打包模式,链式DMA
r0=tcb1+7-0x40000;
dm(CPEP0) =r0; //加载第一个TCB的CPEP0
开始DMA传输完第一段数据
后自动开始加载第二个TCB,
直到两段数据后产生中断
bit set mode1 IRPTEN //设置全局中断使能
bit set imask EP0I //设置DMA通道#10中断使能
3.2 片内存储器与link口之间的DMA
ADSP2116x具有很强的并行工作能力,它不需另加任何外部仲裁电路,便可以直接通过link口联接在一起并行工作以实现片间数据的交换,在通常情况下可采用DMA方式,以便充分发挥其优点。下面是两片ADSP2116x之间通过link0口进行数据传输的例子。假定要把第一片片内存储器0x100000~0x1001ff中的512个数据传送到第二片的片内存储器0x120000~0x1201ff中。其程序如下:
//第一片
.var txtcb_source煟袱牐剑阿煟阿煟阿煟阿煟阿煟担保并煟雹煟埃100000
//设置DMA TCB
r0 = 0 dm煟蹋茫裕蹋 = r0 //清空对应通道的
控制寄存器
ustat1=dm煟蹋茫裕蹋牔
bit clr ustat1 L0TRAN | LAB0 | L0CLKD0
bit set ustat1 L0EN | L0CLKD1 | L0DEN | L0CHEN 牐洌恚煟蹋茫裕蹋牐剑酰螅簦幔簦宝 //设置DMA控制器LCTL
//设置link0口为2x时钟,发
送数据模式,链式DMA
r1 = 0x00040000
r0 = txtcb_source + 7
r0 = r1 or r0 //设置CPLB0寄存器中的PCI位
dm煟簦tcb_source + 4 = r0 //设置TCB中的CPLB0
dm煟茫校蹋拢埃 = r0 //加载TCB中的CPLB0,并
开始链式DMA
//第二片
.var rxtcb_dest煟袱牐剑阿煟阿煟阿煟阿煟阿煟担保并煟雹煟埃120000
//设置DMA TCB
r0=0 dm煟蹋茫裕蹋牐剑颍唉 //清空对应通道的控制
寄存器
ustat1=dm煟蹋茫裕蹋牔
bit clr ustat1 LAB0 | L0CLKD0
bit set ustat1 L0TRAN | L0EN | L0CLKD1 | L0DEN | L0CHEN
dm煟蹋茫裕蹋牐剑酰螅簦幔簦宝 //设置DMA控制器LCTL
//设置link0口为2x时钟,
接收数据模式,链式DMA
r1 = 0x00040000
r0 = rxtcb_dest + 7
r0 = r1 or r0 //设置CPLB0中的PCI位
dm煟颍tcb_dest + 4 = r0 //设置TCB中的CPLB0
dm煟茫校蹋拢埃 = r0 //加载TCB中的CPLB0
并开始链式DMA
4 结束语
本文简要介绍了ADSP2116x中DMA的基本原理,给出了几种DMA操作时的编程实例,这些例子重点突出了链式DMA的应用。由于ADSP2116x中DMA操作功能强大,形式多样。因此,只有熟练掌握和应用各种DMA,才能使数据进出芯片变得更加流畅,同时也才能使其核心处理单元的运算能力发挥到极致。