链式DMA是通过CPx寄存器实现的。对于ADSP2116X来说,CPx是一个19位的寄存器。寄存器中低18位表示相对于基地址0x40000的偏移量,用户在这个地址的内部存储器中存放下一次DMA的参数,这些参数叫做TCB(Transfer Control Blocks)。CPx中的第19位是控制当前链式DMA完成后是否产生中断的PCI位。如果把全局地址赋给CPx,则PCI位一定为1,表明一定会产生中断。
前2种情况比较简单,只需要注意:ADSP2116X链路口的中断屏蔽、锁存与ADSP2106X不同,它从IRPTL/IMASK中分离出来,单独存在于寄存器LIRPTL中,并且在IMASK中加了一个链路口中断总开关LPISUMI。如果要使能某个链路口中断,则需要设置3个控制位。例如使能L0BUF中断,需要以下指令:“bit set imask LPISUMI;bit set lirptl LP0MSK;bit set mode1 IRPTEN;”。
例3:配置L0BUF,利用LSRQ中断实现数据传递。
r0=0x0002c688;
dm(LAR)=r0;
ustat1=dm(LCTL0);
bit clr ustat1 L0EN; /*禁止链路缓冲0*/
dm(LCTL0)=ustat1;
ustat1=dm(LSRQ);
bit set ustat1 L0TM; /*链路0发送屏蔽*/
bit set ustat1 L0RM; /*链路0接收屏蔽*/
dm(LSRQ)=ustat1;
bit set imask LSRQI; /*使能LSRQ中断*/
bit set mode1 IRPTEN;
……