eDMA是enhanced Direct Memory Access的简称,即增强型直接内存存取。它是用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输能力,能够满足实时处理中高速数据传输的要求。在ColdFire系列MCU中的MCF5329EVB平台上实现的音频系统,为了满足系统的实时性要求,采用eDMA来完成音频数据的传输。MCF5329EVB提供了一个eDMA控制器,可以满足大量数据的实时传送需求。
1 eDMA介绍
1.1 eDMA的结构
eDMA模块框图如图1所示。
图1 eDMA模块结构图
从eDMA的模块结构图可以看出,eDMA模块包括两个主要模块:eDMA引擎和传输控制描述符TCD单元。其中,eDMA引擎的功能主要包括源地址和目的地址的计算和实际的数据搬移操作;TCD单元的功能是为每个通道定义传输的源地址和目的地址、次循环的大小、单次传输的字节量及传输方式等信息。
eDMA引擎由如下4个子模块组成[1]:
① 地址路径模块。执行传输控制描述符的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不仅记录了数据传输的源和目的地址,还记录了当前传输地址相对于起始地址的偏移。该偏移由一个主循环(major loop)和一个次循环(minor loop)来表示。当一个通道在传输时,次循环中的数据传输完成之后,eDMA引擎中的当前源地址、目的地址和外循环的大小会被写回TCD存储区域,并执行通道连接的其他通道传输。每一个次循环执行完,当前外循环计数器就会减1;当外循环计数器减为0时, eDMA会向处理器发起一次中断请求,请求下一次eDMA传输的源和目的地址。一次主循环所能传送的最大字节数由用户所分配的eDMA缓冲区大小决定。
1.3 eDMA基本数据流
eDMA基本数据流可被划分为三段。
第一段是通道激活。以外围硬件请求激活通道为例,eDMA请求输入信号首先经由控制子模块进入编程模型和通道仲裁模块,确定采用固定优先级还是联合通道仲裁(固定优先级仲裁是先给具有最高优先级的通道服务,联合通道优先级是先给通道编号最大的通道服务);确定通道后,被确定的通道号通过地址路径模块发送并转换成需要的地址,用于在当地存储区域中存取传输控制描述符TCD;相应的描述符读取出来后被装载到地址路径模块中的通道X或通道Y寄存器中。
第二段是真正的数据传输。源数据被读取出来临时存储在数据路径块中,然后在时钟的驱动下将数据写入到目标地址。整个读写过程持续到次循环数据结束。
第三段是TCD的更新和中断请求的发生。一旦一个次循环数据传输完毕,数据流就进入第三段。在该段中,地址路径逻辑会更新相应TCD中的特定区域,如源地址、目标地址和外循环计数。如果外循环计数减为0,则要进行额外的设置,包括最终地址调节。如果在此时有中断请求发生,需要重新读取一个新的TCD。
2 TLV320DAC23介绍
TLV320DAC23是TI公司推出的一颗高性能立体声音频编解码(CODEC)芯片[2],采样率可以从8 kHz到96 kHz,传输字长可自由选择为16位、20位、24位或32位;最大输出信噪比可达到100 db;控制端口可兼容SPI、2wire等协议;回放模式下功率为 18 mW,省电模式下小于15 μW。该芯片适用于便携式设备的数字音频处理。
(1) 控制接口
控制接口用于对器件TLV320DAC23的寄存器编程,以及设置音频芯片的工作参数。它兼容两种模式:SPI三线模式、2wire模式。
MODE: 模式选择。MODE为0时采用2wire模式,为1时采用SPI模式。
SCLK: 控制端口串行数据时钟。
SDIN: 控制端口串行数据输入。
CS控制端口输入锁存/地址选择。SPI模式下,CS用于数据锁存控制,2wire模式下,CS定义器件地址域的第7位。SPI模式下,1个控制字为16位: 高7位为控制地址,低9位为控制字。16位的控制字由MSB位开始传输,每位在SCLK的上升沿被锁存,整个16位的控制字在最低位被CS锁存进TLV320DAC23。
(2) 数字音频接口
数字音频接口用于输入TLV320DAC23的D/A数据。
BCLK: I2S串行比特时钟。主模式时BCLK为输出,从模式时BCLK为输入。
DIN: I2S串行数据输入。
DOUT: I2S串行数据输出。
LRCIN/LRCOUT: 字时钟输入/输出信号,两个信号共有的帧信号。在主模式中由DAC23产生该信号,在从模式中由主设备(如DSP或MCU)产生该信号。TLV320DAC23支持4种音频接口模式: 右对齐模式、左对齐模式、I2S模式、DSP模式。这4 种模式都是最高有效位MSB在前,字长16~32 位(右对齐除外,它不支持32 位) 。
(3) 时钟接口
MCLK: 芯片主时钟信号。当TLV320DAC23作为主设备时,该信号由芯片自身产生;当TLV320DAC23作为从设备时,该信号由外部产生。
CLKOUT:时钟输出信号。可以为MCLK或MCLK/2。
3 音频驱动设计
TLV320DAC23与MCF5329之间的音频数据传输采用I2S音频格式,由MCF5329的同步串行接口SSI实现与TLV320DAC23的数据传输。MCF5329处理器内核与同步串行接口SSI发送/接收寄存器之间的音频数据传输采用eDMA机制传输,由MCF5329中的eDMA模块实现。
3.1 硬件连接
TLV320DAC23与MCF5329的接口有两个:一个是控制接口,用于设置TLV320DAC23的寄存器,从而设置它的工作参数;一个是数字音频接口,用于传输TLV320DAC23的音频数据并控制数据的时序。本设计采用由MCF5329提供的时钟信号,所以将MCF5329设为主设备,TLV320DAC23作为从设备。音频数据采用I2S音频格式传输,控制字通过SPI接口传输。具体连接如图2所示。
图2 MCF5329与TLV320DAC23的连接
3.2 软件设计
(1) 设备的初始化
同步串行接口SSI的初始化包括对控制寄存器、传输配置寄存器和接收配置寄存器、时钟配置寄存器、发送时隙掩码寄存器和接收时隙掩码寄存器以及中断允许寄存器的配置。最后设置中断源和中断级别。
eDMA的初始化包括eDMA与同步串行接口SSI发送/接收寄存器连接的配置,以及确定eDMA的通道仲裁方式。
具体代码如下:
void init_dma(void) {
MISCCR&= ~ MISCCR_TIM_DMA
/*设置SSI与DMA通道相连接*/
eDMA_CR = 0;/*使用确定优先级仲裁*/
}
TLV320DAC23的初始化主要是通过SPI接口设置编解码芯片控制接口相关的寄存器。初始化设置为I2S从模式,输入字长32位,高位先,设置采样率8 kHz。设置完后激活数字接口。
(2) 数据的传输
完成设备的初始化后,就要设置传输控制描述符TCD的相关寄存器以控制eDMA的传输。以音频驱动中的放音过程为例,该过程的音频数据由处理器内核传送到SSI发送寄存器。音频数据分为左右2个声道,所以启动2个eDMA通道——通道11和通道12——负责传送数据。设置次循环的大小为4字节,由于是2个通道传输,所以1次次循环共8字节。若一次主循环需要传完的数据为count字节,那么设置主循环中包含的次循环数为count/8。最后允许通道12的主循环中断,并开启2个通道,开始传输。下面以通道11为例来说明eDMA的设置流程(TCD代表通道11):
/*设置源地址为内核中的缓冲区*/
TCD_SADDR(TCD) =
&(audio_device>audio_buf[start]);
/*设置目的地址为SSI发送寄存器*/
TCD_DADDR(TCD) = & SSI_TX0;
/*设置次循环每次传输的字节为4*/
TCD_ATTR(TCD) =TCD_ATTR_SSIZE_32BIT
| TCD_ATTR_DSIZE_32BIT;
TCD_NBYTES(TCD) = 4;
/*设置下一个次循环源地址相对于当前次循环源地址的偏移量为8*/
TCD_SOFF(TCD) = 8;
/*设置下一个主循环源地址相对于当前主循环源地址的偏移量为0*/
TCD_SLAST(TCD) = 0;
/*设置下一个次循环目的地址相对于当前次循环目的地址的偏移量为0*/
TCD_DOFF(TCD) = 0;
/*设置下一个主循环源地址相对于当前主循环源地址的偏移量为0*/
TCD_DLAST_SGA(TCD) = 0;
/*设置主循环中包含的次循环数为count/8*/
TCD_CITER(TCD) = TCD_CITER_CITER(count/8);
TCD_BITER(TCD) = TCD_BITER_BITER(count/8);
ERQ |= (1<< TCD)
/*启动通道传输*/
TCD_CSR(TCD) |= TCD_CSR_START ;
通道12的设置基本与通道11相同,只有一点不同,就是在开启通道12传输的同时允许通道12的大循环中断。音频驱动中的录音过程与放音过程eDMA设置相似,只是音频数据的传送方向是由SSI接收寄存器传输到处理器内核。
设计完成后的音频驱动经测试,在系统任务繁重的情况下(例如MP3文件解码并实时播放),仍然可以完成正常语音播放,效果良好。
结语
本文分析了一种增强型直接内存存取eDMA的访问机制,并通过实例阐述了eDMA的典型应用。eDMA模块加快了数据传输的速度,减少了CPU的干预。并且它在TCD中设置了主循环和次循环传输,从而增强了单次单通道的传输数据量,也增强了传输的灵活性。