ADSP2116中DMA的应用Word文档格式.docx
《ADSP2116中DMA的应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《ADSP2116中DMA的应用Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
![ADSP2116中DMA的应用Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/4/5d8c5160-2e2c-4ece-b34f-06c8ab85a40c/5d8c5160-2e2c-4ece-b34f-06c8ab85a40c1.gif)
●片内存储器与片外存储器或片外设备之间的传输操作;
●片内存储器与其它ADSP2116x的片内存储器之间的传输操作;
●片内存储器与主处理器之间的传输操作;
●片内存储器与串行口之间的传输操作;
●片内存储器与Link口之间的传输操作;
●片内存储器与SPI口之间的传输操作;
●片外存储器与片外设备之间的传输操作。
2.2ADSP2116x中与DMA有关的寄存器
DMA的编程实际上是通过内部核心处理单元或外部主机对片内有关的I/O寄存器设置来完成的,与DMA有关的I/O寄存器如表1所列。
控制寄存器主要用来设置数据传输的方向、数据格式、是否链式等操作;
参数寄存器用来设置数据传输的地址、数目等信息;
数据缓存器则主要用来缓存传输的数据,以提高数据的传输率。
这些I/O寄存器都被映射到片内存储器的前256个地址上。
表1ADSP2116x中的DMA缓存器
DMA通道号
控制寄存器
参数寄存器
数据缓存器
说
明
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,GPLB1IISTX,IMSRX,CSRX,GPSRX
LUBF0SPIRX
Link0口SPI发送口
9
IILB1,IMLB1,CLB1,CPLB1,GPLB1IISTX,IMSTX,CSTX,GPSTX
LUBF1SPITX
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.3ADSP2116x中DMA一般传输过程的设置
DMA一般传输过程的设置步骤如下:
(1)设置对应通道的参数寄存器
(2)设置对应通道的DMA控制寄存器,并将其中的DMA使能位设为有效
(3)开始DMA数据传输
(4)DMA传输结束后,产生对应的中断,并通过程序对中断进行处理。
2.4ADSP2116x中的链式DMA
为了减少由DMA引起的中断,ADSP2116x中的DMA控制器提供了链式DMA功能。
所谓链式DMA,是指在当前的DMA结束时,I/O处理器能够自动加载DMA参数并开始下一个DMA传输。
利用这种特性,程序能够设置多个具有不同属性的DMA传输。
在链式DMA过程中,通常先把每次DMA传输的有关参数写成一个传输控制块(TCB),并把它们存储在片内。
传输过程中,在当前的DMA结束时,I/O处理器将对链式指针寄存器(CPx)进行控制以使其指向存储在片内的下一个TCB。
表2TCB中各相关参数寄存器的排列顺序
地
址
外部口
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(dmEIEP0)=R0//设置片外存储器起始地址
dm(IMEP0)=R0;
//设置片外存储器地址增加值
dm(CEP0)=R0;
//设置片外存储器计数寄存器
//设置对应通道的DMA控制寄存器
Ustat1=0x00000000;
Bitsetustat1MASTER|PMODE4|TRAN|DEN;
Dm(DMAC10)=ustat1;
//设置为master和无打包模式,并开始DMA传输
上面的例子是一般的DMA传输。
而如果需要进行两段或两段以上的数据传输,则要在中断后重新设置参数寄存器,在这种情况下,用链式DMA更有利于提高核心处理单元的效率。
假定要把片内存储器地址0x50000~0x5001f中的32个数据和0x50040~0x5007f中的64个数据利用DMA通道10分别传送到片外存储器0x2000000~0x200001f和0x2000040~0x200007f中,可用下面的程序来实现:
VARtcb1[8]=32,//ECEP0
1,//EMEP0
0x2000000,//EIEP0
0,//GPEP0
tcb2+7-0x40000,//CPEP0,保证第一次DMA结束后自动加载第二个TCB
32,//CEP0
1,//IMEP0
0x50000;
//IIEP0
VARtcb2[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;
bitsetustat0INT32|MASTER|PMODE4|CHEN|DEN|TRAN;
dm(DMAC10)=ustat0;
//设置为master和无打包模式,链式DMA
r0=tcb1+7-0x40000;
dm(CPEP0)=r0;
//加载第一个TCB的CPEP0
开始DMA传输完第一段数据
后自动开始加载第二个TCB,
直到两段数据后产生中断
bitsetmode1IRPTEN//设置全局中断使能
bitsetimaskEP0I//设置DMA通道#10中断使能
3.2片内存储器与link口之间的DMA
ADSP2116x具有很强的并行工作能力,它不需另加任何外部仲裁电路,便可以直接通过link口联接在一起并行工作以实现片间数据的交换,在通常情况下可采用DMA方式,以便充分发挥其优点。
下面是两片ADSP2116x之间通过link0口进行数据传输的例子。
假定要把第一片片内存储器0x100000~0x1001ff中的512个数据传送到第二片的片内存储器0x120000~0x1201ff中。
其程序如下:
//第一片
.vartxtcb_source8=0000051210x100000
//设置DMATCB
r0=0dmLCTL=r0//清空对应通道的
ustat1=dmLCTL
bitclrustat1L0TRAN|LAB0|L0CLKD0
bitsetustat1L0EN|L0CLKD1|L0DEN|L0CHENdmLCTL=ustat1//设置DMA控制器LCTL
//设置link0口为2x时钟,发
送数据模式,链式DMA
r1=0x00040000
r0=txtcb_source+7
r0=r1orr0//设置CPLB0寄存器中的PCI位
dmtxtcb_source+4=r0//设置TCB中的CPLB0
dmCPLB0=r0//加载TCB中的CPLB0,并
开始链式DMA
//第二片
.varrxtcb_dest8=0000051210x120000
r0=0dmLCTL=r0//清空对应通道的控制
寄存器
bitclrustat1LAB0|L0CLKD0
bitsetustat1L0TRAN|L0EN|L0CLKD1|L0DEN|L0CHEN
dmLCTL=ustat1//设置DMA控制器LCTL
//设置link0口为2x时钟,
接收数据模式,链式DMA
r0=rxtcb_dest+7
r0=r1orr0//设置CPLB0中的PCI位
dmrxtcb_dest+4=r0//设置TCB中的CPLB0
dmCPLB0=r0//加载TCB中的CPLB0
并开始链式DMA
4结束语
本文简要介绍了ADSP2116x中DMA的基本原理,给出了几种DMA操作时的编程实例,这些例子重点突出了链式DMA的应用。
由于ADSP2116x中DMA操作功能强大,形式多样。
因此,只有熟练掌握和应用各种DMA,才能使数据进出芯片变得更加流畅,同时也才能使其核心处理单元的运算能力发挥到极致。