xeye_ atsu
/
I2S_AIC23B_32khz_wavtest
main.cpp
- Committer:
- lynxeyed_atsu
- Date:
- 2011-01-21
- Revision:
- 0:63ed631d8c3a
File content as of revision 0:63ed631d8c3a:
#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(); } }