does not work yet. Sound starts but then stops after a few seconds, whole thing hangs. Published so as I can import through mbed CLI.

Dependencies:   mbed sinelookup SDFileSystem_Copy_of_mbed_version I2S

Committer:
roryhand
Date:
Sun Nov 25 16:41:04 2018 +0000
Revision:
9:4d6b9a554550
Parent:
8:40f37287589a
Some changes made, not sure what was going on with this one.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
roryhand 0:004cb0595aa8 1
roryhand 0:004cb0595aa8 2 // 24/03/2018 update - I appear to be able to address the device and write something, as I am getting an ACK returned from the i2c write() function.
roryhand 0:004cb0595aa8 3 //however if i use the write function with 4 arguments (as opposed to just 1 argument) then it doesnt work
roryhand 0:004cb0595aa8 4 //only works with the 1 argument version!!!
roryhand 0:004cb0595aa8 5
roryhand 0:004cb0595aa8 6
roryhand 0:004cb0595aa8 7 //THIS VERSION WORKED, CHANGED SOME THINGS, THEN CHANGED THEM BACK. NOW IT NO LONGER WORKS!!!!
roryhand 0:004cb0595aa8 8 #include "mbed.h"
roryhand 0:004cb0595aa8 9 #include "sinelookup.h"
roryhand 0:004cb0595aa8 10 #include "I2S.h"
roryhand 9:4d6b9a554550 11 #define sample_freq 32000
roryhand 0:004cb0595aa8 12 DigitalOut myled(LED1);
roryhand 0:004cb0595aa8 13 DigitalOut led2(LED2);
roryhand 0:004cb0595aa8 14 DigitalOut led3(LED3);
roryhand 0:004cb0595aa8 15 Ticker sampletick;
roryhand 0:004cb0595aa8 16 Timer t;
roryhand 6:fd6ae534d120 17 Timer t2;
roryhand 0:004cb0595aa8 18 #include "SDFileSystem.h"
roryhand 0:004cb0595aa8 19 #include "WOLFSON_config.h"
roryhand 0:004cb0595aa8 20 Serial pc(USBTX, USBRX); // tx, rx //FOR DEBUGGING PROGRAM USING GNU SCREEN
roryhand 0:004cb0595aa8 21 DigitalOut cs(p8);
roryhand 0:004cb0595aa8 22 I2S i2s(I2S_TRANSMIT,p5,p6,p7);
roryhand 0:004cb0595aa8 23 I2C i2c(p9, p10);
roryhand 0:004cb0595aa8 24
roryhand 0:004cb0595aa8 25 SDFileSystem sd(p11, p12, p13, p8, "sd"); // the new pinout that i am using
roryhand 0:004cb0595aa8 26
roryhand 0:004cb0595aa8 27 typedef struct uFMT_STRUCT{
roryhand 0:004cb0595aa8 28 short comp_code;
roryhand 0:004cb0595aa8 29 short num_channels;
roryhand 0:004cb0595aa8 30 unsigned sample_rate;
roryhand 0:004cb0595aa8 31 unsigned avg_Bps;
roryhand 0:004cb0595aa8 32 short block_align;
roryhand 0:004cb0595aa8 33 short sig_bps;
roryhand 0:004cb0595aa8 34 } FMT_STRUCT;
roryhand 0:004cb0595aa8 35
roryhand 0:004cb0595aa8 36 typedef struct uDATA_STRUCT {
roryhand 0:004cb0595aa8 37 unsigned subchunk2_ID;
roryhand 0:004cb0595aa8 38 unsigned subchunk2_size;
roryhand 0:004cb0595aa8 39 char * data_buf;
roryhand 0:004cb0595aa8 40 }DATA_STRUCT;
roryhand 0:004cb0595aa8 41 short hello;
roryhand 0:004cb0595aa8 42 int i = 0;
roryhand 0:004cb0595aa8 43 int h = 0;
roryhand 7:fb47ff047ac7 44 short bufflen = 1;
roryhand 0:004cb0595aa8 45 int buffer[1];
roryhand 0:004cb0595aa8 46 int AudioFormat, NumChannels, SampleRate, BitsPerSample ;
roryhand 0:004cb0595aa8 47 char *slice_buf;
roryhand 5:5b120a2d9249 48 short *data_sptr;
roryhand 3:6fba0a044d85 49 unsigned char *data_bptr;
roryhand 3:6fba0a044d85 50 int *data_wptr;
roryhand 3:6fba0a044d85 51 unsigned channel;
roryhand 0:004cb0595aa8 52 int newvar;
roryhand 3:6fba0a044d85 53 long slice, num_slices;
roryhand 3:6fba0a044d85 54 int verbosity = 0;
roryhand 8:40f37287589a 55 int verbosity2 = 0;
roryhand 9:4d6b9a554550 56 int verbosity3 = 0;
roryhand 7:fb47ff047ac7 57 int interrupt_condition = 1;
roryhand 9:4d6b9a554550 58 int sampling_freq = 32000;
roryhand 7:fb47ff047ac7 59 short Buffer1[8];
roryhand 7:fb47ff047ac7 60 short Buffer2[8];
roryhand 7:fb47ff047ac7 61 short place_hold1 = 0;
roryhand 7:fb47ff047ac7 62 short place_hold2 = 0;
roryhand 7:fb47ff047ac7 63 int flag1 = 1;
roryhand 7:fb47ff047ac7 64 int flag2 = 0;
roryhand 7:fb47ff047ac7 65 int flag3 = 1;
roryhand 7:fb47ff047ac7 66 int flag4 = 0;
roryhand 7:fb47ff047ac7 67 short value[1];
roryhand 0:004cb0595aa8 68 //long long slice_value;
roryhand 5:5b120a2d9249 69 int slice_value[1];
roryhand 0:004cb0595aa8 70 FILE *my_wav;
roryhand 0:004cb0595aa8 71 FMT_STRUCT wav_format;
roryhand 0:004cb0595aa8 72 DATA_STRUCT wav_data;
roryhand 0:004cb0595aa8 73
roryhand 0:004cb0595aa8 74 Ticker flipper;
roryhand 0:004cb0595aa8 75 //test
roryhand 0:004cb0595aa8 76 void flip() {
roryhand 0:004cb0595aa8 77 led2 = !led2;
roryhand 0:004cb0595aa8 78 }
roryhand 0:004cb0595aa8 79
roryhand 0:004cb0595aa8 80
roryhand 0:004cb0595aa8 81 void isr()
roryhand 0:004cb0595aa8 82 {
roryhand 7:fb47ff047ac7 83 //buffer[0] = (*data_sptr)>>1;
roryhand 7:fb47ff047ac7 84 //myled = 1;
roryhand 7:fb47ff047ac7 85 //int bufflen = sizeof(buffer);
roryhand 5:5b120a2d9249 86 if(verbosity){
roryhand 4:1a9482a07ee2 87 printf("buffer data: %d \n\r",buffer);
roryhand 7:fb47ff047ac7 88 printf("data_sptr data: %d",data_sptr);
roryhand 7:fb47ff047ac7 89 short value = Buffer1[0];
roryhand 7:fb47ff047ac7 90 printf("value: %d",value);
roryhand 5:5b120a2d9249 91 }
roryhand 7:fb47ff047ac7 92 //t.start();
roryhand 6:fd6ae534d120 93
roryhand 9:4d6b9a554550 94
roryhand 7:fb47ff047ac7 95 //myled = 0;
roryhand 7:fb47ff047ac7 96 if(flag1 == 0)
roryhand 7:fb47ff047ac7 97 {
roryhand 7:fb47ff047ac7 98 //access double buffer pt1
roryhand 7:fb47ff047ac7 99 value[0] = Buffer1[place_hold1];
roryhand 7:fb47ff047ac7 100 i2s.write(value,1);//Send next PWM value to amp
roryhand 7:fb47ff047ac7 101 place_hold1 = place_hold1 + 1;
roryhand 7:fb47ff047ac7 102 if(place_hold1 == 8)
roryhand 7:fb47ff047ac7 103 {
roryhand 9:4d6b9a554550 104 if(verbosity3 == 1)
roryhand 9:4d6b9a554550 105 {
roryhand 9:4d6b9a554550 106 printf("value flag1: %d\n\r",flag1);
roryhand 9:4d6b9a554550 107 }
roryhand 7:fb47ff047ac7 108 place_hold1 = 0;
roryhand 7:fb47ff047ac7 109 place_hold2 = 0;
roryhand 7:fb47ff047ac7 110 flag1 = 1;
roryhand 7:fb47ff047ac7 111 flag2 = 0;
roryhand 7:fb47ff047ac7 112 flag3 = 1;
roryhand 7:fb47ff047ac7 113 }
roryhand 8:40f37287589a 114 if(verbosity2 == 1)
roryhand 7:fb47ff047ac7 115 {
roryhand 9:4d6b9a554550 116 //printf("value Buffer1: %d\n\r",value[0]);
roryhand 9:4d6b9a554550 117 printf("value placehold1: %d\n\r",place_hold1);
roryhand 7:fb47ff047ac7 118 }
roryhand 7:fb47ff047ac7 119 }
roryhand 7:fb47ff047ac7 120 else if(flag2 == 0)
roryhand 7:fb47ff047ac7 121 {
roryhand 7:fb47ff047ac7 122 //access double buffer pt2
roryhand 9:4d6b9a554550 123 value[0] = Buffer2[place_hold2];//just chsnged this from BUFFER1.
roryhand 9:4d6b9a554550 124 //so perhaps we wont be trying to access the same thing and therefore crashing.
roryhand 7:fb47ff047ac7 125 i2s.write(value,1);//Send next PWM value to amp
roryhand 7:fb47ff047ac7 126 place_hold2 = place_hold2 + 1;
roryhand 7:fb47ff047ac7 127 if(place_hold2 == 8)
roryhand 7:fb47ff047ac7 128 {
roryhand 9:4d6b9a554550 129 if(verbosity3 == 1)
roryhand 9:4d6b9a554550 130 {
roryhand 9:4d6b9a554550 131 printf("value flag2: %d\n\r",flag2);
roryhand 9:4d6b9a554550 132 }
roryhand 9:4d6b9a554550 133 printf("value flag2: %d\n\r",flag2);
roryhand 7:fb47ff047ac7 134 place_hold1 = 0;
roryhand 7:fb47ff047ac7 135 place_hold2 = 0;
roryhand 7:fb47ff047ac7 136 flag1 = 0;
roryhand 7:fb47ff047ac7 137 flag2 = 1;
roryhand 7:fb47ff047ac7 138 flag3 = 1;
roryhand 7:fb47ff047ac7 139 }
roryhand 8:40f37287589a 140 if(verbosity2 == 1)
roryhand 7:fb47ff047ac7 141 {
roryhand 9:4d6b9a554550 142 //printf("value Buffer2: %d\n\r",value[0]);
roryhand 9:4d6b9a554550 143 printf("value placehold2: %d\n\r",place_hold2);
roryhand 7:fb47ff047ac7 144 }
roryhand 0:004cb0595aa8 145 }
roryhand 9:4d6b9a554550 146 //t.stop();
roryhand 9:4d6b9a554550 147 //printf("The time taken was %f seconds\n", t.read());
roryhand 9:4d6b9a554550 148 //t.reset();
roryhand 7:fb47ff047ac7 149 }
roryhand 0:004cb0595aa8 150
roryhand 1:ec4e2020522c 151
roryhand 0:004cb0595aa8 152
roryhand 0:004cb0595aa8 153 void wm8731_setup(int chip_addr, int addr, int cmd){
roryhand 0:004cb0595aa8 154 addr = addr << 1;
roryhand 0:004cb0595aa8 155 addr = addr|((cmd >> 8 ))& 0x01;//mess around with order of operations
roryhand 0:004cb0595aa8 156 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 157 i2c.start();
roryhand 0:004cb0595aa8 158 i2c.write( chip_addr );
roryhand 0:004cb0595aa8 159 i2c.write( addr );
roryhand 0:004cb0595aa8 160 i2c.write( cmd );
roryhand 0:004cb0595aa8 161 i2c.stop();
roryhand 0:004cb0595aa8 162 }
roryhand 0:004cb0595aa8 163
roryhand 0:004cb0595aa8 164
roryhand 0:004cb0595aa8 165 void wm8731_config(void){
roryhand 0:004cb0595aa8 166 wm8731_setup( WM8731_ADDRESS, WM8731_REG_RESET, _WM8731_RESET );//1
roryhand 0:004cb0595aa8 167 wm8731_setup( WM8731_ADDRESS, WM8731_REG_LLINE_IN, _WM8731_LEFT_LINEIN );//2
roryhand 0:004cb0595aa8 168 wm8731_setup( WM8731_ADDRESS, WM8731_REG_RLINE_IN, _WM8731_RIGHT_LINEIN );//3
roryhand 0:004cb0595aa8 169 wm8731_setup( WM8731_ADDRESS, WM8731_REG_LHPHONE_OUT, _WM8731_LEFT_HP );//4
roryhand 0:004cb0595aa8 170 wm8731_setup( WM8731_ADDRESS, WM8731_REG_RHPHONE_OUT, _WM8731_RIGHT_HP );//5
roryhand 0:004cb0595aa8 171 wm8731_setup( WM8731_ADDRESS, WM8731_REG_ANALOG_PATH, _WM8731_ANALOGAUDIO );//6
roryhand 0:004cb0595aa8 172 wm8731_setup( WM8731_ADDRESS, WM8731_REG_DIGITAL_PATH, _WM8731_DIGITALAUDIO );//7
roryhand 0:004cb0595aa8 173 wm8731_setup( WM8731_ADDRESS, WM8731_REG_PDOWN_CTRL, _WM8731_POWER );//8
roryhand 0:004cb0595aa8 174 wm8731_setup( WM8731_ADDRESS, WM8731_REG_DIGITAL_IF, _WM8731_DAIF );//9
roryhand 0:004cb0595aa8 175 wm8731_setup( WM8731_ADDRESS, WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING );//10
roryhand 0:004cb0595aa8 176 }
roryhand 0:004cb0595aa8 177
roryhand 0:004cb0595aa8 178 void wm8731_configTEST(void){
roryhand 0:004cb0595aa8 179 int addr = WM8731_REG_RESET;
roryhand 0:004cb0595aa8 180 int cmd = _WM8731_RESET;
roryhand 0:004cb0595aa8 181 addr = addr << 1;
roryhand 0:004cb0595aa8 182 addr = addr|((cmd >> 8 ))& 0x01;//mess around with order of operations
roryhand 0:004cb0595aa8 183 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 184 i2c.start();
roryhand 0:004cb0595aa8 185 i2c.write( WM8731_ADDRESS );
roryhand 0:004cb0595aa8 186 i2c.write( addr );
roryhand 0:004cb0595aa8 187 i2c.write( cmd );
roryhand 0:004cb0595aa8 188 i2c.stop();
roryhand 0:004cb0595aa8 189
roryhand 0:004cb0595aa8 190 addr = WM8731_REG_LLINE_IN;
roryhand 0:004cb0595aa8 191 cmd = _WM8731_LEFT_LINEIN;
roryhand 0:004cb0595aa8 192 addr = addr << 1;
roryhand 0:004cb0595aa8 193 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 194 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 195 i2c.start();
roryhand 0:004cb0595aa8 196 i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program
roryhand 0:004cb0595aa8 197 i2c.write( addr );
roryhand 0:004cb0595aa8 198 i2c.write( cmd );
roryhand 0:004cb0595aa8 199 i2c.stop();
roryhand 0:004cb0595aa8 200
roryhand 0:004cb0595aa8 201
roryhand 0:004cb0595aa8 202 addr = WM8731_REG_RLINE_IN;
roryhand 0:004cb0595aa8 203 cmd = _WM8731_RIGHT_LINEIN;
roryhand 0:004cb0595aa8 204 addr = addr << 1;
roryhand 0:004cb0595aa8 205 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 206 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 207 i2c.start();
roryhand 0:004cb0595aa8 208 i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program
roryhand 0:004cb0595aa8 209 i2c.write( addr );
roryhand 0:004cb0595aa8 210 i2c.write( cmd );
roryhand 0:004cb0595aa8 211 i2c.stop();
roryhand 0:004cb0595aa8 212
roryhand 0:004cb0595aa8 213
roryhand 0:004cb0595aa8 214 //4
roryhand 0:004cb0595aa8 215 addr = WM8731_REG_LHPHONE_OUT;
roryhand 0:004cb0595aa8 216 cmd = _WM8731_LEFT_HP;
roryhand 0:004cb0595aa8 217 addr = addr << 1;
roryhand 0:004cb0595aa8 218 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 219 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 220 i2c.start();
roryhand 0:004cb0595aa8 221 i2c.write( WM8731_ADDRESS );
roryhand 0:004cb0595aa8 222 i2c.write( addr );//WM8731_REG_LHPHONE_OUT, _WM8731_LEFT_HP
roryhand 0:004cb0595aa8 223 i2c.write(cmd);
roryhand 0:004cb0595aa8 224 i2c.stop();
roryhand 0:004cb0595aa8 225
roryhand 0:004cb0595aa8 226 //5
roryhand 0:004cb0595aa8 227 addr = WM8731_REG_RHPHONE_OUT;
roryhand 0:004cb0595aa8 228 cmd = _WM8731_RIGHT_HP;
roryhand 0:004cb0595aa8 229 addr = addr << 1;
roryhand 0:004cb0595aa8 230 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 231 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 232 i2c.start();
roryhand 0:004cb0595aa8 233 i2c.write( WM8731_ADDRESS );//WM8731_REG_RHPHONE_OUT, _WM8731_RIGHT_HP
roryhand 0:004cb0595aa8 234 i2c.write( addr );
roryhand 0:004cb0595aa8 235 i2c.write( cmd );
roryhand 0:004cb0595aa8 236 i2c.stop();
roryhand 0:004cb0595aa8 237
roryhand 0:004cb0595aa8 238
roryhand 0:004cb0595aa8 239 //6
roryhand 0:004cb0595aa8 240 addr = WM8731_REG_ANALOG_PATH;
roryhand 0:004cb0595aa8 241 cmd = _WM8731_ANALOGAUDIO;
roryhand 0:004cb0595aa8 242 addr = addr << 1;
roryhand 0:004cb0595aa8 243 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 244 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 245 i2c.start();
roryhand 0:004cb0595aa8 246 i2c.write( WM8731_ADDRESS );//WM8731_REG_ANALOG_PATH, _WM8731_ANALOGAUDIO
roryhand 0:004cb0595aa8 247 i2c.write( addr );
roryhand 0:004cb0595aa8 248 i2c.write( cmd );
roryhand 0:004cb0595aa8 249 i2c.stop();
roryhand 0:004cb0595aa8 250
roryhand 0:004cb0595aa8 251 //7
roryhand 0:004cb0595aa8 252 addr = WM8731_REG_DIGITAL_PATH;
roryhand 0:004cb0595aa8 253 cmd = _WM8731_DIGITALAUDIO;
roryhand 0:004cb0595aa8 254 addr = addr << 1;
roryhand 0:004cb0595aa8 255 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 256 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 257 i2c.start();
roryhand 0:004cb0595aa8 258 i2c.write( WM8731_ADDRESS );//WM8731_REG_DIGITAL_PATH, _WM8731_DIGITALAUDIO
roryhand 0:004cb0595aa8 259 i2c.write( addr );
roryhand 0:004cb0595aa8 260 i2c.write( cmd );
roryhand 0:004cb0595aa8 261 i2c.stop();
roryhand 0:004cb0595aa8 262
roryhand 0:004cb0595aa8 263 //8
roryhand 0:004cb0595aa8 264 addr = WM8731_REG_PDOWN_CTRL;
roryhand 0:004cb0595aa8 265 cmd = _WM8731_POWER;
roryhand 0:004cb0595aa8 266 addr = addr << 1;
roryhand 0:004cb0595aa8 267 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 268 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 269 i2c.start();
roryhand 0:004cb0595aa8 270 i2c.write( WM8731_ADDRESS );//WM8731_REG_PDOWN_CTRL, _WM8731_POWER)
roryhand 0:004cb0595aa8 271 i2c.write( addr );
roryhand 0:004cb0595aa8 272 i2c.write( cmd );
roryhand 0:004cb0595aa8 273 i2c.stop();
roryhand 0:004cb0595aa8 274
roryhand 0:004cb0595aa8 275
roryhand 0:004cb0595aa8 276 //9
roryhand 0:004cb0595aa8 277 addr = WM8731_REG_DIGITAL_IF;
roryhand 0:004cb0595aa8 278 cmd = _WM8731_DAIF;
roryhand 0:004cb0595aa8 279 addr = addr << 1;
roryhand 0:004cb0595aa8 280 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 281 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 282 i2c.start();
roryhand 0:004cb0595aa8 283 i2c.write( WM8731_ADDRESS );
roryhand 0:004cb0595aa8 284 i2c.write( addr );//WM8731_REG_DIGITAL_IF, _WM8731_DAIF
roryhand 0:004cb0595aa8 285 i2c.write( cmd );
roryhand 0:004cb0595aa8 286 i2c.stop();
roryhand 0:004cb0595aa8 287
roryhand 0:004cb0595aa8 288
roryhand 0:004cb0595aa8 289 //10
roryhand 0:004cb0595aa8 290 addr = WM8731_REG_SAMPLING_CTRL;
roryhand 0:004cb0595aa8 291 cmd = _WM8731_SAMPLING;
roryhand 0:004cb0595aa8 292 addr = addr << 1;
roryhand 0:004cb0595aa8 293 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 294 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 295 i2c.start();
roryhand 0:004cb0595aa8 296 i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING
roryhand 0:004cb0595aa8 297 i2c.write( addr );
roryhand 0:004cb0595aa8 298 i2c.write( cmd );
roryhand 0:004cb0595aa8 299 i2c.stop();
roryhand 0:004cb0595aa8 300
roryhand 0:004cb0595aa8 301
roryhand 0:004cb0595aa8 302
roryhand 0:004cb0595aa8 303
roryhand 0:004cb0595aa8 304 //11
roryhand 0:004cb0595aa8 305 addr = WM8731_REG_ACTIVE_CTRL;
roryhand 0:004cb0595aa8 306 cmd = _WM8731_ACTIVATE;
roryhand 0:004cb0595aa8 307 addr = addr << 1;
roryhand 0:004cb0595aa8 308 addr = addr|((cmd >> 8 )) & 0x01;
roryhand 0:004cb0595aa8 309 cmd = cmd&0xFF;
roryhand 0:004cb0595aa8 310 i2c.start();
roryhand 0:004cb0595aa8 311 i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING
roryhand 0:004cb0595aa8 312 i2c.write( addr );
roryhand 0:004cb0595aa8 313 i2c.write( cmd );//there is also a deactive version!!
roryhand 0:004cb0595aa8 314 i2c.stop();
roryhand 0:004cb0595aa8 315
roryhand 0:004cb0595aa8 316
roryhand 0:004cb0595aa8 317
roryhand 0:004cb0595aa8 318 }
roryhand 0:004cb0595aa8 319
roryhand 0:004cb0595aa8 320 int main() {
roryhand 0:004cb0595aa8 321 FMT_STRUCT wav_format;
roryhand 0:004cb0595aa8 322 char data[2];
roryhand 0:004cb0595aa8 323 pc.printf("Beginning of program\n");
roryhand 0:004cb0595aa8 324 data[0] = 0x0F;
roryhand 0:004cb0595aa8 325 data[1] = 0x00;
roryhand 0:004cb0595aa8 326 FILE *my_wav;
roryhand 0:004cb0595aa8 327 //my_wav = fopen("/sd/mydir/gp40.wav", "rb");//i think that it is "w" for write, "r" for read.
roryhand 8:40f37287589a 328 //my_wav = fopen("/sd/mydir/gp40_48K.wav", "rb");//i think that it is "w" for write, "r" for read.
roryhand 5:5b120a2d9249 329 //my_wav = fopen("/sd/mydir/gp40_48K_quieter.wav", "rb");//i think that it is "w" for write, "r" for read.
roryhand 7:fb47ff047ac7 330 //my_wav = fopen("/sd/mydir/gp40_8K.wav","rb");
roryhand 9:4d6b9a554550 331 //my_wav = fopen("/sd/mydir/gp40_8K_2018.wav","rb");
roryhand 9:4d6b9a554550 332 my_wav = fopen("/sd/mydir/gp40_32K.wav","rb");
roryhand 5:5b120a2d9249 333 //my_wav = fopen("/sd/mydir/emd_645.wav", "rb");
roryhand 0:004cb0595aa8 334 fseek(my_wav, 20, SEEK_SET); // set pointer to byte 20
roryhand 0:004cb0595aa8 335 fread(&AudioFormat, 2, 1, my_wav); // check file is PCM
roryhand 0:004cb0595aa8 336 if (AudioFormat==0x01) {
roryhand 0:004cb0595aa8 337 printf("Wav file is PCM data\n\r");
roryhand 0:004cb0595aa8 338 }
roryhand 0:004cb0595aa8 339 else {
roryhand 0:004cb0595aa8 340 printf("Wav file is not PCM data\n\r");
roryhand 0:004cb0595aa8 341 }
roryhand 0:004cb0595aa8 342
roryhand 0:004cb0595aa8 343 fseek (my_wav,20,SEEK_SET);
roryhand 0:004cb0595aa8 344 fread(&wav_format,sizeof(wav_format),1,my_wav);
roryhand 0:004cb0595aa8 345 printf("%d block align\n",wav_format.block_align);
roryhand 0:004cb0595aa8 346 printf(" %d channels\n",wav_format.num_channels);
roryhand 0:004cb0595aa8 347
roryhand 0:004cb0595aa8 348
roryhand 0:004cb0595aa8 349 fseek(my_wav, 36, SEEK_SET);
roryhand 0:004cb0595aa8 350 fread(&wav_data.subchunk2_ID,4,1,my_wav);
roryhand 0:004cb0595aa8 351 fseek(my_wav, 40, SEEK_SET);
roryhand 0:004cb0595aa8 352 fread(&wav_data.subchunk2_size,4,1,my_wav);
roryhand 0:004cb0595aa8 353 printf("DATA chunck\n");
roryhand 0:004cb0595aa8 354 printf(" %d subchunk 2 ID\n",wav_data.subchunk2_ID);
roryhand 0:004cb0595aa8 355 printf(" %d subchunk 2 size\n",wav_data.subchunk2_size);
roryhand 0:004cb0595aa8 356 i2c.frequency(100000);
roryhand 0:004cb0595aa8 357 long j = 0;
roryhand 0:004cb0595aa8 358 printf("set up the codec\n\r");
roryhand 3:6fba0a044d85 359 while(j <1000){
roryhand 0:004cb0595aa8 360 wm8731_configTEST();
roryhand 3:6fba0a044d85 361 j = j + 1;
roryhand 3:6fba0a044d85 362 }
roryhand 0:004cb0595aa8 363 //i2s audio data transfer code??
roryhand 0:004cb0595aa8 364 i2s.stereomono(I2S_STEREO);
roryhand 0:004cb0595aa8 365 i2s.masterslave(I2S_MASTER);//MASTER definitely works!
roryhand 0:004cb0595aa8 366 i2s.frequency(sample_freq);
roryhand 0:004cb0595aa8 367 int yes = i2s.setup_ok();
roryhand 0:004cb0595aa8 368 pc.printf("Setup went ok?: %d\n", yes);//0 = ack, 1 = Nack*/
roryhand 0:004cb0595aa8 369 printf("can we get to this point? 1\n\r");
roryhand 0:004cb0595aa8 370 led3 = 1;
roryhand 0:004cb0595aa8 371 //myled = 1;
roryhand 0:004cb0595aa8 372 led2 = 1;
roryhand 0:004cb0595aa8 373 printf("can we get to this point? 2\n\r");
roryhand 0:004cb0595aa8 374
roryhand 0:004cb0595aa8 375 myled = 1;
roryhand 0:004cb0595aa8 376 i2s.start();
roryhand 0:004cb0595aa8 377 //while (1) {
roryhand 0:004cb0595aa8 378 fread(&wav_format,sizeof(wav_format),1,my_wav);
roryhand 0:004cb0595aa8 379 printf("wav_format %d\n\r",wav_format);
roryhand 8:40f37287589a 380
roryhand 0:004cb0595aa8 381 fseek(my_wav,20,SEEK_SET);
roryhand 0:004cb0595aa8 382 fread(&wav_format,sizeof(wav_format),1,my_wav);
roryhand 0:004cb0595aa8 383 fseek(my_wav,36,SEEK_SET);
roryhand 0:004cb0595aa8 384 fread(&wav_data,sizeof(wav_data),1,my_wav);
roryhand 2:05b426733282 385 int num_slices = wav_data.subchunk2_size/wav_format.block_align;
roryhand 0:004cb0595aa8 386 printf("wav_data.subchunk2_size: %d\n\r",wav_data.subchunk2_size);
roryhand 0:004cb0595aa8 387 printf("wav_format.block_align: %d\n\r",wav_format.block_align);
roryhand 0:004cb0595aa8 388 printf("num_slices: %d\n\r",num_slices);
roryhand 0:004cb0595aa8 389 printf("num_slices*wav_format.block_align %d\n\r",num_slices*wav_format.block_align);
roryhand 0:004cb0595aa8 390 printf("wav_format.num_channels*wav_format.sig_bps/8: %d\n\r",wav_format.num_channels*wav_format.sig_bps/8);
roryhand 3:6fba0a044d85 391 printf("chunk_size - sizeof(wav_format) %d\n\r",wav_data.subchunk2_size-sizeof(wav_format));
roryhand 0:004cb0595aa8 392 printf("sizeof(wav_format): %d\n\r",sizeof(wav_format));
roryhand 3:6fba0a044d85 393 printf("do we egt to this point:\n\r");
roryhand 6:fd6ae534d120 394 if (interrupt_condition == 1)
roryhand 6:fd6ae534d120 395 {
roryhand 9:4d6b9a554550 396 sampletick.attach(&isr,1.0/32000); //1/16000
roryhand 7:fb47ff047ac7 397 }
roryhand 3:6fba0a044d85 398 slice_buf=(char *)malloc(wav_format.block_align);
roryhand 8:40f37287589a 399 slice = 0;
roryhand 9:4d6b9a554550 400 while (!feof(my_wav)){
roryhand 9:4d6b9a554550 401 //while(1){
roryhand 8:40f37287589a 402
roryhand 7:fb47ff047ac7 403 while(flag3 == 1)
roryhand 7:fb47ff047ac7 404 {
roryhand 7:fb47ff047ac7 405 //for (slice=0;slice<num_slices;slice+=1)
roryhand 7:fb47ff047ac7 406 while(slice<num_slices){
roryhand 7:fb47ff047ac7 407 //t2.start();
roryhand 3:6fba0a044d85 408 fread(slice_buf,wav_format.block_align,1,my_wav);//THIS IS WHERE HE READS IN THE DATA, TO SLICE_BUF. BUT USES WAV_FORMAT.BLOCKALIGN AS HIS SIZE GUIDE
roryhand 2:05b426733282 409 //I do not understand why he is not "seeking" through the file first though...
roryhand 3:6fba0a044d85 410 if (feof(my_wav)){
roryhand 2:05b426733282 411 printf("Oops -- not enough slices in the wave file\n");
roryhand 2:05b426733282 412 exit(1);
roryhand 2:05b426733282 413 }
roryhand 5:5b120a2d9249 414 data_sptr=(short *)slice_buf; // 16 bit samples
roryhand 2:05b426733282 415 data_bptr=(unsigned char *)slice_buf; // 8 bit samples
roryhand 2:05b426733282 416 data_wptr=(int *)slice_buf; // 32 bit samples
roryhand 5:5b120a2d9249 417 slice_value[1]=0;
roryhand 2:05b426733282 418 for (channel=0;channel<wav_format.num_channels;channel++) {
roryhand 2:05b426733282 419 switch (wav_format.sig_bps) {
roryhand 2:05b426733282 420 case 16:
roryhand 7:fb47ff047ac7 421 //int mybuffer[1];
roryhand 7:fb47ff047ac7 422 //mybuffer[0] = data_sptr[channel];// - 32768;
roryhand 7:fb47ff047ac7 423 if(flag1 == 1)
roryhand 7:fb47ff047ac7 424 {
roryhand 7:fb47ff047ac7 425 Buffer1[place_hold1] = data_sptr[channel];
roryhand 7:fb47ff047ac7 426 place_hold1 = place_hold1 + 1;
roryhand 7:fb47ff047ac7 427 if(place_hold1 == 8)
roryhand 7:fb47ff047ac7 428 {
roryhand 7:fb47ff047ac7 429 flag4 = 1;
roryhand 7:fb47ff047ac7 430 break;
roryhand 7:fb47ff047ac7 431 }
roryhand 7:fb47ff047ac7 432
roryhand 7:fb47ff047ac7 433 }
roryhand 7:fb47ff047ac7 434 else if(flag2 == 0)
roryhand 7:fb47ff047ac7 435 {
roryhand 7:fb47ff047ac7 436 Buffer2[place_hold2] = data_sptr[channel];
roryhand 7:fb47ff047ac7 437 place_hold2 = place_hold2 + 1;
roryhand 7:fb47ff047ac7 438 if(place_hold2 == 8)
roryhand 7:fb47ff047ac7 439 {
roryhand 7:fb47ff047ac7 440 flag4 = 1;
roryhand 7:fb47ff047ac7 441 break;
roryhand 7:fb47ff047ac7 442 }
roryhand 7:fb47ff047ac7 443
roryhand 7:fb47ff047ac7 444 }
roryhand 7:fb47ff047ac7 445
roryhand 6:fd6ae534d120 446 if(interrupt_condition==1)
roryhand 6:fd6ae534d120 447 {
roryhand 6:fd6ae534d120 448
roryhand 6:fd6ae534d120 449
roryhand 6:fd6ae534d120 450 }
roryhand 6:fd6ae534d120 451 else
roryhand 6:fd6ae534d120 452 {
roryhand 6:fd6ae534d120 453 if(verbosity == 1)
roryhand 6:fd6ae534d120 454 {
roryhand 6:fd6ae534d120 455 t.start();
roryhand 6:fd6ae534d120 456 i2s.write(data_sptr,2);
roryhand 6:fd6ae534d120 457 t.stop();
roryhand 6:fd6ae534d120 458 printf("The time taken was %f seconds\n", t.read());
roryhand 6:fd6ae534d120 459 t.reset();
roryhand 6:fd6ae534d120 460 }
roryhand 6:fd6ae534d120 461
roryhand 6:fd6ae534d120 462 else
roryhand 6:fd6ae534d120 463 {
roryhand 6:fd6ae534d120 464
roryhand 6:fd6ae534d120 465 i2s.write(data_sptr,2);
roryhand 6:fd6ae534d120 466
roryhand 6:fd6ae534d120 467 }
roryhand 6:fd6ae534d120 468
roryhand 6:fd6ae534d120 469 if(sampling_freq == 48000)
roryhand 6:fd6ae534d120 470 {
roryhand 6:fd6ae534d120 471 wait_us(0.1);
roryhand 6:fd6ae534d120 472 }
roryhand 6:fd6ae534d120 473 else if(sampling_freq == 8000)
roryhand 6:fd6ae534d120 474 {
roryhand 6:fd6ae534d120 475 wait_us(2);
roryhand 6:fd6ae534d120 476 }
roryhand 6:fd6ae534d120 477 }
roryhand 6:fd6ae534d120 478
roryhand 6:fd6ae534d120 479
roryhand 6:fd6ae534d120 480
roryhand 6:fd6ae534d120 481
roryhand 6:fd6ae534d120 482
roryhand 2:05b426733282 483 if (verbosity)
roryhand 5:5b120a2d9249 484 printf("16 bit channel %d data=%d\n\r ",channel,data_sptr[channel]);
roryhand 5:5b120a2d9249 485 slice_value[1]+=data_sptr[channel];
roryhand 2:05b426733282 486 break;
roryhand 2:05b426733282 487 case 32:
roryhand 2:05b426733282 488 if (verbosity)
roryhand 2:05b426733282 489 printf("32 bit channel %d data=%d ",channel,data_wptr[channel]);
roryhand 5:5b120a2d9249 490 slice_value[1]+=data_wptr[channel];
roryhand 2:05b426733282 491 break;
roryhand 2:05b426733282 492 case 8:
roryhand 2:05b426733282 493 if (verbosity)
roryhand 2:05b426733282 494 printf("8 bit channel %d data=%d ",channel,(int)data_bptr[channel]);
roryhand 5:5b120a2d9249 495 slice_value[1]+=data_bptr[channel];
roryhand 2:05b426733282 496 break;
roryhand 2:05b426733282 497 }
roryhand 2:05b426733282 498 }
roryhand 7:fb47ff047ac7 499 if(flag4 == 1)
roryhand 7:fb47ff047ac7 500 {
roryhand 7:fb47ff047ac7 501 flag4 = 0;
roryhand 7:fb47ff047ac7 502 break;
roryhand 9:4d6b9a554550 503 }
roryhand 5:5b120a2d9249 504 slice_value[1]/=wav_format.num_channels;
roryhand 2:05b426733282 505
roryhand 2:05b426733282 506 // slice_value is now averaged. Next it needs to be scaled to an unsigned 16 bit value
roryhand 2:05b426733282 507 // with DC offset so it can be written to the DAC.
roryhand 2:05b426733282 508 switch (wav_format.sig_bps) {
roryhand 5:5b120a2d9249 509 case 8: slice_value[1]<<=8;
roryhand 2:05b426733282 510 break;
roryhand 5:5b120a2d9249 511 case 16: slice_value[1]+=32768;
roryhand 2:05b426733282 512 break;
roryhand 5:5b120a2d9249 513 case 32: slice_value[1]>>=16;
roryhand 5:5b120a2d9249 514 slice_value[1]+=32768;
roryhand 2:05b426733282 515 break;
roryhand 2:05b426733282 516 }
roryhand 5:5b120a2d9249 517 if (verbosity)
roryhand 5:5b120a2d9249 518 {
roryhand 5:5b120a2d9249 519 printf("data_sptr data: %d \n\r",data_sptr);
roryhand 5:5b120a2d9249 520 printf("slice_value data: %d \n\r",slice_value);
roryhand 5:5b120a2d9249 521 }
roryhand 7:fb47ff047ac7 522 slice = slice + 1;
roryhand 5:5b120a2d9249 523 //i2s.write(data_sptr,2);
roryhand 7:fb47ff047ac7 524 //t2.stop();
roryhand 7:fb47ff047ac7 525 //printf("The time taken was %f seconds\n", t2.read());
roryhand 7:fb47ff047ac7 526 //t2.reset();
roryhand 3:6fba0a044d85 527 }
roryhand 9:4d6b9a554550 528 //printf("we must have filled the buffer");
roryhand 7:fb47ff047ac7 529 }
roryhand 7:fb47ff047ac7 530 }
roryhand 7:fb47ff047ac7 531
roryhand 7:fb47ff047ac7 532
roryhand 3:6fba0a044d85 533 /* dac_data=(short unsigned)slice_value;
roryhand 2:05b426733282 534 if (verbosity)
roryhand 2:05b426733282 535 printf("sample %d wptr %d slice_value %d dac_data %u\n",slice,DAC_wptr,(int)slice_value,dac_data);
roryhand 2:05b426733282 536 DAC_fifo[DAC_wptr]=dac_data;
roryhand 2:05b426733282 537 DAC_wptr=(DAC_wptr+1) & 0xff;
roryhand 2:05b426733282 538 while (DAC_wptr==DAC_rptr) {
roryhand 2:05b426733282 539 }
roryhand 3:6fba0a044d85 540 }*/
roryhand 3:6fba0a044d85 541
roryhand 2:05b426733282 542
roryhand 6:fd6ae534d120 543 if(interrupt_condition == 1)
roryhand 6:fd6ae534d120 544 {
roryhand 6:fd6ae534d120 545
roryhand 6:fd6ae534d120 546 sampletick.detach();
roryhand 6:fd6ae534d120 547 }
roryhand 6:fd6ae534d120 548
roryhand 0:004cb0595aa8 549 i2s.stop();
roryhand 0:004cb0595aa8 550
roryhand 0:004cb0595aa8 551 fclose(my_wav);
roryhand 0:004cb0595aa8 552 printf("File is now closed.");
roryhand 0:004cb0595aa8 553 return 0;
roryhand 0:004cb0595aa8 554 }
roryhand 0:004cb0595aa8 555