Under construction

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed

Fork of vs1011e by Erick Cardenas

Committer:
swilliams346
Date:
Mon Dec 12 14:31:10 2016 +0000
Revision:
1:9c5643903657
Under construction

Who changed what in which revision?

UserRevisionLine numberNew contents of line
swilliams346 1:9c5643903657 1 #include "VS1002.h"
swilliams346 1:9c5643903657 2 #include "mbed.h"
swilliams346 1:9c5643903657 3 AnalogIn rotary1(p19);
swilliams346 1:9c5643903657 4 DigitalIn pause1(p28);
swilliams346 1:9c5643903657 5
swilliams346 1:9c5643903657 6
swilliams346 1:9c5643903657 7 /* ==================================================================
swilliams346 1:9c5643903657 8 * Constructor
swilliams346 1:9c5643903657 9 * =================================================================*/
swilliams346 1:9c5643903657 10 VS1002::VS1002(
swilliams346 1:9c5643903657 11 PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name,
swilliams346 1:9c5643903657 12 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
swilliams346 1:9c5643903657 13 PinName dreq, PinName dcs, PinName vol)
swilliams346 1:9c5643903657 14 :
swilliams346 1:9c5643903657 15 _sd(mmosi, mmiso, ssck, ccs, name),
swilliams346 1:9c5643903657 16 _spi(mosi, miso, sck),
swilliams346 1:9c5643903657 17 _CS(cs),
swilliams346 1:9c5643903657 18 _RST(rst),
swilliams346 1:9c5643903657 19 _DREQ(dreq),
swilliams346 1:9c5643903657 20 _DCS(dcs),
swilliams346 1:9c5643903657 21 _VOL(vol) {
swilliams346 1:9c5643903657 22
swilliams346 1:9c5643903657 23 }
swilliams346 1:9c5643903657 24
swilliams346 1:9c5643903657 25 /*===================================================================
swilliams346 1:9c5643903657 26 * Functions
swilliams346 1:9c5643903657 27 *==================================================================*/
swilliams346 1:9c5643903657 28
swilliams346 1:9c5643903657 29 void VS1002::cs_low(void)
swilliams346 1:9c5643903657 30 {
swilliams346 1:9c5643903657 31 _CS = 0;
swilliams346 1:9c5643903657 32 }
swilliams346 1:9c5643903657 33 void VS1002::cs_high(void)
swilliams346 1:9c5643903657 34 {
swilliams346 1:9c5643903657 35 _CS = 1;
swilliams346 1:9c5643903657 36 }
swilliams346 1:9c5643903657 37 void VS1002::dcs_low(void)
swilliams346 1:9c5643903657 38 {
swilliams346 1:9c5643903657 39 _DCS = 0;
swilliams346 1:9c5643903657 40 }
swilliams346 1:9c5643903657 41 void VS1002::dcs_high(void)
swilliams346 1:9c5643903657 42 {
swilliams346 1:9c5643903657 43 _DCS = 1;
swilliams346 1:9c5643903657 44 }
swilliams346 1:9c5643903657 45 void VS1002::sci_en(void) //SCI enable
swilliams346 1:9c5643903657 46 {
swilliams346 1:9c5643903657 47 cs_high();
swilliams346 1:9c5643903657 48 dcs_high();
swilliams346 1:9c5643903657 49 cs_low();
swilliams346 1:9c5643903657 50 }
swilliams346 1:9c5643903657 51 void VS1002::sci_dis(void) //SCI disable
swilliams346 1:9c5643903657 52 {
swilliams346 1:9c5643903657 53 cs_high();
swilliams346 1:9c5643903657 54 }
swilliams346 1:9c5643903657 55 void VS1002::sdi_en(void) //SDI enable
swilliams346 1:9c5643903657 56 {
swilliams346 1:9c5643903657 57 dcs_high();
swilliams346 1:9c5643903657 58 cs_high();
swilliams346 1:9c5643903657 59 dcs_low();
swilliams346 1:9c5643903657 60 }
swilliams346 1:9c5643903657 61 void VS1002::sdi_dis(void) //SDI disable
swilliams346 1:9c5643903657 62 {
swilliams346 1:9c5643903657 63 dcs_high();
swilliams346 1:9c5643903657 64 }
swilliams346 1:9c5643903657 65 void VS1002::reset(void) //hardware reset
swilliams346 1:9c5643903657 66 {
swilliams346 1:9c5643903657 67 wait(0.01);
swilliams346 1:9c5643903657 68 _RST = 0;
swilliams346 1:9c5643903657 69 wait(0.01);
swilliams346 1:9c5643903657 70 _RST = 1;
swilliams346 1:9c5643903657 71 wait(0.10);
swilliams346 1:9c5643903657 72 }
swilliams346 1:9c5643903657 73 void VS1002::power_down(void) //hardware and software reset
swilliams346 1:9c5643903657 74 {
swilliams346 1:9c5643903657 75 cs_low();
swilliams346 1:9c5643903657 76 reset();
swilliams346 1:9c5643903657 77 sci_write(0x00, SM_PDOWN);
swilliams346 1:9c5643903657 78 wait(0.01);
swilliams346 1:9c5643903657 79 reset();
swilliams346 1:9c5643903657 80 }
swilliams346 1:9c5643903657 81 void VS1002::sci_initialise(void)
swilliams346 1:9c5643903657 82 {
swilliams346 1:9c5643903657 83 _RST = 1; //no reset
swilliams346 1:9c5643903657 84 _spi.format(8,0); //spi 8bit interface, steady state low
swilliams346 1:9c5643903657 85 _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
swilliams346 1:9c5643903657 86
swilliams346 1:9c5643903657 87 cs_low();
swilliams346 1:9c5643903657 88 for(int i=0; i<4; i++)
swilliams346 1:9c5643903657 89 {
swilliams346 1:9c5643903657 90 _spi.write(0xFF); //clock the chip a bit
swilliams346 1:9c5643903657 91 }
swilliams346 1:9c5643903657 92 cs_high();
swilliams346 1:9c5643903657 93 dcs_high();
swilliams346 1:9c5643903657 94 wait_us(5);
swilliams346 1:9c5643903657 95 }
swilliams346 1:9c5643903657 96 void VS1002::sdi_initialise(void)
swilliams346 1:9c5643903657 97 {
swilliams346 1:9c5643903657 98 _spi.format(8,0);
swilliams346 1:9c5643903657 99 _spi.frequency(7000000); //set to 7MHz
swilliams346 1:9c5643903657 100
swilliams346 1:9c5643903657 101 cs_high();
swilliams346 1:9c5643903657 102 dcs_high();
swilliams346 1:9c5643903657 103 }
swilliams346 1:9c5643903657 104 void VS1002::sci_write(unsigned char address, unsigned short int data)
swilliams346 1:9c5643903657 105 {
swilliams346 1:9c5643903657 106 sci_en(); //enables SCI/disables SDI
swilliams346 1:9c5643903657 107
swilliams346 1:9c5643903657 108 while(!_DREQ); //wait unitl data request is high
swilliams346 1:9c5643903657 109 _spi.write(0x02); //SCI write
swilliams346 1:9c5643903657 110 _spi.write(address); //register address
swilliams346 1:9c5643903657 111 _spi.write((data >> 8) & 0xFF); //write out first half of data word
swilliams346 1:9c5643903657 112 _spi.write(data & 0xFF); //write out second half of data word
swilliams346 1:9c5643903657 113
swilliams346 1:9c5643903657 114 sci_dis(); //enables SDI/disables SCI
swilliams346 1:9c5643903657 115 wait_us(5);
swilliams346 1:9c5643903657 116 }
swilliams346 1:9c5643903657 117 void VS1002::sdi_write(unsigned char datum)
swilliams346 1:9c5643903657 118 {
swilliams346 1:9c5643903657 119 sdi_en();
swilliams346 1:9c5643903657 120 while(!_DREQ);
swilliams346 1:9c5643903657 121 _spi.write(datum);
swilliams346 1:9c5643903657 122 sci_dis();
swilliams346 1:9c5643903657 123 }
swilliams346 1:9c5643903657 124 unsigned short int VS1002::read(unsigned short int address)
swilliams346 1:9c5643903657 125 {
swilliams346 1:9c5643903657 126 cs_low(); //enables SCI/disables SDI
swilliams346 1:9c5643903657 127
swilliams346 1:9c5643903657 128 while(!_DREQ); //wait unitl data request is high
swilliams346 1:9c5643903657 129 _spi.write(0x03); //SCI write
swilliams346 1:9c5643903657 130 _spi.write(address); //register address
swilliams346 1:9c5643903657 131 unsigned short int received = _spi.write(0x00); //write out dummy byte
swilliams346 1:9c5643903657 132 received <<= 8;
swilliams346 1:9c5643903657 133 received += _spi.write(0x00); //write out dummy byte
swilliams346 1:9c5643903657 134
swilliams346 1:9c5643903657 135 cs_high(); //enables SDI/disables SCI
swilliams346 1:9c5643903657 136
swilliams346 1:9c5643903657 137 return received; //return received word
swilliams346 1:9c5643903657 138 }
swilliams346 1:9c5643903657 139 void VS1002::sine_test_activate(unsigned char wave)
swilliams346 1:9c5643903657 140 {
swilliams346 1:9c5643903657 141 cs_high(); //enables SDI/disables SCI
swilliams346 1:9c5643903657 142
swilliams346 1:9c5643903657 143 while(!_DREQ); //wait unitl data request is high
swilliams346 1:9c5643903657 144 _spi.write(0x53); //SDI write
swilliams346 1:9c5643903657 145 _spi.write(0xEF); //SDI write
swilliams346 1:9c5643903657 146 _spi.write(0x6E); //SDI write
swilliams346 1:9c5643903657 147 _spi.write(wave); //SDI write
swilliams346 1:9c5643903657 148 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 149 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 150 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 151 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 152
swilliams346 1:9c5643903657 153 cs_low(); //enables SCI/disables SDI
swilliams346 1:9c5643903657 154 }
swilliams346 1:9c5643903657 155 void VS1002::sine_test_deactivate(void)
swilliams346 1:9c5643903657 156 {
swilliams346 1:9c5643903657 157 cs_high();
swilliams346 1:9c5643903657 158
swilliams346 1:9c5643903657 159 while(!_DREQ);
swilliams346 1:9c5643903657 160 _spi.write(0x45); //SDI write
swilliams346 1:9c5643903657 161 _spi.write(0x78); //SDI write
swilliams346 1:9c5643903657 162 _spi.write(0x69); //SDI write
swilliams346 1:9c5643903657 163 _spi.write(0x74); //SDI write
swilliams346 1:9c5643903657 164 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 165 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 166 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 167 _spi.write(0x00); //filler byte
swilliams346 1:9c5643903657 168 }
swilliams346 1:9c5643903657 169 void VS1002::volume(void)
swilliams346 1:9c5643903657 170 {
swilliams346 1:9c5643903657 171 #ifdef FIXED_VOL
swilliams346 1:9c5643903657 172 unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input)
swilliams346 1:9c5643903657 173 #else
swilliams346 1:9c5643903657 174 unsigned char volumize = (_VOL * 255);
swilliams346 1:9c5643903657 175 #endif
swilliams346 1:9c5643903657 176 while(!_DREQ);
swilliams346 1:9c5643903657 177
swilliams346 1:9c5643903657 178 unsigned short int attenuation = ((256 * volumize) + volumize);
swilliams346 1:9c5643903657 179 sci_write(0x0B, attenuation);
swilliams346 1:9c5643903657 180
swilliams346 1:9c5643903657 181 }
swilliams346 1:9c5643903657 182
swilliams346 1:9c5643903657 183 void VS1002::play_song(int song_number)
swilliams346 1:9c5643903657 184 {
swilliams346 1:9c5643903657 185 /*====== Song Select ======*/
swilliams346 1:9c5643903657 186
swilliams346 1:9c5643903657 187 // char list[10000] = {0};
swilliams346 1:9c5643903657 188 char list[1000] = {0};
swilliams346 1:9c5643903657 189 char str[16] = {"/sd/"};
swilliams346 1:9c5643903657 190 unsigned int startplace = 0;
swilliams346 1:9c5643903657 191 unsigned int endplace = 0;
swilliams346 1:9c5643903657 192 unsigned int play = 0;
swilliams346 1:9c5643903657 193 num_of_files = 0;
swilliams346 1:9c5643903657 194
swilliams346 1:9c5643903657 195 DIR *d;
swilliams346 1:9c5643903657 196 struct dirent *p;
swilliams346 1:9c5643903657 197 d = opendir("/sd");
swilliams346 1:9c5643903657 198 if(d != NULL)
swilliams346 1:9c5643903657 199 {
swilliams346 1:9c5643903657 200 while((p = readdir(d)) != NULL)
swilliams346 1:9c5643903657 201 {
swilliams346 1:9c5643903657 202 strcat(list, "*");
swilliams346 1:9c5643903657 203 strcat(list, p->d_name);
swilliams346 1:9c5643903657 204 num_of_files++;
swilliams346 1:9c5643903657 205 }
swilliams346 1:9c5643903657 206 }
swilliams346 1:9c5643903657 207 else
swilliams346 1:9c5643903657 208 {
swilliams346 1:9c5643903657 209 perror("Could not open directory!");
swilliams346 1:9c5643903657 210 }
swilliams346 1:9c5643903657 211 strcat(list, "*"); //terminating *
swilliams346 1:9c5643903657 212 if(num_of_files < song_number)
swilliams346 1:9c5643903657 213 {
swilliams346 1:9c5643903657 214 return;
swilliams346 1:9c5643903657 215 }
swilliams346 1:9c5643903657 216 while(play != song_number)
swilliams346 1:9c5643903657 217 {
swilliams346 1:9c5643903657 218 char symbol = list[startplace];
swilliams346 1:9c5643903657 219 startplace++;
swilliams346 1:9c5643903657 220 if(symbol == 0x2A) //0x2A = "*"
swilliams346 1:9c5643903657 221 {
swilliams346 1:9c5643903657 222 play++;
swilliams346 1:9c5643903657 223 }
swilliams346 1:9c5643903657 224 }
swilliams346 1:9c5643903657 225 play = 0;
swilliams346 1:9c5643903657 226 while(play != (song_number+1))
swilliams346 1:9c5643903657 227 {
swilliams346 1:9c5643903657 228 char symbol = list[endplace];
swilliams346 1:9c5643903657 229 endplace++;
swilliams346 1:9c5643903657 230 if(symbol == 0x2A) //0x2A = "*"
swilliams346 1:9c5643903657 231 {
swilliams346 1:9c5643903657 232 play++;
swilliams346 1:9c5643903657 233 }
swilliams346 1:9c5643903657 234 }
swilliams346 1:9c5643903657 235
swilliams346 1:9c5643903657 236 strncat(str, &list[startplace], endplace-startplace);
swilliams346 1:9c5643903657 237 str[(endplace-startplace)+3] = '\0';
swilliams346 1:9c5643903657 238
swilliams346 1:9c5643903657 239 //printf("list: %s\r\n",list); //debug
swilliams346 1:9c5643903657 240
swilliams346 1:9c5643903657 241 /*====== File Transfer ======*/
swilliams346 1:9c5643903657 242
swilliams346 1:9c5643903657 243 // return if not MP3 file
swilliams346 1:9c5643903657 244 if (!((strstr(str,"MP3")!=NULL)||(strstr(str,"mp3")!=NULL))) return;
swilliams346 1:9c5643903657 245 // display filename.mp3 to the lcd screen
swilliams346 1:9c5643903657 246 //lcd.printf("Now Playing: %s\r\n",str);
swilliams346 1:9c5643903657 247
swilliams346 1:9c5643903657 248 FILE *song;
swilliams346 1:9c5643903657 249 unsigned char array[512];
swilliams346 1:9c5643903657 250
swilliams346 1:9c5643903657 251 song = fopen(str, "rb");
swilliams346 1:9c5643903657 252
swilliams346 1:9c5643903657 253 if(!song)
swilliams346 1:9c5643903657 254 {
swilliams346 1:9c5643903657 255 exit(1);
swilliams346 1:9c5643903657 256 }
swilliams346 1:9c5643903657 257
swilliams346 1:9c5643903657 258 while((!feof(song))&&!pause1)
swilliams346 1:9c5643903657 259 {
swilliams346 1:9c5643903657 260 fread(&array, 1, 512, song);
swilliams346 1:9c5643903657 261 for(int i=0; i<512; i++)
swilliams346 1:9c5643903657 262 {
swilliams346 1:9c5643903657 263 #ifndef FS_ONLY
swilliams346 1:9c5643903657 264 sdi_write(array[i]);
swilliams346 1:9c5643903657 265 // printf(".");
swilliams346 1:9c5643903657 266 #endif
swilliams346 1:9c5643903657 267 }
swilliams346 1:9c5643903657 268 #ifndef FS_ONLY
swilliams346 1:9c5643903657 269 volume();
swilliams346 1:9c5643903657 270 #endif
swilliams346 1:9c5643903657 271 }
swilliams346 1:9c5643903657 272 for(int n=0; n<2048; n++)
swilliams346 1:9c5643903657 273 {
swilliams346 1:9c5643903657 274 #ifndef FS_ONLY
swilliams346 1:9c5643903657 275 sdi_write(0x00);
swilliams346 1:9c5643903657 276 #endif
swilliams346 1:9c5643903657 277 }
swilliams346 1:9c5643903657 278 fclose(song); //close the file
swilliams346 1:9c5643903657 279 }