资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,单击此处编辑母版标题样式,第5章 立体声芯片TLV320AIC23的应用,单击此处编辑母版标题样式,第5章 立体声芯片TLV320AIC23的应用,第5章 立体声芯片TLV320AIC23 应用,5.1,TLV320AIC23芯片介绍,5.2,TLV320AIC23应用试验,第1页,5.1.1 TLV320AIC23特点介绍,TLV320AIC23是TI企业生产含有高度完整模拟功效高性能立体声音频编解码芯片,数/模转换和模/数转换采取采样数字插值滤波器,转换数据长度能够是16、20、24和32位,采样速率8 kHz96 kHz。TLV320AIC23是便携数字音频播放和录音设备理想模拟输入/输出芯片,其主要特点有:,5.1 TLV320AIC23芯片介绍,第2页,高性能立体声编解码芯片。90 dB信噪比A/D转换器(采样频率48 kHz);100 dB信噪比D/A转换器(采样频率48 kHz);1.423.6 V数字内核供电,和TI企业DSP内核供电电压兼容;2.73.6 V缓冲和模拟供电;896 kHz采样速率。,第3页,软件控制经过TI McBSP支持各种串行通信协议。兼容2线和SPI串行通信协议;能直接和TI McBSPs相连。,第4页,音频数据输入/输出是可编程音频接口,兼容TI McBSP。I2C兼容协议只需要一个McBSP为A/D和D/A进行通信;标准I2C,高位或低位数据填充传输;16/20/24/32位数据长度。,第5页,含有完整驻极体麦克风偏置电路和缓冲。低噪声麦克风偏置引脚为驻极体电容提供偏置电压,其经典值等于3/4AVDD;有可调、增益为15运放缓冲器;控制存放器可选择增益为0 dB或20 dB。,第6页,立体声输入。可编程增益;有模拟旁路。A/D转换器有多个输入,能够是立体声道或麦克风。立体声输出。注:模拟混合器能够把D/A转换器和模拟旁路混合起来。模拟量控制能够禁止。,第7页,高效率耳机放大器。模拟供电电压为3.3 V时,负载为32,输出功率为30 mW。灵活电源管理,全部能够软件控制。在回放模式功耗23 mW;备用模式功耗小于150 W;掉电模式小于15 W。,第8页,5.1.2 TLV320AIC23芯片内部结构框图和引脚安排1.TLV320AIC23芯片内部结构,TLV320AIC23芯片内部结构框图如图5-1所表示。,第9页,图5-1 TLV320AIC23芯片内部结构框图,第10页,2.TLV320AIC23引脚安排,TLV320AIC23芯片引脚安排如图5-2所表示。表5-1 给出了TLV320AIC23芯片引脚功效,可参阅参考文件10。,第11页,图5-2 PW封装引脚安排,第12页,表5-1 TLV320AIC23芯片引脚功效说明,第13页,第14页,5.1.3 TLV320AIC23与C5509硬件连接,TLV320AIC23与C5509硬件连接如图5-3所表示。J5为麦克风输入,J6为立体声线性输入,J7为耳机输出,J8为立体声线性输出。在模拟电路设计部分,麦克风输入信号经过电容C52、C55和电阻R75组成滤波电路;立体声线性输入使用1/2分压电路和隔直流电容;耳机线和音频线输出使用电容进行隔直流。,第15页,图5-3 TLV320AIC23与C5509硬件连接图,第16页,AIC23控制接口和C5509I2C接口相连,将AIC23串行控制接口模式设成I2C模式,即22脚经过一个电阻后接地。数据输出/输入接口和C5509McBSP0相连接。,第17页,5.2.1 试验目标,了解C55x DSP I2C接口、McBSP接口。了解立体声芯片TLV320AIC23。学习I2C接口、McBSP接口、AIC23初始化;学习中止处理。,5.2 TLV320AIC23应用试验,第18页,5.2.2 试验设备,PC兼容机一台;操作系统为Windows(或WindowsNT 4.0、Windows 98、Windows XP);计算机已经安装CCS v3.1集成环境软件。DSP仿真器ICETEK-5100USB V2.0A一个;DSP目标板ICETEK-VC5509-A一块。麦克风、耳机及对应音频线若干。,第19页,5.2.3 试验要求,用CCS集成仿真环境完成建立工程、源文件和命令文件,保留和添加文件到工程,编译、链接、运行和调试等。使用不一样视窗观察存放器和存放器空间数据内容以及输出波形时域和频域图等。,第20页,5.2.4 试验步骤,1.试验准备,参考第2章(若使用仿真器不一样,请参考其它相关资料)对CCS硬件仿真进行设置;在断电情况下将仿真器和目标板相连,再将仿真器和计算机相连。,第21页,将音频线连接,一端接到目标板音频输入端J6,另一端接到电脑声卡输出端或别音频输出端。将麦克风接到麦克风输入端子J5;将耳机线接到耳机输出端子J7;给目标板供上电,开启CCS,使用CCS连接仿真器。,第22页,2.新建立工程和对应源文件、命令文件,新建五个.asm汇编源文件和一个命令文件(这些文件名读者能够自己命名,也能够参考图5-4进行命名),其中除了在本章5.2.5小节中四个.asm程序和一个命令文件外,还含有在第2章2.2.5小节中“2.SDRAM.asm初始化程序”。分别输入这些程序,保留这些文件并把它们添加到工程项目中,如图5-4所表示。,第23页,图5-4 工程界面,第24页,3.编译链接工程,对工程进行编译链接。在编译链接过程中假如有错误,需要进行修改,直至无错误提醒信息为止。编译成功后,装载输出文件。,4.全速运行程序,在主菜单中选择DebugRun 命令(也能够点击或按F5键),运行程序。使用电脑播放器播放音乐,戴上耳机,能够听到音乐和麦克风声音。,第25页,5.观察音频信号时域图,在主菜单中选择DebugHalt命令(也能够点击 或按Shift+F5键),暂停观察某一时刻波形。从CCS View观察窗打开图形属性对话框,如图5-5所表示,参考其对话框进行对应修改,修改好后点击OK确认,则能够看到如图5-6所表示波形图,图形上半部分为左声道声音波形,下半部分为右声道声音波形。,第26页,图5-5 图形属性对话框,第27页,图5-6 图形观察窗口中左、右声道声音波形,第28页,5.2.5 参考程序清单1.主程序,.mmregs.def _c_int00;定义符号_c_int00为主程序入口.def mcbsp0_init;定义McBSP0接口初始化子程序 入口.def data_w_r;定义变量data_w_r.ref sdram_init;引用外部符号sdram_init为 SDRAM初始化子程序入口.ref i2c_init;引用外部符号i2c_init为I2C初始 化子程序入口,第29页,.ref i2c_disable;引用外部符号i2c_disable.ref i2c_write;引用外部符号i2c_write为总线写.ref i2c_read;引用外部符号i2c_read为总线读.ref clkmd_init;引用外部符号clkmd_init为时钟模块初 始化子程序入口.ref aic23init;引用外部符号aic23init为AIC23模块初 始化子程序入口,第30页,mcbsp0_pdp.set 2800h/128;McBSP0存放器所在数据 页地址drr2.set 0h;数据接收存放器2 drr1.set 1h ;数据接收存放器1dxr2.set 2h ;数据发送存放器2dxr1.set 3h ;数据发送存放器1 spcr2.set 4h ;串口控制存放器2,第31页,spcr1 .set 5h ;串口控制存放器1rcr2 .set 6h ;接收控制存放器2rcr1.set 7h ;接收控制存放器1xcr2.set 8h ;发送控制存放器2xcr1.set 9h ;发送控制存放器1 srgr2.set 0ah ;采样率产生存放器2srgr1.set 0bh ;采样率产生存放器1mcr2.set 0ch ;多通道控制存放器2,第32页,mcr1.set 0dh ;多通道控制存放器1rcera.set 0eh ;接收通道使能存放器A区rcerb.set 0fh ;接收通道使能存放器B区xcera.set 10h ;发送通道使能存放器A区xcerb.set 11h ;发送通道使能存放器B区pcr.set 12h ;引脚控制存放器rcerc.set 13h ;接收通道使能存放器C区rcerd.set 14h ;接收通道使能存放器D区,第33页,xcerc.set 15h ;发送通道使能存放器C区xcerd.set 16h ;发送通道使能存放器D区rcere.set 17h ;接收通道使能存放器E区rcerf.set 18h ;接收通道使能存放器F区xcere.set 19h ;发送通道使能存放器E区xcerf.set 1ah ;发送通道使能存放器F区rcerg.set 1bh ;接收通道使能存放器G区rcerh.set 1ch ;接收通道使能存放器H区,第34页,xcerg.set 1dh ;发送通道使能存放器G区xcerh.set 1eh ;发送通道使能存放器H区spcr1_rrdy.set 02h;串口控制存放器对应位length .set 256;16位左(右)声道循环缓冲 区长度 .bss data_w_r,2;为变量预留2字空间.bss left,512;为左声道预留512字空间.bss right,512;为右声道预留512字空间,第35页,STACK .usect“.stack”,200h;为数据堆栈预留 512个字空间SYSSTACK.usect“.sysstack”,200h;为系统堆栈预留 512个字空间.sect.vectorsrsv:;reset vector B _c_int00 ;branch to C entry point NOP .align 8.text,第36页,_c_int00:amov#0,xdp ;数据页指针xdp指 向(零页)CPU存放 器映射存放器amov#STACK+200h,xsp ;指针xsp指向数据 堆栈底部amov#SYSSTACK+200h,xssp ;指针xssp指向系统 堆栈底部;init interruptbset intm ;colse interupt(关全 局中止),第37页,mov#1,ivpd;DSP中止矢量指针ivpdmov#1,ivph;DSP中止矢量指针ivphmov#00h,ier0;清中止使能存放器ier0mov#00h,dbier0;清调试中止使能存放器dbier0mov#0,ier1;清中止使能存放器ier1mov#0ffffh,ifr0;清中止标志存放器ifr0mov#0ffffh,ifr1;清中止标志存放器ifr1call sdram_init;调用SDRAM初始化子程序call clkmd_init;调用时钟模块初始化子程序,第38页,call i2c_init;调用I2C初始化子程序call aic23init;调用AIC23初始化子程序call mcbsp0_init;调用McBSP0初始化子程序mov#mcbsp0_pdp,pdp;当前数据页指向McBSP0存放器wait_rx:btst#spcr1_rrdy,port(spcr1),tc1;测试串口控制存放器RFULL位状态送tc1,第39页,bcc wait_rx,!tc1;判断接收器是否满,若tc1=1,则接收器满,有新数据;未读,能够接收数据,不然tc1=0,等候mov port(drr2),ac1;从DR引脚接收左声道16位数据mov port(drr1),ac0从DR引脚接收右声道16位数据 mov ac0,port(dxr1);向DX引脚发送右声道16位数据mov ac1,port(dxr2);向DX引脚发送左声道16位数据amov#left+length-1,xar6;让xar6指向左声道数据空间尾地址rpt#length-1;左声道每个数据依次向下一个地址复制,第40页,delay*ar6-amov#left,xar6;让xar6指向左声道数据空间首地址mov ac1,*ar6;左声道输入新数据amov#right+length-1,xar7;让xar7指向右声道数据空间尾地址rpt#length-1;右声道每个数据依次向下一个地址复制delay*ar7-amov#right,xar7;让xar7指向右声道数据空间首地址,第41页,mov ac0,*ar7;右声道输入新数据b wait_rx;循环准备再次传送数据ends:b$mcbsp0_init:;slave modeamov#0,xdpmov#mcbsp0_pdp,pdp,第42页,mov#0,port(spcr1);Put the McBSP0 in resetmov#0,port(spcr2)mov#0a0h,port(xcr1);Config frame parameters 32 bit mov#0h,port(xcr2);Single phase,no delaymov#0a0h,port(rcr1);Config frame parameters 32 bit mov#0h,port(rcr2);Single phase,no delay,第43页,Frame sync is active highmov#03h,port(pcr);data clocked on rising edge of clkxmov#01h,port(spcr1);Out of reset,RRDY=1mov#01h,port(spcr2);XRDY=1ret.end,第44页,2时钟模式存放器CLKMD初始化程序,.def pllmult.def clkmd_init .mmregsclkmd.set 0 x1c00;时钟模式存放器地址clk_in.set 12cpu_clk.set 144pllmult.set cpu_clk*2/clk_in;pllmult=31,第45页,ress.set 015iai.set 0b14iob.set 1b13test.set 0b12pll_mult.set 00000b7pll_div.set 01b5;Divide by 2pll_enable.set 0b4bypass_div.set 00b2,第46页,breakln .set 0b1lock_b.set 0b31,plmult=31min ac1,ac0or#k_clkmd,ac0,第49页,mov ac0,port(*ar1)mov port(*ar1),ac0or#10h,ac0;pll_enable=1mov ac0,port(*ar1)rpt#30000nop_16nop,第50页,loop2:mov port(*ar1),ar0;Read clkmdand#1,ar0 bcc loop2,ar0!=#1;lock_b=0?ret.end,第51页,3C5509 I2C接口初始化程序,.mmregs.def i2c_init.def i2c_disable.def i2c_write.def i2c_read .ref pllmulticoar.set0 x3c00;I2C主地址存放器icimr.set0 x3c01;I2C中止屏蔽存放器icstr.set0 x3c02;I2C状态存放器,第52页,icclkl.set0 x3c03;I2C时钟驱动存放器低位icclkh.set0 x3c04;I2C时钟驱动存放器高位iccnt.set0 x3c05;I2C数据计数器icdrr.set0 x3c06;I2C数据接收存放器icsar.set0 x3c07;I2C从地址存放器icdxr.set0 x3c08;I2C数据发送存放器icmdr.set0 x3c09;I2C模式存放器icivr.set0 x3c0a;I2C中止矢量存放器icgpio.set0 x3c0b;保留位(通用I/O),第53页,icpsc.set0 x3c0c;I2C预定标存放器;bit of i2c mode registericmdr_free.set 14icmdr_stt.set 13icmdr_idleen.set 12icmdr_stp.set 11icmdr_mst .set 10icmdr_trx .set 9icmdr_xa .set 8icmdr_rm .set 7,第54页,icmdr_dlb.set 6icmdr_irs .set 5icmdr_stb .set 4icmdr_fdf.set 3icmdr_bc_mask.set 0;bit of i2c status registericstr_nacksnt.set 13icstr_bb .set 12icstr_rsfull .set 11,第55页,icstr_xsmt .set 10icstr_aas .set 9icstr_ad0.set 8icstr_res2 .set 7icstr_res1 .set 6icstr_res0 .set 5icstr_xrdy .set 4icstr_rrdy .set 3icstr_ardy .set 2icstr_nack .set 1,第56页,icstr_al .set 0icoar_oaddr .set 0 x007f.texti2c_init:mov#icoar/128,pdp;I2C主地址存放器页地址送pdp作为当前页 mov#0h,port(icmdr);Clear icmdrmov#0,port(icimr);Disable all interrupt,第57页,;module clock frequncy=cpu_clk/(ipsc+1)mov#pllmult,ar0mov#31,ar1;If pllmult31,plmult=31min ar1,ar0mov ar0,port(icpsc),第58页,;master clock frequeny=module clock frequnecy/(icclkl+d)+(icclkh+d)mov#10,port(icclkl)mov#10,port(icclkh)mov#icoar_oaddr,port(icoar);icmdr_irs=1,icmdr_mst=1,第59页,;Take I2C controller out of reset,put in master mode mov port(icmdr),ac0or#1#icmdr_irs,ac0or#1#icmdr_mst,ac0mov ac0,port(icmdr)ret,第60页,i2c_disable:;Put I2C controller in reset mov#icoar/128,pdpmov port(icmdr),ac0 mov#1#icmdr_irs,ac1neg ac1and ac1,ac0 mov ac0,port(icmdr)ret,第61页,i2c_write:;Write data to slave device;ar0 is stored counter of data;ar1 is stored first data address;ar2 is stored slave addressmov#icoar/128,pdpmov ar0,port(iccnt),第62页,add ar1,ar0;ar0 point to the endmov ar2,port(icsar);Slave device addressamov#icdxr,xar3mov port(icmdr),ac0bset#icmdr_stt,ac0;Start bit=1bset#icmdr_stp,ac0;Stop bit=1bset#icmdr_trx,ac0;Transmitter mode bit=1,transmitter modemov ac0,port(icmdr),第63页,tx_data:mov*ar1+,port(*ar3)wait_tx:btst#icstr_xrdy,port(icstr),tc1bcc wait_tx,!tc1;tc1=0,waitcmp ar0!=ar1,tc1 bcc tx_data,tc1ret,第64页,i2c_read:;read data to slave device;ar0 is stored counter of data;ar1 is stored first data address;ar2 is stored slave addressmov#icoar/128,pdpmov ar0,port(iccnt)add ar1,ar0;ar0 point to the end,第65页,mov ar2,port(icsar);Slave device addressamov#icdrr,xar3mov port(icmdr),ac0bset#icmdr_stt,ac0;Start bit=1bset#icmdr_stp,ac0;stop bit=1bclr#icmdr_trx,ac0;transmitter mode bit=0,receive modemov ac0,port(icmdr),第66页,read_data:mov port(*ar3),*ar1+wait_read:btst#icstr_xrdy,port(icstr),tc1bcc wait_read,!tc1;tc1=0,waitcmp ar0!=ar1,tc1 bcc read_data,tc1ret.end,第67页,4.aic23初始化程序,.def aic23init.ref i2c_write.ref data_w_r;bit15-bit9AIC23_LT_LINE_CTL.set 0 x0;左声道(输入数据空间)控制存放器地址AIC23_RT_LINE_CTL.set 0 x1;右声道(输入数据空间)控制存放器地址,第68页,AIC23_LT_HP_CTL.set 0 x2;左耳机声道(输入数据空间)控制存放器地址AIC23_RT_HP_CTL.set 0 x3;右耳机声道(输入数据空间)控制存放器地址AIC23_ANALOG_AUDIO_CTL.set 0 x4;模拟通道控制存放器地址AIC23_DIGITAL_AUDIO_CTL.set 0 x5;数字通道控制存放器地址AIC23_POWER_DOWN_CTL.set 0 x6;电源控制存放器地址,第69页,AIC23_DIGITAL_IF_FORMAT.set 0 x7;数字音频接口格式化存放器地址AIC23_SAMPLE_RATE_CTL.set 0 x8;采样率控制存放器地址AIC23_DIG_IF_ACTIVATE.set 0 x9;数字接口有效存放器地址AIC23_RESET_REG.set 0 x0f;Writing 0 to this reg triggers reset;bit8-bit0,第70页,lt_ch_vol_ctrl.set 0 x0017;0 rt_ch_vol_ctrl.set 0 x0017;1 lt_ch_headph_ctrl.set 0 x007f;2 rt_ch_headph_ctrl.set 0 x007f;3 alog_au_path_ctrl.set 0 x0031;4 digi_au_path_ctrl.set 0 x0000;5 pow_mgt_ctrl_ctrl.set 0 x0000;6 digi_au_intf_ctrl.set 0 x0043;7,第71页,au_FS_TIM_ctrl.set 0 x0023;8 MCLK=12MHz,Sample Rate setting 44.1kHz digi_intf1_ctrl.set 0 x0001;9 slave_aic23.set 0011010b;cs=0.textaic23init:;i2c write AIC23 register,第72页,;Reset the AIC23 mov#AIC23_RESET_REG*512,ac0add#0h,ac0call aic23_write,第73页,;turn on all powermov#AIC23_POWER_DOWN_CTL*512,ac0add#pow_mgt_ctrl_ctrl,ac0call aic23_write,第74页,;DAC enable,insel line,Microphone normalmov#AIC23_ANALOG_AUDIO_CTL*512,ac0add#alog_au_path_ctrl,ac0call aic23_write;seting Digital Audio Path Controlmov#AIC23_DIGITAL_AUDIO_CTL*512,ac0add#digi_au_path_ctrl,ac0call aic23_write,第75页,;Turn on volume for line inputsmov#AIC23_LT_LINE_CTL*512,ac0add#lt_ch_vol_ctrl,ac0call aic23_writemov#AIC23_RT_LINE_CTL*512,ac0add#rt_ch_vol_ctrl,ac0call aic23_write,第76页,;Configure the AIC23 for master mode,16 bit samples,DSP modemov#AIC23_DIGITAL_IF_FORMAT*512,ac0add#digi_au_intf_ctrl,ac0call aic23_write;44.1 kHz stereomov#AIC23_SAMPLE_RATE_CTL*512,ac0add#au_FS_TIM_ctrl,ac0call aic23_write,第77页,;Turn on headphone volume and digital interfacemov#AIC23_LT_HP_CTL*512,ac0add#lt_ch_headph_ctrl,ac0call aic23_writemov#AIC23_RT_HP_CTL*512,ac0add#rt_ch_headph_ctrl,ac0call aic23_write,第78页,;Turn on digital interfacemov#AIC23_DIG_IF_ACTIVATE*512,ac0add#digi_intf1_ctrl,ac0call aic23_writeret,第79页,aic23_write:amov#data_w_r,xar1;ar1 is stored first data addressmov ac0#-8,*ar1+mov ac0,*ar1-mov#2,ar0;ar0 is stored counter of datamov#slave_aic23,ar2;ar2 is stored slave addresscall i2c_writeret.end,第80页,5.命令文件,-stack 200h-sysstack 200h MEMORY PAGE 0:MMR :origin=0000000h,length=00000c0h SPRAM :origin=00000c0h,length=0000040hVECS :origin=0000100h,length=0000100h,第81页,DARAM0 :origin=0000200h,length=0001E00hDARAM1 :origin=000h,length=000hDARAM2 :origin=0004000h,length=000hDARAM3 :origin=0006000h,length=000hDARAM4 :origin=0008000h,length=000h DARAM5 :origin=000a000h,length=000hDARAM6 :origin=000c000h,length=000hDARAM7 :origin=000e000h,length=000h,第82页,
展开阅读全文