xeye_ atsu
/
I2S_AIC23B_32khz_wavtest
Diff: main.cpp
- Revision:
- 0:63ed631d8c3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jan 21 08:39:48 2011 +0000 @@ -0,0 +1,161 @@ +#include "mbed.h" +#include "MSCFileSystem.h" +#include "SDHCFileSystem.h" +#include "i2s_irq_test.h" +#include "lpc17xx_i2s.h" +#include "lpc17xx_clkpwr.h" +#include "aic23b_comm.h" +#include "string" + + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +Serial pc(USBTX, USBRX); // tx, rx +I2C AIC23B(p9,p10); //sda,scl +SDFileSystem sd(p11, p12, p13, p14, "sd");//p5,6,7,8 +MSCFileSystem msc("msc"); // Mount flash drive under the name "msc" + + +FILE *infp,*outfp; +Ticker tick; +// a FIFO for the DAC +#define RAM_LENGTH 8192//8192 +#define RAM_LIMIT (RAM_LENGTH - 1) +volatile static signed short DAC_fifo[RAM_LENGTH]; +volatile long int DAC_diff; + + +int aic23b_send(int addr,char ctrl_address,char ctrl_data){ + int flag; + char cmd[2]; + cmd[0]=ctrl_address; + cmd[1]=ctrl_data; + flag = AIC23B.write(addr, cmd, 2); + pc.printf("ADDR=0x%x, CTRL_ADD=0x%x, CTRL_DATA=0x%x, RESP=0x%x\r\n",(addr&0x7f),cmd[0],cmd[1],flag); + return (flag); +} + +void aic23b_init(void){ + int flag=0; + printf("*************************\r\nReset TLV320AIC23B\r\n*************************\r\n"); + AIC23B.frequency(150000); + flag = aic23b_send(AIC23B_ADDRESS,RESET_REFGISTER,RESET); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,0); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,1); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_INTERFACE_FORMAT,(MASTER_MODE|INPUT_DATA_16_BIT_LENGTH|I2S_FORMAT)); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,SAMPLE_RATE_CONTROL,((0x06<<2)|0x01/*(SR_USB_44_1_KHZ_MODE| BOSR_USB_44_1_KHZ_MODE| USE_USB_CLOCK_44_1_KHZ_MODE)*/)); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,ANALOG_AUDIO_PATH_CONTROL,0x10); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_PATH_CONTROL,0); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_INTERFACE_ACTIVATION,DIGITAL_INTERFACE_ACTIVE); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL,LHV_VOLUME_DEFAULT); + wait(0.1); + flag += aic23b_send(AIC23B_ADDRESS,RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL,RHV_VOLUME_DEFAULT); + + if(!flag) printf("*************************\r\nReset OK\r\n*************************\r\n"); + else printf("*************************\r\nReset FAILED\r\n*************************\r\n"); +} + + +void dac_out(void) +{ + + volatile static unsigned short DAC_rptr; +volatile static unsigned long dataLR; + if (DAC_diff > 18) { + led2 = 0; + short llp; + for(llp=0;llp < 9;llp++){ + if(I2S_GetLevel(LPC_I2S, I2S_TX_MODE)==TXFIFO_FULL)break; + dataLR = (0xffff0000 & (DAC_fifo[DAC_rptr++]<<16))|(0x0000ffff & DAC_fifo[DAC_rptr++]); + I2S_Send(LPC_I2S,dataLR); + DAC_rptr &= RAM_LIMIT; + DAC_diff -= 2; + } + + }else led2 = 1; + +} + +void decode(void){ + volatile static unsigned short DAC_wptr=0; + volatile static long int decode_buff; + volatile long diff=0,diff2=0; + while(1){ + + volatile short buffLR; + + if((buffLR = 0xff & fgetc(infp))==EOF)break; + buffLR |= 0xff00 & (fgetc(infp) << 8); + diff = buffLR; + DAC_fifo[DAC_wptr++]=(signed short)diff; + DAC_wptr &= RAM_LIMIT; + // DAC_diff++; + + while (DAC_diff > RAM_LIMIT){ + led1 = 1; + } //wait + led1=0; + + if((buffLR = 0xff & fgetc(infp))==EOF)break; + buffLR |= 0xff00 & (fgetc(infp) << 8); + diff = buffLR; + DAC_fifo[DAC_wptr++]=(signed short)diff; + DAC_wptr &= RAM_LIMIT; + DAC_diff+=2; + + + + + while (DAC_diff > RAM_LIMIT){ + led1 = 1; + } //wait + led1=0; + + + + } +} + + +int main() { + + mbed_i2s_init(); //DAC:44100Hz sampling ,16bit ,Stereo ,MCLK Disable, TLV320AIC23B=Master + aic23b_init(); + + + + pc.printf("CCLKCFG= %d \r\n",LPC_SC->CCLKCFG); + pc.printf("I2S Send start.\r\n"); + led2=1; + + //infp = NULL; + // + while(1){ + if ( NULL == (infp = fopen( "/sd/test.wav", "r" )) ) { + printf( "\r\nError: The message file cannot be accessed\r\n" ); + return -1; + } + fseek(infp, 0L, SEEK_SET); + tick.attach_us(&dac_out, 250); //set 32kHz/8(word FIFO) sampling data + decode(); + + fclose( infp ); + infp = NULL; + tick.detach(); + + + + } +} + + + \ No newline at end of file