DMAC可以在两种模式下运行:无描述符存取模式和描述符存取模式。模式的选取由DCSRx[NODESCFETCH]位决定。同样在同一时间内,不同的通道里可以分别使用这两种模式。通道在转换运行模式之前必须停止数据处理。如果出现错误,则通道停留在停止状态,等待程序处理。
(1)无描述符存取模式
在无描述符存取模式下,DDADRx被保留。程序不可以向DDADRx中写入数据,并且必须加载DSADRx、DTADRx和DCMDx寄存器。当运行位被设置,DMAC立刻运行以传输数据。无描述符存取在数据传输的开始时被执行。
一个典型的无描述符存取操作顺序如下。
1)复位后,通道处于未初始化状态。
2)设置DCSR[RUN]位为0,设置DCSR[NODESCFETCH]位为1。
3)程序将源地址写入DSADR寄存器,将目标地址写入DTADR寄存器,将命令写入DCMD寄存器。
4)向DCSR[RUN]位中写入1,然后无描述符存取被执行。
5)通道等待数据传输请求。
6)通道传输数据,数据量由DCMD[SIZE]和DCMD[LENGTH]较小者决定。
7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。
8)DDADR[STOP]被设置为1,通道运行终止。
(2) 有描述符存取模式
在有描述符存取模式下,DMAC的寄存器用内存中的DMA描述符数据填充。多个DMA描述符可以被链成一个链表。这就允许DMA通道在一系列不连续的地址上进行数据传输。一个典型的有描述符存取模式的操作步骤如下。
1)复位后,通道处于未初始化状态。
2)程序将描述符地址(16字节对齐)写入DDADR寄存器。
3)程序向DCSR[RUN]中写入1。
4)DMAC从DDADR标记的地址中读取4字长的描述符,其中各字加载情况如下:
· Word [0] -> DDADRx寄存器;
· Word [1] -> DSADRx寄存器;
· Word [2] -> DTADRx寄存器;
· Word [3] -> DCMDx寄存器。
5)通道等待数据传输请求。
6)通道传输数据,数据量由DCMD[SIZE]和DCMD[LENGTH]较小者决定。
7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。
8)DDADR[STOP]被设置为1,通道运行终止,否则继续运行 。