Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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