Dependencies:   mbed

Committer:
lynxeyed_atsu
Date:
Fri Jan 21 08:39:48 2011 +0000
Revision:
0:63ed631d8c3a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lynxeyed_atsu 0:63ed631d8c3a 1 #include "mbed.h"
lynxeyed_atsu 0:63ed631d8c3a 2 #include "MSCFileSystem.h"
lynxeyed_atsu 0:63ed631d8c3a 3 #include "SDHCFileSystem.h"
lynxeyed_atsu 0:63ed631d8c3a 4 #include "i2s_irq_test.h"
lynxeyed_atsu 0:63ed631d8c3a 5 #include "lpc17xx_i2s.h"
lynxeyed_atsu 0:63ed631d8c3a 6 #include "lpc17xx_clkpwr.h"
lynxeyed_atsu 0:63ed631d8c3a 7 #include "aic23b_comm.h"
lynxeyed_atsu 0:63ed631d8c3a 8 #include "string"
lynxeyed_atsu 0:63ed631d8c3a 9
lynxeyed_atsu 0:63ed631d8c3a 10
lynxeyed_atsu 0:63ed631d8c3a 11 DigitalOut led1(LED1);
lynxeyed_atsu 0:63ed631d8c3a 12 DigitalOut led2(LED2);
lynxeyed_atsu 0:63ed631d8c3a 13 DigitalOut led3(LED3);
lynxeyed_atsu 0:63ed631d8c3a 14 Serial pc(USBTX, USBRX); // tx, rx
lynxeyed_atsu 0:63ed631d8c3a 15 I2C AIC23B(p9,p10); //sda,scl
lynxeyed_atsu 0:63ed631d8c3a 16 SDFileSystem sd(p11, p12, p13, p14, "sd");//p5,6,7,8
lynxeyed_atsu 0:63ed631d8c3a 17 MSCFileSystem msc("msc"); // Mount flash drive under the name "msc"
lynxeyed_atsu 0:63ed631d8c3a 18
lynxeyed_atsu 0:63ed631d8c3a 19
lynxeyed_atsu 0:63ed631d8c3a 20 FILE *infp,*outfp;
lynxeyed_atsu 0:63ed631d8c3a 21 Ticker tick;
lynxeyed_atsu 0:63ed631d8c3a 22 // a FIFO for the DAC
lynxeyed_atsu 0:63ed631d8c3a 23 #define RAM_LENGTH 8192//8192
lynxeyed_atsu 0:63ed631d8c3a 24 #define RAM_LIMIT (RAM_LENGTH - 1)
lynxeyed_atsu 0:63ed631d8c3a 25 volatile static signed short DAC_fifo[RAM_LENGTH];
lynxeyed_atsu 0:63ed631d8c3a 26 volatile long int DAC_diff;
lynxeyed_atsu 0:63ed631d8c3a 27
lynxeyed_atsu 0:63ed631d8c3a 28
lynxeyed_atsu 0:63ed631d8c3a 29 int aic23b_send(int addr,char ctrl_address,char ctrl_data){
lynxeyed_atsu 0:63ed631d8c3a 30 int flag;
lynxeyed_atsu 0:63ed631d8c3a 31 char cmd[2];
lynxeyed_atsu 0:63ed631d8c3a 32 cmd[0]=ctrl_address;
lynxeyed_atsu 0:63ed631d8c3a 33 cmd[1]=ctrl_data;
lynxeyed_atsu 0:63ed631d8c3a 34 flag = AIC23B.write(addr, cmd, 2);
lynxeyed_atsu 0:63ed631d8c3a 35 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);
lynxeyed_atsu 0:63ed631d8c3a 36 return (flag);
lynxeyed_atsu 0:63ed631d8c3a 37 }
lynxeyed_atsu 0:63ed631d8c3a 38
lynxeyed_atsu 0:63ed631d8c3a 39 void aic23b_init(void){
lynxeyed_atsu 0:63ed631d8c3a 40 int flag=0;
lynxeyed_atsu 0:63ed631d8c3a 41 printf("*************************\r\nReset TLV320AIC23B\r\n*************************\r\n");
lynxeyed_atsu 0:63ed631d8c3a 42 AIC23B.frequency(150000);
lynxeyed_atsu 0:63ed631d8c3a 43 flag = aic23b_send(AIC23B_ADDRESS,RESET_REFGISTER,RESET);
lynxeyed_atsu 0:63ed631d8c3a 44 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 45 flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,0);
lynxeyed_atsu 0:63ed631d8c3a 46 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 47 flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,1);
lynxeyed_atsu 0:63ed631d8c3a 48 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 49 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_INTERFACE_FORMAT,(MASTER_MODE|INPUT_DATA_16_BIT_LENGTH|I2S_FORMAT));
lynxeyed_atsu 0:63ed631d8c3a 50 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 51 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)*/));
lynxeyed_atsu 0:63ed631d8c3a 52 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 53 flag += aic23b_send(AIC23B_ADDRESS,ANALOG_AUDIO_PATH_CONTROL,0x10);
lynxeyed_atsu 0:63ed631d8c3a 54 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 55 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_PATH_CONTROL,0);
lynxeyed_atsu 0:63ed631d8c3a 56 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 57 flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_INTERFACE_ACTIVATION,DIGITAL_INTERFACE_ACTIVE);
lynxeyed_atsu 0:63ed631d8c3a 58 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 59 flag += aic23b_send(AIC23B_ADDRESS,LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL,LHV_VOLUME_DEFAULT);
lynxeyed_atsu 0:63ed631d8c3a 60 wait(0.1);
lynxeyed_atsu 0:63ed631d8c3a 61 flag += aic23b_send(AIC23B_ADDRESS,RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL,RHV_VOLUME_DEFAULT);
lynxeyed_atsu 0:63ed631d8c3a 62
lynxeyed_atsu 0:63ed631d8c3a 63 if(!flag) printf("*************************\r\nReset OK\r\n*************************\r\n");
lynxeyed_atsu 0:63ed631d8c3a 64 else printf("*************************\r\nReset FAILED\r\n*************************\r\n");
lynxeyed_atsu 0:63ed631d8c3a 65 }
lynxeyed_atsu 0:63ed631d8c3a 66
lynxeyed_atsu 0:63ed631d8c3a 67
lynxeyed_atsu 0:63ed631d8c3a 68 void dac_out(void)
lynxeyed_atsu 0:63ed631d8c3a 69 {
lynxeyed_atsu 0:63ed631d8c3a 70
lynxeyed_atsu 0:63ed631d8c3a 71 volatile static unsigned short DAC_rptr;
lynxeyed_atsu 0:63ed631d8c3a 72 volatile static unsigned long dataLR;
lynxeyed_atsu 0:63ed631d8c3a 73 if (DAC_diff > 18) {
lynxeyed_atsu 0:63ed631d8c3a 74 led2 = 0;
lynxeyed_atsu 0:63ed631d8c3a 75 short llp;
lynxeyed_atsu 0:63ed631d8c3a 76 for(llp=0;llp < 9;llp++){
lynxeyed_atsu 0:63ed631d8c3a 77 if(I2S_GetLevel(LPC_I2S, I2S_TX_MODE)==TXFIFO_FULL)break;
lynxeyed_atsu 0:63ed631d8c3a 78 dataLR = (0xffff0000 & (DAC_fifo[DAC_rptr++]<<16))|(0x0000ffff & DAC_fifo[DAC_rptr++]);
lynxeyed_atsu 0:63ed631d8c3a 79 I2S_Send(LPC_I2S,dataLR);
lynxeyed_atsu 0:63ed631d8c3a 80 DAC_rptr &= RAM_LIMIT;
lynxeyed_atsu 0:63ed631d8c3a 81 DAC_diff -= 2;
lynxeyed_atsu 0:63ed631d8c3a 82 }
lynxeyed_atsu 0:63ed631d8c3a 83
lynxeyed_atsu 0:63ed631d8c3a 84 }else led2 = 1;
lynxeyed_atsu 0:63ed631d8c3a 85
lynxeyed_atsu 0:63ed631d8c3a 86 }
lynxeyed_atsu 0:63ed631d8c3a 87
lynxeyed_atsu 0:63ed631d8c3a 88 void decode(void){
lynxeyed_atsu 0:63ed631d8c3a 89 volatile static unsigned short DAC_wptr=0;
lynxeyed_atsu 0:63ed631d8c3a 90 volatile static long int decode_buff;
lynxeyed_atsu 0:63ed631d8c3a 91 volatile long diff=0,diff2=0;
lynxeyed_atsu 0:63ed631d8c3a 92 while(1){
lynxeyed_atsu 0:63ed631d8c3a 93
lynxeyed_atsu 0:63ed631d8c3a 94 volatile short buffLR;
lynxeyed_atsu 0:63ed631d8c3a 95
lynxeyed_atsu 0:63ed631d8c3a 96 if((buffLR = 0xff & fgetc(infp))==EOF)break;
lynxeyed_atsu 0:63ed631d8c3a 97 buffLR |= 0xff00 & (fgetc(infp) << 8);
lynxeyed_atsu 0:63ed631d8c3a 98 diff = buffLR;
lynxeyed_atsu 0:63ed631d8c3a 99 DAC_fifo[DAC_wptr++]=(signed short)diff;
lynxeyed_atsu 0:63ed631d8c3a 100 DAC_wptr &= RAM_LIMIT;
lynxeyed_atsu 0:63ed631d8c3a 101 // DAC_diff++;
lynxeyed_atsu 0:63ed631d8c3a 102
lynxeyed_atsu 0:63ed631d8c3a 103 while (DAC_diff > RAM_LIMIT){
lynxeyed_atsu 0:63ed631d8c3a 104 led1 = 1;
lynxeyed_atsu 0:63ed631d8c3a 105 } //wait
lynxeyed_atsu 0:63ed631d8c3a 106 led1=0;
lynxeyed_atsu 0:63ed631d8c3a 107
lynxeyed_atsu 0:63ed631d8c3a 108 if((buffLR = 0xff & fgetc(infp))==EOF)break;
lynxeyed_atsu 0:63ed631d8c3a 109 buffLR |= 0xff00 & (fgetc(infp) << 8);
lynxeyed_atsu 0:63ed631d8c3a 110 diff = buffLR;
lynxeyed_atsu 0:63ed631d8c3a 111 DAC_fifo[DAC_wptr++]=(signed short)diff;
lynxeyed_atsu 0:63ed631d8c3a 112 DAC_wptr &= RAM_LIMIT;
lynxeyed_atsu 0:63ed631d8c3a 113 DAC_diff+=2;
lynxeyed_atsu 0:63ed631d8c3a 114
lynxeyed_atsu 0:63ed631d8c3a 115
lynxeyed_atsu 0:63ed631d8c3a 116
lynxeyed_atsu 0:63ed631d8c3a 117
lynxeyed_atsu 0:63ed631d8c3a 118 while (DAC_diff > RAM_LIMIT){
lynxeyed_atsu 0:63ed631d8c3a 119 led1 = 1;
lynxeyed_atsu 0:63ed631d8c3a 120 } //wait
lynxeyed_atsu 0:63ed631d8c3a 121 led1=0;
lynxeyed_atsu 0:63ed631d8c3a 122
lynxeyed_atsu 0:63ed631d8c3a 123
lynxeyed_atsu 0:63ed631d8c3a 124
lynxeyed_atsu 0:63ed631d8c3a 125 }
lynxeyed_atsu 0:63ed631d8c3a 126 }
lynxeyed_atsu 0:63ed631d8c3a 127
lynxeyed_atsu 0:63ed631d8c3a 128
lynxeyed_atsu 0:63ed631d8c3a 129 int main() {
lynxeyed_atsu 0:63ed631d8c3a 130
lynxeyed_atsu 0:63ed631d8c3a 131 mbed_i2s_init(); //DAC:44100Hz sampling ,16bit ,Stereo ,MCLK Disable, TLV320AIC23B=Master
lynxeyed_atsu 0:63ed631d8c3a 132 aic23b_init();
lynxeyed_atsu 0:63ed631d8c3a 133
lynxeyed_atsu 0:63ed631d8c3a 134
lynxeyed_atsu 0:63ed631d8c3a 135
lynxeyed_atsu 0:63ed631d8c3a 136 pc.printf("CCLKCFG= %d \r\n",LPC_SC->CCLKCFG);
lynxeyed_atsu 0:63ed631d8c3a 137 pc.printf("I2S Send start.\r\n");
lynxeyed_atsu 0:63ed631d8c3a 138 led2=1;
lynxeyed_atsu 0:63ed631d8c3a 139
lynxeyed_atsu 0:63ed631d8c3a 140 //infp = NULL;
lynxeyed_atsu 0:63ed631d8c3a 141 //
lynxeyed_atsu 0:63ed631d8c3a 142 while(1){
lynxeyed_atsu 0:63ed631d8c3a 143 if ( NULL == (infp = fopen( "/sd/test.wav", "r" )) ) {
lynxeyed_atsu 0:63ed631d8c3a 144 printf( "\r\nError: The message file cannot be accessed\r\n" );
lynxeyed_atsu 0:63ed631d8c3a 145 return -1;
lynxeyed_atsu 0:63ed631d8c3a 146 }
lynxeyed_atsu 0:63ed631d8c3a 147 fseek(infp, 0L, SEEK_SET);
lynxeyed_atsu 0:63ed631d8c3a 148 tick.attach_us(&dac_out, 250); //set 32kHz/8(word FIFO) sampling data
lynxeyed_atsu 0:63ed631d8c3a 149 decode();
lynxeyed_atsu 0:63ed631d8c3a 150
lynxeyed_atsu 0:63ed631d8c3a 151 fclose( infp );
lynxeyed_atsu 0:63ed631d8c3a 152 infp = NULL;
lynxeyed_atsu 0:63ed631d8c3a 153 tick.detach();
lynxeyed_atsu 0:63ed631d8c3a 154
lynxeyed_atsu 0:63ed631d8c3a 155
lynxeyed_atsu 0:63ed631d8c3a 156
lynxeyed_atsu 0:63ed631d8c3a 157 }
lynxeyed_atsu 0:63ed631d8c3a 158 }
lynxeyed_atsu 0:63ed631d8c3a 159
lynxeyed_atsu 0:63ed631d8c3a 160
lynxeyed_atsu 0:63ed631d8c3a 161