xeye_ atsu
/
I2S_AIC23B_32khz_wavtest
main.cpp@0:63ed631d8c3a, 2011-01-21 (annotated)
- Committer:
- lynxeyed_atsu
- Date:
- Fri Jan 21 08:39:48 2011 +0000
- Revision:
- 0:63ed631d8c3a
Who changed what in which revision?
User | Revision | Line number | New 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 |