MP3 Player with touch panel interface and LCD display.

Dependencies:   TextLCD mbed SDFileSystem

Committer:
pramodnataraja
Date:
Thu Oct 06 06:49:38 2011 +0000
Revision:
0:a265079d50a2
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pramodnataraja 0:a265079d50a2 1 #include "VS1002.h"
pramodnataraja 0:a265079d50a2 2 #include "mbed.h"
pramodnataraja 0:a265079d50a2 3
pramodnataraja 0:a265079d50a2 4 Serial pc(USBTX, USBRX);
pramodnataraja 0:a265079d50a2 5 TextLCD lcd(p30, p29, p17, p18, p19, p20);
pramodnataraja 0:a265079d50a2 6
pramodnataraja 0:a265079d50a2 7 /* ==================================================================
pramodnataraja 0:a265079d50a2 8 * Constructor
pramodnataraja 0:a265079d50a2 9 * =================================================================*/
pramodnataraja 0:a265079d50a2 10
pramodnataraja 0:a265079d50a2 11 VS1002::VS1002(PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name, PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs, PinName vol)
pramodnataraja 0:a265079d50a2 12 : _sd(mmosi, mmiso, ssck, ccs, name), _spi(mosi, miso, sck), _CS(cs), _RST(rst), _DREQ(dreq), _DCS(dcs), _VOL(vol) {
pramodnataraja 0:a265079d50a2 13
pramodnataraja 0:a265079d50a2 14 }
pramodnataraja 0:a265079d50a2 15
pramodnataraja 0:a265079d50a2 16 /*===================================================================
pramodnataraja 0:a265079d50a2 17 * Functions
pramodnataraja 0:a265079d50a2 18 *==================================================================*/
pramodnataraja 0:a265079d50a2 19
pramodnataraja 0:a265079d50a2 20 void VS1002::cs_low(void)
pramodnataraja 0:a265079d50a2 21 {
pramodnataraja 0:a265079d50a2 22 _CS = 0;
pramodnataraja 0:a265079d50a2 23 }
pramodnataraja 0:a265079d50a2 24 void VS1002::cs_high(void)
pramodnataraja 0:a265079d50a2 25 {
pramodnataraja 0:a265079d50a2 26 _CS = 1;
pramodnataraja 0:a265079d50a2 27 }
pramodnataraja 0:a265079d50a2 28 void VS1002::dcs_low(void)
pramodnataraja 0:a265079d50a2 29 {
pramodnataraja 0:a265079d50a2 30 _DCS = 0;
pramodnataraja 0:a265079d50a2 31 }
pramodnataraja 0:a265079d50a2 32 void VS1002::dcs_high(void)
pramodnataraja 0:a265079d50a2 33 {
pramodnataraja 0:a265079d50a2 34 _DCS = 1;
pramodnataraja 0:a265079d50a2 35 }
pramodnataraja 0:a265079d50a2 36 void VS1002::sci_en(void) //SCI enable
pramodnataraja 0:a265079d50a2 37 {
pramodnataraja 0:a265079d50a2 38 cs_high();
pramodnataraja 0:a265079d50a2 39 dcs_high();
pramodnataraja 0:a265079d50a2 40 cs_low();
pramodnataraja 0:a265079d50a2 41 }
pramodnataraja 0:a265079d50a2 42 void VS1002::sci_dis(void) //SCI disable
pramodnataraja 0:a265079d50a2 43 {
pramodnataraja 0:a265079d50a2 44 cs_high();
pramodnataraja 0:a265079d50a2 45 }
pramodnataraja 0:a265079d50a2 46 void VS1002::sdi_en(void) //SDI enable
pramodnataraja 0:a265079d50a2 47 {
pramodnataraja 0:a265079d50a2 48 dcs_high();
pramodnataraja 0:a265079d50a2 49 cs_high();
pramodnataraja 0:a265079d50a2 50 dcs_low();
pramodnataraja 0:a265079d50a2 51 }
pramodnataraja 0:a265079d50a2 52 void VS1002::sdi_dis(void) //SDI disable
pramodnataraja 0:a265079d50a2 53 {
pramodnataraja 0:a265079d50a2 54 dcs_high();
pramodnataraja 0:a265079d50a2 55 }
pramodnataraja 0:a265079d50a2 56 void VS1002::reset(void) //hardware reset
pramodnataraja 0:a265079d50a2 57 {
pramodnataraja 0:a265079d50a2 58 wait(0.01);
pramodnataraja 0:a265079d50a2 59 _RST = 0;
pramodnataraja 0:a265079d50a2 60 wait(0.01);
pramodnataraja 0:a265079d50a2 61 _RST = 1;
pramodnataraja 0:a265079d50a2 62 wait(0.10);
pramodnataraja 0:a265079d50a2 63 }
pramodnataraja 0:a265079d50a2 64 void VS1002::power_down(void) //hardware and software reset
pramodnataraja 0:a265079d50a2 65 {
pramodnataraja 0:a265079d50a2 66 cs_low();
pramodnataraja 0:a265079d50a2 67 reset();
pramodnataraja 0:a265079d50a2 68 sci_write(0x00, SM_PDOWN);
pramodnataraja 0:a265079d50a2 69 wait(0.01);
pramodnataraja 0:a265079d50a2 70 reset();
pramodnataraja 0:a265079d50a2 71 }
pramodnataraja 0:a265079d50a2 72 void VS1002::sci_initialise(void)
pramodnataraja 0:a265079d50a2 73 {
pramodnataraja 0:a265079d50a2 74 _RST = 1; //no reset
pramodnataraja 0:a265079d50a2 75 _spi.format(8,0); //spi 8bit interface, steady state low
pramodnataraja 0:a265079d50a2 76 _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
pramodnataraja 0:a265079d50a2 77
pramodnataraja 0:a265079d50a2 78 cs_low();
pramodnataraja 0:a265079d50a2 79 for(int i=0; i<4; i++)
pramodnataraja 0:a265079d50a2 80 {
pramodnataraja 0:a265079d50a2 81 _spi.write(0xFF); //clock the chip a bit
pramodnataraja 0:a265079d50a2 82 }
pramodnataraja 0:a265079d50a2 83 cs_high();
pramodnataraja 0:a265079d50a2 84 dcs_high();
pramodnataraja 0:a265079d50a2 85 wait_us(5);
pramodnataraja 0:a265079d50a2 86 }
pramodnataraja 0:a265079d50a2 87 void VS1002::sdi_initialise(void)
pramodnataraja 0:a265079d50a2 88 {
pramodnataraja 0:a265079d50a2 89 _spi.format(8,0);
pramodnataraja 0:a265079d50a2 90 _spi.frequency(7000000); //set to 7MHz
pramodnataraja 0:a265079d50a2 91
pramodnataraja 0:a265079d50a2 92 cs_high();
pramodnataraja 0:a265079d50a2 93 dcs_high();
pramodnataraja 0:a265079d50a2 94 }
pramodnataraja 0:a265079d50a2 95 void VS1002::sci_write(unsigned char address, unsigned short int data)
pramodnataraja 0:a265079d50a2 96 {
pramodnataraja 0:a265079d50a2 97 sci_en(); //enables SCI/disables SDI
pramodnataraja 0:a265079d50a2 98
pramodnataraja 0:a265079d50a2 99 while(!_DREQ); //wait unitl data request is high
pramodnataraja 0:a265079d50a2 100 _spi.write(0x02); //SCI write
pramodnataraja 0:a265079d50a2 101 _spi.write(address); //register address
pramodnataraja 0:a265079d50a2 102 _spi.write((data >> 8) & 0xFF); //write out first half of data word
pramodnataraja 0:a265079d50a2 103 _spi.write(data & 0xFF); //write out second half of data word
pramodnataraja 0:a265079d50a2 104
pramodnataraja 0:a265079d50a2 105 sci_dis(); //enables SDI/disables SCI
pramodnataraja 0:a265079d50a2 106 wait_us(5);
pramodnataraja 0:a265079d50a2 107 }
pramodnataraja 0:a265079d50a2 108 void VS1002::sdi_write(unsigned char datum)
pramodnataraja 0:a265079d50a2 109 {
pramodnataraja 0:a265079d50a2 110 sdi_en();
pramodnataraja 0:a265079d50a2 111
pramodnataraja 0:a265079d50a2 112 while(!_DREQ);
pramodnataraja 0:a265079d50a2 113 _spi.write(datum);
pramodnataraja 0:a265079d50a2 114
pramodnataraja 0:a265079d50a2 115 sci_dis();
pramodnataraja 0:a265079d50a2 116 }
pramodnataraja 0:a265079d50a2 117 unsigned short int VS1002::read(unsigned short int address)
pramodnataraja 0:a265079d50a2 118 {
pramodnataraja 0:a265079d50a2 119 cs_low(); //enables SCI/disables SDI
pramodnataraja 0:a265079d50a2 120
pramodnataraja 0:a265079d50a2 121 while(!_DREQ); //wait unitl data request is high
pramodnataraja 0:a265079d50a2 122 _spi.write(0x03); //SCI write
pramodnataraja 0:a265079d50a2 123 _spi.write(address); //register address
pramodnataraja 0:a265079d50a2 124 unsigned short int received = _spi.write(0x00); //write out dummy byte
pramodnataraja 0:a265079d50a2 125 received <<= 8;
pramodnataraja 0:a265079d50a2 126 received += _spi.write(0x00); //write out dummy byte
pramodnataraja 0:a265079d50a2 127
pramodnataraja 0:a265079d50a2 128 cs_high(); //enables SDI/disables SCI
pramodnataraja 0:a265079d50a2 129
pramodnataraja 0:a265079d50a2 130 return received; //return received word
pramodnataraja 0:a265079d50a2 131 }
pramodnataraja 0:a265079d50a2 132 void VS1002::sine_test_activate(unsigned char wave)
pramodnataraja 0:a265079d50a2 133 {
pramodnataraja 0:a265079d50a2 134 cs_high(); //enables SDI/disables SCI
pramodnataraja 0:a265079d50a2 135
pramodnataraja 0:a265079d50a2 136 while(!_DREQ); //wait unitl data request is high
pramodnataraja 0:a265079d50a2 137 _spi.write(0x53); //SDI write
pramodnataraja 0:a265079d50a2 138 _spi.write(0xEF); //SDI write
pramodnataraja 0:a265079d50a2 139 _spi.write(0x6E); //SDI write
pramodnataraja 0:a265079d50a2 140 _spi.write(wave); //SDI write
pramodnataraja 0:a265079d50a2 141 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 142 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 143 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 144 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 145
pramodnataraja 0:a265079d50a2 146 cs_low(); //enables SCI/disables SDI
pramodnataraja 0:a265079d50a2 147 }
pramodnataraja 0:a265079d50a2 148 void VS1002::sine_test_deactivate(void)
pramodnataraja 0:a265079d50a2 149 {
pramodnataraja 0:a265079d50a2 150 cs_high();
pramodnataraja 0:a265079d50a2 151
pramodnataraja 0:a265079d50a2 152 while(!_DREQ);
pramodnataraja 0:a265079d50a2 153 _spi.write(0x45); //SDI write
pramodnataraja 0:a265079d50a2 154 _spi.write(0x78); //SDI write
pramodnataraja 0:a265079d50a2 155 _spi.write(0x69); //SDI write
pramodnataraja 0:a265079d50a2 156 _spi.write(0x74); //SDI write
pramodnataraja 0:a265079d50a2 157 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 158 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 159 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 160 _spi.write(0x00); //filler byte
pramodnataraja 0:a265079d50a2 161 }
pramodnataraja 0:a265079d50a2 162
pramodnataraja 0:a265079d50a2 163
pramodnataraja 0:a265079d50a2 164 void VS1002::volume(signed int left, signed int right)
pramodnataraja 0:a265079d50a2 165 {
pramodnataraja 0:a265079d50a2 166 while(_DREQ == 0);
pramodnataraja 0:a265079d50a2 167
pramodnataraja 0:a265079d50a2 168 unsigned short int _left = -left; //convert the decibel values into a format
pramodnataraja 0:a265079d50a2 169 unsigned short int _right = -right; //readable by the chip cf. datasheet p.32 subsection 8.6.11
pramodnataraja 0:a265079d50a2 170 _left *= 2;
pramodnataraja 0:a265079d50a2 171 _right *= 2;
pramodnataraja 0:a265079d50a2 172 unsigned short int attenuation = ((256 * _left) + _right);
pramodnataraja 0:a265079d50a2 173 cs_low();
pramodnataraja 0:a265079d50a2 174 sci_write(0x0B, attenuation); //writeout these values
pramodnataraja 0:a265079d50a2 175 cs_high();
pramodnataraja 0:a265079d50a2 176 }
pramodnataraja 0:a265079d50a2 177
pramodnataraja 0:a265079d50a2 178 void VS1002::play_song(int song_number)
pramodnataraja 0:a265079d50a2 179 {
pramodnataraja 0:a265079d50a2 180 /*====== Song Select ======*/
pramodnataraja 0:a265079d50a2 181
pramodnataraja 0:a265079d50a2 182 char str[16] = "/sd/music/"; //folder where the songs are located
pramodnataraja 0:a265079d50a2 183 sprintf(str+10,"%d",song_number); //appending song number to path of the file
pramodnataraja 0:a265079d50a2 184 strcat(str,".mp3"); //appending .mp3 to file name
pramodnataraja 0:a265079d50a2 185 FILE *song;
pramodnataraja 0:a265079d50a2 186 unsigned char array[512]; //array for reading data from file
pramodnataraja 0:a265079d50a2 187 bool play_new=false; // Variable to see if new_song has be assigned or not
pramodnataraja 0:a265079d50a2 188
pramodnataraja 0:a265079d50a2 189 song = fopen(str, "r"); // Open the music file in read mode
pramodnataraja 0:a265079d50a2 190
pramodnataraja 0:a265079d50a2 191 /* Printing to LCD the present status */
pramodnataraja 0:a265079d50a2 192 lcd.cls();
pramodnataraja 0:a265079d50a2 193 if(pause)
pramodnataraja 0:a265079d50a2 194 lcd.printf("Paused ");
pramodnataraja 0:a265079d50a2 195 if(mute)
pramodnataraja 0:a265079d50a2 196 lcd.printf("Muted");
pramodnataraja 0:a265079d50a2 197 if(!mute && !pause)
pramodnataraja 0:a265079d50a2 198 lcd.printf("Playing");
pramodnataraja 0:a265079d50a2 199
pramodnataraja 0:a265079d50a2 200 lcd.printf("\n %d %s",new_song_number,song_name[new_song_number-1]);
pramodnataraja 0:a265079d50a2 201
pramodnataraja 0:a265079d50a2 202 if(!song)
pramodnataraja 0:a265079d50a2 203 {
pramodnataraja 0:a265079d50a2 204 lcd.printf("\n \n Error!!");
pramodnataraja 0:a265079d50a2 205 exit(1);
pramodnataraja 0:a265079d50a2 206 }
pramodnataraja 0:a265079d50a2 207 while(!feof(song))
pramodnataraja 0:a265079d50a2 208 {
pramodnataraja 0:a265079d50a2 209 if(!pause)
pramodnataraja 0:a265079d50a2 210 {
pramodnataraja 0:a265079d50a2 211
pramodnataraja 0:a265079d50a2 212 fread(&array, 1, 512, song);
pramodnataraja 0:a265079d50a2 213 for(int i=0; i<512; i++)
pramodnataraja 0:a265079d50a2 214 {
pramodnataraja 0:a265079d50a2 215 sdi_write(array[i]);
pramodnataraja 0:a265079d50a2 216 }
pramodnataraja 0:a265079d50a2 217 volume(volume_set,volume_set);
pramodnataraja 0:a265079d50a2 218 }
pramodnataraja 0:a265079d50a2 219 if(new_song_number!=song_number)
pramodnataraja 0:a265079d50a2 220 {
pramodnataraja 0:a265079d50a2 221 play_new=true;
pramodnataraja 0:a265079d50a2 222 break;
pramodnataraja 0:a265079d50a2 223 }
pramodnataraja 0:a265079d50a2 224
pramodnataraja 0:a265079d50a2 225
pramodnataraja 0:a265079d50a2 226 }
pramodnataraja 0:a265079d50a2 227
pramodnataraja 0:a265079d50a2 228 fclose(song); //close the file
pramodnataraja 0:a265079d50a2 229
pramodnataraja 0:a265079d50a2 230 if(!play_new)
pramodnataraja 0:a265079d50a2 231 {
pramodnataraja 0:a265079d50a2 232 new_song_number+=1; // Goto Next song on completion of one song
pramodnataraja 0:a265079d50a2 233 if(new_song_number==7)
pramodnataraja 0:a265079d50a2 234 new_song_number=1;
pramodnataraja 0:a265079d50a2 235 play_new=false;
pramodnataraja 0:a265079d50a2 236 }
pramodnataraja 0:a265079d50a2 237 }