xeye_ atsu
/
I2S_AIC23B_32khz_wavtest
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "MSCFileSystem.h" 00003 #include "SDHCFileSystem.h" 00004 #include "i2s_irq_test.h" 00005 #include "lpc17xx_i2s.h" 00006 #include "lpc17xx_clkpwr.h" 00007 #include "aic23b_comm.h" 00008 #include "string" 00009 00010 00011 DigitalOut led1(LED1); 00012 DigitalOut led2(LED2); 00013 DigitalOut led3(LED3); 00014 Serial pc(USBTX, USBRX); // tx, rx 00015 I2C AIC23B(p9,p10); //sda,scl 00016 SDFileSystem sd(p11, p12, p13, p14, "sd");//p5,6,7,8 00017 MSCFileSystem msc("msc"); // Mount flash drive under the name "msc" 00018 00019 00020 FILE *infp,*outfp; 00021 Ticker tick; 00022 // a FIFO for the DAC 00023 #define RAM_LENGTH 8192//8192 00024 #define RAM_LIMIT (RAM_LENGTH - 1) 00025 volatile static signed short DAC_fifo[RAM_LENGTH]; 00026 volatile long int DAC_diff; 00027 00028 00029 int aic23b_send(int addr,char ctrl_address,char ctrl_data){ 00030 int flag; 00031 char cmd[2]; 00032 cmd[0]=ctrl_address; 00033 cmd[1]=ctrl_data; 00034 flag = AIC23B.write(addr, cmd, 2); 00035 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); 00036 return (flag); 00037 } 00038 00039 void aic23b_init(void){ 00040 int flag=0; 00041 printf("*************************\r\nReset TLV320AIC23B\r\n*************************\r\n"); 00042 AIC23B.frequency(150000); 00043 flag = aic23b_send(AIC23B_ADDRESS,RESET_REFGISTER,RESET); 00044 wait(0.1); 00045 flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,0); 00046 wait(0.1); 00047 flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,1); 00048 wait(0.1); 00049 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_INTERFACE_FORMAT,(MASTER_MODE|INPUT_DATA_16_BIT_LENGTH|I2S_FORMAT)); 00050 wait(0.1); 00051 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)*/)); 00052 wait(0.1); 00053 flag += aic23b_send(AIC23B_ADDRESS,ANALOG_AUDIO_PATH_CONTROL,0x10); 00054 wait(0.1); 00055 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_PATH_CONTROL,0); 00056 wait(0.1); 00057 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_INTERFACE_ACTIVATION,DIGITAL_INTERFACE_ACTIVE); 00058 wait(0.1); 00059 flag += aic23b_send(AIC23B_ADDRESS,LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL,LHV_VOLUME_DEFAULT); 00060 wait(0.1); 00061 flag += aic23b_send(AIC23B_ADDRESS,RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL,RHV_VOLUME_DEFAULT); 00062 00063 if(!flag) printf("*************************\r\nReset OK\r\n*************************\r\n"); 00064 else printf("*************************\r\nReset FAILED\r\n*************************\r\n"); 00065 } 00066 00067 00068 void dac_out(void) 00069 { 00070 00071 volatile static unsigned short DAC_rptr; 00072 volatile static unsigned long dataLR; 00073 if (DAC_diff > 18) { 00074 led2 = 0; 00075 short llp; 00076 for(llp=0;llp < 9;llp++){ 00077 if(I2S_GetLevel(LPC_I2S, I2S_TX_MODE)==TXFIFO_FULL)break; 00078 dataLR = (0xffff0000 & (DAC_fifo[DAC_rptr++]<<16))|(0x0000ffff & DAC_fifo[DAC_rptr++]); 00079 I2S_Send(LPC_I2S,dataLR); 00080 DAC_rptr &= RAM_LIMIT; 00081 DAC_diff -= 2; 00082 } 00083 00084 }else led2 = 1; 00085 00086 } 00087 00088 void decode(void){ 00089 volatile static unsigned short DAC_wptr=0; 00090 volatile static long int decode_buff; 00091 volatile long diff=0,diff2=0; 00092 while(1){ 00093 00094 volatile short buffLR; 00095 00096 if((buffLR = 0xff & fgetc(infp))==EOF)break; 00097 buffLR |= 0xff00 & (fgetc(infp) << 8); 00098 diff = buffLR; 00099 DAC_fifo[DAC_wptr++]=(signed short)diff; 00100 DAC_wptr &= RAM_LIMIT; 00101 // DAC_diff++; 00102 00103 while (DAC_diff > RAM_LIMIT){ 00104 led1 = 1; 00105 } //wait 00106 led1=0; 00107 00108 if((buffLR = 0xff & fgetc(infp))==EOF)break; 00109 buffLR |= 0xff00 & (fgetc(infp) << 8); 00110 diff = buffLR; 00111 DAC_fifo[DAC_wptr++]=(signed short)diff; 00112 DAC_wptr &= RAM_LIMIT; 00113 DAC_diff+=2; 00114 00115 00116 00117 00118 while (DAC_diff > RAM_LIMIT){ 00119 led1 = 1; 00120 } //wait 00121 led1=0; 00122 00123 00124 00125 } 00126 } 00127 00128 00129 int main() { 00130 00131 mbed_i2s_init(); //DAC:44100Hz sampling ,16bit ,Stereo ,MCLK Disable, TLV320AIC23B=Master 00132 aic23b_init(); 00133 00134 00135 00136 pc.printf("CCLKCFG= %d \r\n",LPC_SC->CCLKCFG); 00137 pc.printf("I2S Send start.\r\n"); 00138 led2=1; 00139 00140 //infp = NULL; 00141 // 00142 while(1){ 00143 if ( NULL == (infp = fopen( "/sd/test.wav", "r" )) ) { 00144 printf( "\r\nError: The message file cannot be accessed\r\n" ); 00145 return -1; 00146 } 00147 fseek(infp, 0L, SEEK_SET); 00148 tick.attach_us(&dac_out, 250); //set 32kHz/8(word FIFO) sampling data 00149 decode(); 00150 00151 fclose( infp ); 00152 infp = NULL; 00153 tick.detach(); 00154 00155 00156 00157 } 00158 } 00159 00160 00161
Generated on Thu Jul 14 2022 05:16:18 by 1.7.2