ADSP2116中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?EIEP0)=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
《ADSP2116中DMA的应用(第3页)》