TLV320AIC23(以下简称AIC23)是TI推出的一款高性能的立体声音频Codec芯片,内置耳机输出放大器,支持MIC和LINE IN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AIC23的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。与此同时,AIC23还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。由于具有上述优点,使得AIC23是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3……)、录音机等数字音频领域。
AIC23的管脚和内部结构框图如下:
从上图可以看出,AIC23主要的外围接口分为以下几个部分:
一. 数字音频接口:主要管脚为
BCLK-数字音频接口时钟信号(bit时钟),当AIC23为从模式时(通常情况),该时钟由DSP产生;AIC23为主模式时,该时钟由AIC23产生;
LRCIN-数字音频接口DAC方向的帧信号(I2S模式下word时钟)
LRCOUT-数字音频接口ADC方向的帧信号
DIN-数字音频接口DAC方向的数据输入
DOUT-数字音频接口ADC方向的数据输出
这部分可以和DSP的McBSP(MulTI-channel buffered serial port,多通道缓存串口)无缝连接,唯一要注意的地方是McBSP的接收时钟和AIC23的BCLK都由McBSP的发送时钟提供,连接示意图如下:
二. 麦克风输入接口:主要管脚为
MICBIAS-提供麦克风偏压,通常是3/4 AVDD
MICIN-麦克风输入,由AIC结构框图可以看出放大器默认是5倍增益
连接示意图如下:
三. LINE IN输入接口:主要管脚为
LLINEIN-左声道LINE IN输入
RLINEIN-右声道LINE IN输入
连接示意图如下:
四. 耳机输出接口:主要管脚为
LHPOUT-左声道耳机放大输出
RHPOUT-右声道耳机放大输出
LOUT-左声道输出
ROUT-右声道输出
从框图可以看出,LOUT和ROUT没有经过内部放大器,所以设计中常用LHPOUT和RHPOUT,连接示意图如下:
五. 配置接口:主要管脚为
SDIN-配置数据输入
SCLK-配置时钟
DSP通过该部分配置AIC23的内部寄存器,每个word的前7bit为寄存器地址,后9bit为寄存器内容。具体方法和寄存器具体内容见后。
六. 其他:主要管脚为
MCLK-芯片时钟输入(12.288M、11.2896M、18.432M、16.9344M)
VMID-半压输入,通常由一个10U和一个0.1U电容并联接地
MODE-芯片工作模式选择,Master或者Slave
CS-片选信号(配置时有效)
CLKOUT-时钟输出,可以为MCLK或者MCLK/2(详见寄存器配置)
DSP与AIC23的连接
设计中DSP采用了TI的C5409,这是一款性价比高,外设资源丰富,耗电量低,处理能力强的16位DSP,在实际应用中较为流行。
C5409有三组可通过寄存器灵活配置的McBSP同步串口,与AIC23的连接主要使用这些串口。
一. 与AIC23数字音频接口的连接
AIC23的数字音频接口支持I2S模式(一种通用的音频格式),也支持DSP Mode模式(专为与TI的DSP连接模式)。两种模式的时序如下图:
I2S模式
DSP Mode模式
DSP与AIC23的连接可以采用I2S模式也可以采用DSP模式,区别仅在于DSP的McBSP帧信号的宽度。前者的帧信号宽度必须为一个字(16bit)长,而后者的帧宽度可以为一个bit长,比如在字长16bit(即左右声道的采样各为16bit),帧长为32bit的情况下,如果采用I2S,帧信号宽度应为16bit;而采用DSP Mode帧信号宽度1bit即可。
为了与AIC23通信,DSP的串口时钟也应该正确的设置。DSP的McBSP时钟为了减少外围电路通常都选择由内部CPU时钟分频得到,比如在AIC23采样速率为8K的情况下,McBSP串口时钟应为8×32=256K,这时,DSP工作时钟/256K=需要设置的分频因子。
需要注意的是,DSP的串口分频因子最大为0xff(256),所以如果采用内部时钟分频的办法,DSP工作时钟不能超过64M。
二.与AIC23配置接口的连接
AIC23的配置接口支持I2C模式,也支持SPI模式。通常比较简单的办法是利用DSP的一个McBSP用SPI模式跟AIC23连接。但是有些时候,如果DSP的McBSP串口资源比较紧张(比如需要跟近端RS-232和远端RS-485连接),也可以通过DSP模拟I2C总线与AIC23连接。下面简单介绍这两种方法:
SPI时序图如下:
这种模式的特点是只在片选信号有效时锁存进数据。由于也是同步串口,所以通过配置McBSP为Clock Stop Mode(时钟在帧信号有效时产生,其他时间没有时钟信号)可以无缝与之连接。这时,McBSP的帧信号连接SPI的CS信号,时钟和数据信号与SPI一一对应。这种连接只需设置McBSP的寄存器,使用比较简单可靠。
I2C时序图如下:
C5409没有I2C接口(TI的C5509有),但是可以利用DSP的GPIO(General Purpose Input/Output)来实现I2C时序。C5409有8个HPI(Host Port Interface)管脚可以选择作为GPIO使用(上电时HPIENA管脚或者HPI16管脚为低),这样我们可以利用其中的两个管脚来作为I2C中的SCL和SDA。在I2C中SDA是双向管脚,而DSP的GPIO的方向要通过寄存器来配置为输入或者输出,所以在实现I2C总线时,要经常在需要的时候变换GPIO(作为SDA的那个)的方向。对GPIO的操作是通过寄存器来完成:当设为输出时,向寄存器写入要输出的值;设为输入时,从该寄存器读入管脚上的值。
在实现I2C总线时,还需注意下面几点:作为SDA的那个GPIO应该接上拉电阻;AIC23只可写不可读;AIC23的设备地址当CS为低时是0011010b,CS为高时是0011011b。
DSP的软件设计
DSP需要处理来自和发向AIC23的数据,从而达到采集和播放声音。
从上面的分析我们知道,这些数据都是通过DSP的McBSP交换的。McBSP可以有三种方式跟CPU通信:每收到或发送一个单元,置标志位,CPU轮询此标志位;每收到或发送一个单元,给CPU发送中断;通过DMA收到或发送完一组单元,再给CPU中断。通常,为了减轻CPU负担,都采用第三种方法。
采用DMA的方式,即串口每发送或接受到一个单元,都会自动触发DMA将其搬送到一个内部的Buffer,等Buffer满了再通过中断方式告诉CPU处理。这时DMA最好采用ABU(Auto Buffering)模式,在这种模式下,DMA会在两个Buffer(其实是一个大Buffer的前一半和后一半)之间自动切换,每个Buffer满了(接收)或空了(发送)都会给CPU发出中断,在CPU处理这个Buffer的时候,DMA会自动去操作另一个Buffer。采用这种方式可以有效防止Buffer中的数据在串口速率较高时被新数据冲掉的问题。
在DMA的中断服务程序中为了可靠可以把这个Buffer的数据再拷贝到另一个待处理的空间,即两级Buffer,然后置标志位,CPU在主程序中查询标志位然后作出相应的处理。DMA操作的Buffer可以通过寄存器配置,Buffer的大小和起始位置应设置正确。在指定Buffer的起始位置时应该注意,起始位置应该为大于Buffer大小的下一个2的整数幂的倍数。例如,在8K、16bit采样的情况下,以20ms数据为Buffer大小,那么一次处理的数据是8000×32×0.02=5120bit=320word。所以,DMA的Buffer应为640word(两个320word Buffer)大小,而Buffer的起始地址应该为1024=2^10》640的整数倍,如0x7000,0x7400……
DSP与异步串口间的通信
DSP与PC机交换声音数据可以通过异步串口实现(近端RS-232或者远端RS-485再到RS-232)。下面简单介绍如何利用DSP的McBSP实现RS-232协议从而跟PC机的串口通信。
首先,因为McBSP和RS-232电平不同,之间需要加一个MAX232这样的电压转换芯片。同时,DSP的McBSP是一个三线同步串口,而RS-232只需一根数据线(单向)即可通信,所以在实现异步串口时,首先硬件连接应该如下:
从上图可以看出, McBSP串口的接收帧信号和接收数据线连在一起,这样做的目的是为了利用异步帧的开始位(低有效)来给McBSP一个帧信号。显然,这时DSP的帧信号应设置为低有效且接收延时应设置为‘1’。
同步-异步转换的基本原理就是对异步信号过采样得到同步信号,例如一般是对异步信号的每个bit用同步信号的一个字来表示(即16个‘1’-0xffff或16个‘0’-0x0000)。可参看下图(上边为异步信号,下边为同步信号):
串口的发送和接收都采用DMA方式,Buffer的大小为:1+8+1(无校验位,结束位长度为1)=10word。同步-异步具体转换在软件上实现:
对于发送来说,较为简单,就是对每一个Byte的每个bit用一个word(16bit)进行代替,加上开始位、结束位。然后判断是否可以发送(通过发送完毕标志),如果可以则把这10个word放入Buffer,启动DMA即可。在发送中断服务程序中需要作的是停止发送DMA,并置发送完毕标志有效。
接收相对发送麻烦一些,需要对接收到的每一个字进行判断从而恢复每一个bit,例如可以认为收到0000 1111 1111 0000b为‘1’,其余为‘0’。过滤掉开始位(‘0’)和结束位(‘1’),恢复的8个bit就合成一个Byte。这些应该在接收中断服务程序里面做。
还有就是同步串口时钟的选择,一定要稍大于设计速度,比如,在跟57.6K的RS-232通信时,时钟应该为57.6×16=921.6K,实际配置串口分频寄存器时应该稍大于这个速度,否则就可能由于没有正确检测到停止位而出现错误。
更详细的同步-异步转换设计流程跟我们的主题无关,有很多文章有具体的描述,这里就不主要讨论了。
至此,一个较为完整的系统就建立了。此系统可以完成对语音或者音频信号的采集和播放,同时通过DSP内部的压缩算法,如g.729或者MP3传给PC机进行储存和传输。
附录:
AIC23的内部寄存器中的一些主要设置bit:
1. LINE IN左声道音量控制寄存器:
LIM:静音
LIV【4:0】:音量控制
2. LINE IN右声道音量控制寄存器:
RIM:静音
RIV【4:0】:音量控制
3. 耳机左声道音量控制寄存器:
LHV【6:0】:音量控制
4. 耳机右声道音量控制寄存器:
RHV【6:0】:音量控制
5. 模拟通道控制寄存器
BYP:Bypass模式
INSEL:ADC输入选择,0-LINE IN、1-麦克风
MICM:麦克风静音
6. 数字通道控制寄存器
DACM:DAC静音
ADCHP:ADC高通滤波器开关选择
7. 省电控制寄存器
OFF:Device Power off
CLK:Clock Power off
OSC:Oscillator Power off
OUT:Outputs Power off
DAC:DAC Power off
ADC:ADC Power off
MIC:MIC Power off
LINE:LINE IN Power off
8. 数字接口格式寄存器:
MS:工作模式Master or Slave
LRSWAP:DAC左右声道交换
LRP:I2S模式下,LRCIN低左声道或右声道
DSP模式下,MSB在LRCIN有效后1st或者2nd BCLK沿出现
IWL【1:0】:采样Bit长度
FOR【1:0】:DSP格式,即帧信号后跟左右声道两个字
I2S格式,帧信号占空比50%,高低各是左右声道
9. 采样率寄存器:
CLKIN:时钟输入选择,0-MCLK,1-MCLK/2
CLKOUT:时钟输出选择,0-MCLK,1-MCLK/2
10. 数字接口激活寄存器:
ACT:激活开关
11. Reset寄存器
RES:写入0重启