********************************************************************************** * aic23mic.asm v1.00 数字录音机主程序 * * 版权(c) 2004- 北京百科融创科技有限公司 * * 设计者: 赵治心 * * 邮箱: ourui.wl@263.net * **********************************************************************************/ .title "AIC23.asm" .mmregs .bss timetemp,1 .bss addrtemp,1 audio_in .usect "buf",0C000h ;定义MCBSP0的各个寄存器 bsp0 .set 39h drr20 .set 20h drr10 .set 21h dxr20 .set 22h dxr10 .set 23h spsa0 .set 38h spcr10 .set 00h spcr20 .set 01h rcr10 .set 02h rcr20 .set 03h xcr10 .set 04h xcr20 .set 05h srgr10 .set 06h srgr20 .set 07h pcr0 .set 0eh cpldport1 .set 2000h .def _c_int00,_McBSP_txisr,_McBSP_rvisr .data audio_table: .word 07ff5H,05842H,0fcdcH,0a34dH,0800bH,0a7beH,0324H,05cb3H .word 07ff5H,05842H,0fcdcH,0a34dH,0800bH,0a7beH,0324H,05cb3H .text _c_int00: stm #7000h,swwsr ;等待0个时钟 ssbx intm STM #0b, CLKMD ;switch to DIV mode TstStatu: LDM CLKMD, A AND #01b, A ;poll STATUS bit BC TstStatu, ANEQ STM #0100001111101111b, CLKMD ;switch to PLL RPT #10000 NOP rsbx cpl ;清CPL位=0 ;初始化cpu完毕,开始初始化MCBSP0 stm #216ch,pmst stm #0020h, imr stm #0020h, ifr stm #0000h,ar1 portw ar1,cpldport1 ;切换字写到CPLD控制寄存器,转为控制字输出 rpt #400 nop ;等400个周期 ld #00h,dp stm #spcr10,spsa0 ;接收复位 stm #0000h,bsp0 stm #spcr20,spsa0 ;发送、采样、帧复位 stm #0000h,bsp0 stm #spcr10,spsa0 ;12、11位为10,进入SPI模式,7位(DXENA)为0,不起动DX延时 stm #1000h,bsp0 stm #pcr0,spsa0 ;1位置1,数据下沿发送上沿接收,3位置1,帧同步为低电平有效,9位置1?BLCK输出,11位置1,BFSX脚为高电浇 stm #0a0ah,bsp0 stm #srgr10,spsa0 ;7~0位置64h(100),100分频 stm #0064h,bsp0 stm #srgr20,spsa0 ;13位置1,时钟源于CPU,12位置0,发送帧同步 stm #2000h,bsp0 stm #rcr10,spsa0 ;14~8位置0,一帧一个字,7~5位为010,一个字16位 stm #0040h,bsp0 stm #rcr20,spsa0 ;15位置0,单阶段帧,1、0位置01保证SPI正常工作 stm #0001h,bsp0 stm #xcr10,spsa0 ;14~8位置0,一帧一个字,7~5位为010,一个字16位 stm #0040h,bsp0 stm #xcr20,spsa0 ;15位置0,单阶段帧,1、0位置01保证SPI正常工作 stm #0001h,bsp0 stm #spcr20,spsa0 ;6位GRST为1,采样脱离复位,FRST是否要脱离复位? orm #0040h,bsp0 rpt #400 ;等两个以上位时钟 nop stm #spcr10,spsa0 ;接收离开复位 orm #0001h,bsp0 stm #spcr20,spsa0 ;发送离开复位 orm #0001h,bsp0 rpt #400 nop ;MCBSP0初始化为SPI模式完毕,开始初始化AIC23为BYPASS模式 ld #0h,dp write_cpld1: ld #0000h,A stm #0001h,ar2 rpt #10 nop portw *(8h),cpldport1 ;切换字写到CPLD控制寄存器,转为控制字输出 rpt #400 ;等400个周期 nop portr cpldport1,ar2 rpt #400 nop bitf ar2,#0001h bc write_cpld1,tc ;切换CPLD,使MCBSP0与AIC23的SPI口连接 delay15s: nop ;初始化AIC23为DAC、ADC、CLKOUT、DSP模式结束 stm #1e00h,dxr10 rpt #3000 nop stm #05ffh,dxr10 ;过零侦测开,音量为6dB rpt #3000 ;延时等待数据传送完毕 nop stm #07ffh,dxr10 ;过零侦测开,音量为6dB rpt #3000 ;延时等待数据传送完毕 nop stm #0915h,dxr10 ;伴音使能,DAC使能,MIC输入、BYPASS不使能 rpt #3000 ;延时等待数据传送完毕 nop stm #0a02h,dxr10 ;DAC静音不使能,去加重为32KHz,ADC高通滤波器不使能 rpt #3000 ;延时等待数据传送完毕 nop stm #0097h,dxr10 ;左声道线路输入0dB,线路输入静音 rpt #3000 ;延时等待数据传送完毕 nop stm #0297h,dxr10 ;右声道线路输入0dB,线路输入静音 rpt #3000 ;延时等待数据传送完毕 nop stm #0C01h,dxr10 ;POWER、CLOCK、OSC、OUT、DAC、ADC、MIC打开line in关闭 rpt #3000 ;延时等待数据传送完毕 nop stm #0e53h,dxr10 ;6位为1,AIC23在DSP模式中为主器件,4位为1,第二个时钟上沿数据可用,字长16位,DSP模式 rpt #3000 ;延时等待数据传送完毕 nop stm #100Dh,dxr10 ;USB模式,8KHz采样率,输入时钟为MCLK,输出时钟为MCLK rpt #3000 ;延时等待数据传送完毕 nop stm #1201h,dxr10 ;数字接口激活 rpt #3000 ;延时等待数据传送完毕 nop ;AIC23的DAC输出设置结束,开始输出音频数据 ;切换CPLD,使MCBSP0与AIC23的DIN口连接 write_cpld2: ld #0001h,A stm #0000h,ar2 rpt #10 nop portw *(8h),cpldport1 ;切换字写到CPLD控制寄存器,转为audio data字输出 rpt #400 ;等400个周期 nop portr cpldport1,ar2 rpt #400 nop bitf ar2,#0001h bc write_cpld2,ntc rpt #400 nop ;切换CPLD,使MCBSP0与AIC23的DIN口连接完毕 ;开始设置MCBSP0为DSP模式从器件, stm #spcr10,spsa0 ;RRST为0接收复位 stm #0000h,bsp0 stm #spcr20,spsa0 ;XRST为0,GRST为0,FRST为0发送、采样、帧复位 stm #0000h,bsp0 rpt #400 nop stm #spcr10,spsa0 ;5、4位为00,接收完成产生中断,进入非SPI模式,7位(DXENA)为0,不起动DX延时 stm #0000h,bsp0 stm #spcr20,spsa0 ;5、4位为00,发送完成产生中断,采样,帧同步复位 stm #0200h,bsp0 stm #pcr0,spsa0 ;帧同步,采样为外部输入,外部时钟极性反相 stm #0006h,bsp0 stm #rcr10,spsa0 ;14~8位置0,一帧两个字,7~5位为010,一个字16位 stm #0140h,bsp0 stm #rcr20,spsa0 ;15位置0,单阶段帧,第二阶一个字,16位字长1、0位置01延迟一个位时钟数据有效 stm #0001h,bsp0 stm #xcr10,spsa0 ;14~8位置0,一帧两个字,7~5位为010,一个字16位 stm #0140h,bsp0 stm #xcr20,spsa0 ;15位置0,单阶段帧,第二阶一个字,16位字长1、0位置01延迟一个位时钟数据有效 stm #0001h,bsp0 rpt #400 ;等两个以上位时钟 nop stm #0000h,dxr10 ;传起始数据到AIC23 stm #0000h,dxr20 rpt #400 ;等两个以上位时钟 nop ;MCBSP0口设置为DSP模式结束,输出数据 ;切换CPLD,使MCBSP0与AIC23的DIN口连接 write_cpld3: stm #0001h,ar1 stm #0000h,ar2 rpt #10 nop portw ar1,cpldport1 ;切换字写到CPLD控制寄存器,转为audio data字输出 rpt #400 ;等400个周期 nop portr cpldport1,ar2 rpt #400 nop bitf ar2,#0001h bc write_cpld3,ntc ;切换CPLD,使MCBSP0与AIC23的DIN口连接完毕 rpt #400 nop nop nop stm #drr10, ar5 ldu *ar5, a stm #drr20, ar5 ldu *ar5, a st #audio_table, ar5 st #15, *(timetemp) st #audio_table, *(addrtemp) st #15, ar4 rsbx intm stm #spcr20,spsa0 ;发送离开复位 orm #0001h,bsp0 nop nop stm #4000h,brc rptb delay1s-1 rpt #01800h nop delay1s: nop ssbx intm stm #spcr20,spsa0 ;发送结束 orm #0000h,bsp0 stm #2000h,brc rptb delay2s-1 rpt #01800h nop delay2s: nop stm #spcr10,spsa0 ;接收离开复位 orm #0001h,bsp0 stm #0010h, imr stm #0010h, ifr st #audio_in, ar5 st #0bfffh, ar4 rsbx intm loop4 ldm ar4,b nop nop bc mic,beq b loop4 mic ssbx intm stm #spcr10,spsa0 ;RRST为0接收复位 stm #0000h,bsp0 stm #spcr20,spsa0 ;XRST为0,GRST为0,FRST为0发送、采样、帧复位 stm #0000h,bsp0 rpt #400 nop stm #spcr10,spsa0 ;5、4位为00,接收完成产生中断,进入非SPI模式,7位(DXENA)为0,不起动DX延时 stm #0000h,bsp0 stm #spcr20,spsa0 ;5、4位为00,发送完成产生中断,采样,帧同步复位 stm #0200h,bsp0 stm #pcr0,spsa0 ;帧同步,采样为外部输入,外部时钟极性反相 stm #0006h,bsp0 stm #rcr10,spsa0 ;14~8位置0,一帧两个字,7~5位为010,一个字16位 stm #0140h,bsp0 stm #rcr20,spsa0 ;15位置0,单阶段帧,第二阶一个字,16位字长1、0位置01延迟一个位时钟数据有效 stm #0001h,bsp0 stm #xcr10,spsa0 ;14~8位置0,一帧两个字,7~5位为010,一个字16位 stm #0140h,bsp0 stm #xcr20,spsa0 ;15位置0,单阶段帧,第二阶一个字,16位字长1、0位置01延迟一个位时钟数据有效 stm #0001h,bsp0 rpt #400 ;等两个以上位时钟 stm #0000h,dxr10 ;传起始数据到AIC23 stm #0000h,dxr20 stm #0020h, imr stm #0020h, ifr stm #spcr20,spsa0 ;发送离开复位 orm #0001h,bsp0 nop nop st #audio_table, ar5 st #15, *(timetemp) st #audio_table, *(addrtemp) st #15, ar4 rsbx intm stm #3000h,brc rptb delay3s-1 rpt #01800h nop delay3s: nop st #audio_in, ar5 st #0bfffh, *(timetemp) st #audio_in, *(addrtemp) st #0bfffh, ar4 b $ _McBSP_txisr: ld *ar5+, A stlm a, dxr10 stlm a, dxr20 nop nop banz goon, *ar4- mvdm timetemp, ar4 mvdm addrtemp, ar5 goon nop nop rete _McBSP_rvisr: stm #drr10, ar2 ldu *ar2, a stl a, *ar5+ stm #drr20, ar2 ldu *ar2, a mar *ar4- goon2 reted nop nop .end |