For BU9480F D-A Conv.

Dependencies:   mbed

Committer:
lynxeyed_atsu
Date:
Sat Sep 11 11:23:26 2010 +0000
Revision:
3:64c3ed0fc4b4
Parent:
2:baf5bf51cd28

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lynxeyed_atsu 0:805cffac956b 1 /* DPCM & Rice Golomb Lossless Audio Player and Realtime encoder */
lynxeyed_atsu 1:02bfb013660c 2 #include "SDHCFileSystem.h"
lynxeyed_atsu 0:805cffac956b 3 #include "mbed.h"
lynxeyed_atsu 0:805cffac956b 4 #include "string"
lynxeyed_atsu 3:64c3ed0fc4b4 5 #include "_bitio.h"
lynxeyed_atsu 1:02bfb013660c 6
lynxeyed_atsu 0:805cffac956b 7 //FILE *infp,*outfp;
lynxeyed_atsu 1:02bfb013660c 8 SDFileSystem sd(p5, p6, p7, p8, "sd");
lynxeyed_atsu 0:805cffac956b 9 DigitalOut led1(LED1);
lynxeyed_atsu 0:805cffac956b 10 DigitalOut led2(LED2);
lynxeyed_atsu 0:805cffac956b 11 AnalogOut DACout(p18);
lynxeyed_atsu 0:805cffac956b 12 Ticker tick;
lynxeyed_atsu 0:805cffac956b 13
lynxeyed_atsu 3:64c3ed0fc4b4 14 // BU9480F define
lynxeyed_atsu 3:64c3ed0fc4b4 15 SPI bu9480f(p11,p12,p13);
lynxeyed_atsu 3:64c3ed0fc4b4 16 DigitalOut LRCLK(p14);
lynxeyed_atsu 3:64c3ed0fc4b4 17 // BU9480F define.end
lynxeyed_atsu 3:64c3ed0fc4b4 18
lynxeyed_atsu 3:64c3ed0fc4b4 19
lynxeyed_atsu 0:805cffac956b 20 // a FIFO for the DAC
lynxeyed_atsu 3:64c3ed0fc4b4 21 #define TXFIFO_FULL 1
lynxeyed_atsu 3:64c3ed0fc4b4 22 #define RAM_LENGTH 8192//8192
lynxeyed_atsu 1:02bfb013660c 23 #define RAM_LIMIT (RAM_LENGTH - 1)
lynxeyed_atsu 1:02bfb013660c 24 volatile short DAC_fifo[RAM_LENGTH];
lynxeyed_atsu 0:805cffac956b 25 volatile short DAC_wptr=0;
lynxeyed_atsu 0:805cffac956b 26 volatile short DAC_rptr=0;
lynxeyed_atsu 0:805cffac956b 27 volatile short DAC_on;
lynxeyed_atsu 3:64c3ed0fc4b4 28 volatile short DAC_diff=0;
lynxeyed_atsu 0:805cffac956b 29
lynxeyed_atsu 0:805cffac956b 30 void dac_out()
lynxeyed_atsu 0:805cffac956b 31 {
lynxeyed_atsu 0:805cffac956b 32 // printf("\t%d\r\n",DAC_diff);
lynxeyed_atsu 3:64c3ed0fc4b4 33 if (DAC_diff > 1) {
lynxeyed_atsu 3:64c3ed0fc4b4 34 led2 = 0;
lynxeyed_atsu 3:64c3ed0fc4b4 35
lynxeyed_atsu 3:64c3ed0fc4b4 36 LRCLK = 0;
lynxeyed_atsu 3:64c3ed0fc4b4 37 bu9480f.write(DAC_fifo[DAC_rptr++]);
lynxeyed_atsu 3:64c3ed0fc4b4 38 DAC_rptr &= RAM_LIMIT;
lynxeyed_atsu 3:64c3ed0fc4b4 39
lynxeyed_atsu 3:64c3ed0fc4b4 40 LRCLK = 1;
lynxeyed_atsu 3:64c3ed0fc4b4 41 bu9480f.write(DAC_fifo[DAC_rptr++]);
lynxeyed_atsu 3:64c3ed0fc4b4 42 DAC_rptr &= RAM_LIMIT;
lynxeyed_atsu 3:64c3ed0fc4b4 43
lynxeyed_atsu 3:64c3ed0fc4b4 44 DAC_diff-=2;
lynxeyed_atsu 3:64c3ed0fc4b4 45
lynxeyed_atsu 0:805cffac956b 46 }else led2 = 1;
lynxeyed_atsu 0:805cffac956b 47 }
lynxeyed_atsu 3:64c3ed0fc4b4 48
lynxeyed_atsu 0:805cffac956b 49 void encode(long int n){
lynxeyed_atsu 0:805cffac956b 50 int zero_shift = 0;
lynxeyed_atsu 0:805cffac956b 51
lynxeyed_atsu 0:805cffac956b 52 if(n < 0){
lynxeyed_atsu 0:805cffac956b 53 putbit(0); // sign (put 0:if n as negative)
lynxeyed_atsu 0:805cffac956b 54 n = -n; // n = abs(n)
lynxeyed_atsu 0:805cffac956b 55 //printf("\t 0");
lynxeyed_atsu 0:805cffac956b 56 }
lynxeyed_atsu 0:805cffac956b 57 else{
lynxeyed_atsu 0:805cffac956b 58 putbit(1); // sign (put 1:if n as positive)
lynxeyed_atsu 0:805cffac956b 59 //printf("\t 1");
lynxeyed_atsu 0:805cffac956b 60 }
lynxeyed_atsu 0:805cffac956b 61 zero_shift = (n >> (k));
lynxeyed_atsu 0:805cffac956b 62 //printf("\t shift= %d",zero_shift);
lynxeyed_atsu 0:805cffac956b 63 while(zero_shift > 0){
lynxeyed_atsu 0:805cffac956b 64
lynxeyed_atsu 0:805cffac956b 65 zero_shift--;
lynxeyed_atsu 0:805cffac956b 66 putbit(0);
lynxeyed_atsu 0:805cffac956b 67 } // put n/(2^k) 0's
lynxeyed_atsu 0:805cffac956b 68
lynxeyed_atsu 0:805cffac956b 69 putbit(1); // terminating "1"
lynxeyed_atsu 0:805cffac956b 70 putbits(k,rightbits(k,n));
lynxeyed_atsu 0:805cffac956b 71 //printf("\t finish= %d \r\n",(n & ((1U<<k)-1)));
lynxeyed_atsu 0:805cffac956b 72 }
lynxeyed_atsu 0:805cffac956b 73
lynxeyed_atsu 0:805cffac956b 74
lynxeyed_atsu 0:805cffac956b 75
lynxeyed_atsu 0:805cffac956b 76 void decode(void){
lynxeyed_atsu 3:64c3ed0fc4b4 77 //short dac_data;
lynxeyed_atsu 0:805cffac956b 78 long int decode_buff;
lynxeyed_atsu 0:805cffac956b 79 short diff,diff2;
lynxeyed_atsu 0:805cffac956b 80 unsigned int buff_sign,zero_shift;
lynxeyed_atsu 0:805cffac956b 81 //char flag;
lynxeyed_atsu 3:64c3ed0fc4b4 82
lynxeyed_atsu 0:805cffac956b 83 diff = 0;
lynxeyed_atsu 0:805cffac956b 84 diff2 = 0;
lynxeyed_atsu 0:805cffac956b 85 // get sign(1 for positive, 0 for negative)
lynxeyed_atsu 0:805cffac956b 86 while(1){
lynxeyed_atsu 0:805cffac956b 87
lynxeyed_atsu 0:805cffac956b 88 if((buff_sign = getbit())==OVERRUN)break;
lynxeyed_atsu 0:805cffac956b 89 zero_shift = 0;
lynxeyed_atsu 0:805cffac956b 90 while(getbit()==0)zero_shift++;
lynxeyed_atsu 0:805cffac956b 91
lynxeyed_atsu 0:805cffac956b 92 decode_buff = (signed int)((1U << k)*zero_shift);
lynxeyed_atsu 0:805cffac956b 93 decode_buff += (getbits(k));
lynxeyed_atsu 0:805cffac956b 94
lynxeyed_atsu 0:805cffac956b 95 if(!buff_sign)decode_buff =- decode_buff;
lynxeyed_atsu 0:805cffac956b 96 /* return decode_buff; */
lynxeyed_atsu 0:805cffac956b 97 diff =(diff + decode_buff);
lynxeyed_atsu 3:64c3ed0fc4b4 98 DAC_fifo[DAC_wptr++]=(short)diff;
lynxeyed_atsu 3:64c3ed0fc4b4 99 DAC_wptr &= RAM_LIMIT;
lynxeyed_atsu 3:64c3ed0fc4b4 100 //DAC_diff++;
lynxeyed_atsu 1:02bfb013660c 101 while (DAC_diff > RAM_LIMIT){
lynxeyed_atsu 0:805cffac956b 102 led1 = 1;
lynxeyed_atsu 0:805cffac956b 103 } //wait
lynxeyed_atsu 0:805cffac956b 104 led1=0;
lynxeyed_atsu 0:805cffac956b 105
lynxeyed_atsu 0:805cffac956b 106 if((buff_sign = getbit())==OVERRUN)break;
lynxeyed_atsu 0:805cffac956b 107 zero_shift = 0;
lynxeyed_atsu 0:805cffac956b 108 while(getbit()==0)zero_shift++;
lynxeyed_atsu 0:805cffac956b 109
lynxeyed_atsu 0:805cffac956b 110 decode_buff = (signed int)((1U << k)*zero_shift);
lynxeyed_atsu 0:805cffac956b 111 decode_buff += (getbits(k));
lynxeyed_atsu 0:805cffac956b 112
lynxeyed_atsu 0:805cffac956b 113 if(!buff_sign)decode_buff =- decode_buff;
lynxeyed_atsu 0:805cffac956b 114 /* return decode_buff; */
lynxeyed_atsu 0:805cffac956b 115 diff2 =(diff2 + decode_buff);
lynxeyed_atsu 0:805cffac956b 116
lynxeyed_atsu 3:64c3ed0fc4b4 117 DAC_fifo[DAC_wptr++]=(short)diff2;
lynxeyed_atsu 3:64c3ed0fc4b4 118 DAC_wptr &= RAM_LIMIT;
lynxeyed_atsu 3:64c3ed0fc4b4 119 DAC_diff+=2;
lynxeyed_atsu 3:64c3ed0fc4b4 120
lynxeyed_atsu 3:64c3ed0fc4b4 121 while (DAC_diff > RAM_LIMIT){
lynxeyed_atsu 3:64c3ed0fc4b4 122 led1 = 1;
lynxeyed_atsu 3:64c3ed0fc4b4 123 } //wait
lynxeyed_atsu 3:64c3ed0fc4b4 124 led1=0;
lynxeyed_atsu 0:805cffac956b 125
lynxeyed_atsu 0:805cffac956b 126
lynxeyed_atsu 0:805cffac956b 127
lynxeyed_atsu 0:805cffac956b 128 }
lynxeyed_atsu 0:805cffac956b 129 }
lynxeyed_atsu 1:02bfb013660c 130
lynxeyed_atsu 1:02bfb013660c 131
lynxeyed_atsu 1:02bfb013660c 132 int main() {
lynxeyed_atsu 1:02bfb013660c 133
lynxeyed_atsu 1:02bfb013660c 134
lynxeyed_atsu 1:02bfb013660c 135 if ( NULL == (infp = fopen( "/sd/test.rgm", "rb" )) ) {
lynxeyed_atsu 1:02bfb013660c 136 printf( "\r\nError: The message file cannot be accessed\r\n" );
lynxeyed_atsu 1:02bfb013660c 137 return -1;
lynxeyed_atsu 1:02bfb013660c 138 }
lynxeyed_atsu 3:64c3ed0fc4b4 139 // bu9480f init
lynxeyed_atsu 3:64c3ed0fc4b4 140 bu9480f.format(16,0);
lynxeyed_atsu 3:64c3ed0fc4b4 141 bu9480f.frequency(16000000); //16MHz
lynxeyed_atsu 3:64c3ed0fc4b4 142 // bu9480f init.end
lynxeyed_atsu 3:64c3ed0fc4b4 143
lynxeyed_atsu 3:64c3ed0fc4b4 144
lynxeyed_atsu 3:64c3ed0fc4b4 145 tick.attach_us(&dac_out, 41); //set 24.000kHz sampling data
lynxeyed_atsu 1:02bfb013660c 146 decode();
lynxeyed_atsu 1:02bfb013660c 147 tick.detach();
lynxeyed_atsu 1:02bfb013660c 148
lynxeyed_atsu 1:02bfb013660c 149 fclose( infp );
lynxeyed_atsu 1:02bfb013660c 150 //fclose( outfp );
lynxeyed_atsu 1:02bfb013660c 151
lynxeyed_atsu 1:02bfb013660c 152
lynxeyed_atsu 1:02bfb013660c 153
lynxeyed_atsu 1:02bfb013660c 154 while (1);
lynxeyed_atsu 1:02bfb013660c 155 }
lynxeyed_atsu 1:02bfb013660c 156