eDMA是enhanced Direct Memory Access的简称,即增强型直接内存存取。它是用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输能力,能够满足实时处理中高速数据传输的要求。在ColdFire系列MCU中的MCF5329EVB平台上实现的音频系统,为了满足系统的实时性要求,采用eDMA来完成音频数据的传输。MCF5329EVB提供了一个eDMA控制器,可以满足大量数据的实时传送需求。
1 eDMA介绍
1.1 eDMA的结构
eDMA模块框图如图1所示。
从eDMA的模块结构图可以看出,eDMA模块包括两个主要模块:eDMA引擎和传输控制描述符TCD单元。其中,eDMA引擎的功能主要包括源地址和目的地址的计算和实际的数据搬移操作;TCD单元的功能是为每个通道定义传输的源地址和目的地址、次循环的大小、单次传输的字节量及传输方式等信息。
eDMA引擎由如下4个子模块组成:
①地址路径模块。执行传输控制描述符的2个通道(通道X和通道Y)的注册,并处理所有的总线地址计算。被注册的通道用于装载从传输控制描述符区域读取的传输控制描述符内容。
②数据路径模块。执行数据的读写,包括16字节的寄存器存储区域,并支持多种数据排列方式。
③编程模型/通道仲裁模块。执行eDMA编程模型和通道仲裁。eDMA外部请求输入和中断输出都连接到该模块。
④控制模块。提供所有针对eDMA引擎的控制功能,包括对数据读和写的匹配。如需要读取的源数据大小为16位,而目标数据大小为32位,则每2次读取只需要1次写入。
传输控制描述符区域由如下两部分组成:
①内存控制器。该逻辑执行必需的双向端口控制,处理eDMA引擎和内部外围总线的通道。
②内存阵列。TCD存储区是一个单端口同步的RAM阵列。每个通道都有1个TCD单元,每个TCD有32字节,由11个寄存器组成。
1.2 eDMA的操作
MCF5329的eDMA有16个数据传输通道,每一个通道由一个传输控制描述符TCD进行描述。TCD不仅记录了数据传输的源和目的地址,还记录了当前传输地址相对于起始地址的偏移。该偏移由一个主循环(maior loop)和一个次循环(minor loop)来表示。当一个通道在传输时,次循环中的数据传输完成之后,eDMA引擎中的当前源地址、目的地址和外循环的大小会被写回TCD存储区域,并执行通道连接的其他通道传输。每一个次循环执行完,当前外循环计数器就会减1;当外循环计数器减为O时,eDMA会向处理器发起一次中断请求,请求下一次eDMA传输的源和目的地址。一次主循环所能传送的最大字节数由用户所分配的eDMA缓冲区大小决定。
1.3 eDMA基本数据流
eDMA基本数据流可被划分为三段。
第一段是通道激活。以外围硬件请求激活通道为例,eDMA请求输入信号首先经由控制子模块进入编程模型和通道仲裁模块,确定采用固定优先级还是联合通道仲裁(固定优先级仲裁是先给具有最高优先级的通道服务,联合通道优先级是先给通道编号最大的通道服务);确定通道后,被确定的通道号通过地址路径模块发送并转换成需要的地址,用于在当地存储区域中存取传输控制描述符TCD;相应的描述符读取出来后被装载到地址路径模块中的通道X或通道Y寄存器中。
第二段是真正的数据传输。源数据被读取出来临时,存储在数据路径块中,然后在时钟的驱动下将数据写入到目标地址。整个读写过程持续到次循环数据结束。
第三段是TCD的更新和中断请求的发生。一旦一个次循环数据传输完毕,数据流就进入第三段。在该段中,地址路径逻辑会更新相应TCD中的特定区域,如源地址、目标地址和外循环计数。如果外循环计数减为O,则要进行额外的设置,包括最终地址调节。如果在此时有中断请求发生,需要重新读取一个新的TCD。