Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MP3_player_on_Orange
VS1002.cpp
00001 #include "VS1002.h" 00002 #include "mbed.h" 00003 00004 00005 Serial pc(USBTX, USBRX); 00006 00007 /* ================================================================== 00008 * Constructor 00009 * =================================================================*/ 00010 VS1002::VS1002( 00011 PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name, 00012 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, 00013 PinName dreq, PinName dcs, PinName vol) 00014 : 00015 _sd(mmosi, mmiso, ssck, ccs, name), 00016 _spi(mosi, miso, sck), 00017 _CS(cs), 00018 _RST(rst), 00019 _DREQ(dreq), 00020 _DCS(dcs), 00021 _VOL(vol) { 00022 00023 } 00024 00025 /*=================================================================== 00026 * Functions 00027 *==================================================================*/ 00028 00029 void VS1002::cs_low(void) 00030 { 00031 _CS = 0; 00032 } 00033 void VS1002::cs_high(void) 00034 { 00035 _CS = 1; 00036 } 00037 void VS1002::dcs_low(void) 00038 { 00039 _DCS = 0; 00040 } 00041 void VS1002::dcs_high(void) 00042 { 00043 _DCS = 1; 00044 } 00045 void VS1002::sci_en(void) //SCI enable 00046 { 00047 cs_high(); 00048 dcs_high(); 00049 cs_low(); 00050 } 00051 void VS1002::sci_dis(void) //SCI disable 00052 { 00053 cs_high(); 00054 } 00055 void VS1002::sdi_en(void) //SDI enable 00056 { 00057 dcs_high(); 00058 cs_high(); 00059 dcs_low(); 00060 } 00061 void VS1002::sdi_dis(void) //SDI disable 00062 { 00063 dcs_high(); 00064 } 00065 void VS1002::reset(void) //hardware reset 00066 { 00067 wait(0.01); 00068 _RST = 0; 00069 wait(0.01); 00070 _RST = 1; 00071 wait(0.10); 00072 } 00073 void VS1002::power_down(void) //hardware and software reset 00074 { 00075 cs_low(); 00076 reset(); 00077 sci_write(0x00, SM_PDOWN); 00078 wait(0.01); 00079 reset(); 00080 } 00081 void VS1002::sci_initialise(void) 00082 { 00083 _RST = 1; //no reset 00084 _spi.format(8,0); //spi 8bit interface, steady state low 00085 _spi.frequency(1000000); //rising edge data record, freq. 1Mhz 00086 00087 cs_low(); 00088 for(int i=0; i<4; i++) 00089 { 00090 _spi.write(0xFF); //clock the chip a bit 00091 } 00092 cs_high(); 00093 dcs_high(); 00094 wait_us(5); 00095 } 00096 void VS1002::sdi_initialise(void) 00097 { 00098 _spi.format(8,0); 00099 _spi.frequency(7000000); //set to 7MHz 00100 00101 cs_high(); 00102 dcs_high(); 00103 } 00104 void VS1002::sci_write(unsigned char address, unsigned short int data) 00105 { 00106 sci_en(); //enables SCI/disables SDI 00107 00108 while(!_DREQ); //wait unitl data request is high 00109 _spi.write(0x02); //SCI write 00110 _spi.write(address); //register address 00111 _spi.write((data >> 8) & 0xFF); //write out first half of data word 00112 _spi.write(data & 0xFF); //write out second half of data word 00113 00114 sci_dis(); //enables SDI/disables SCI 00115 wait_us(5); 00116 } 00117 void VS1002::sdi_write(unsigned char datum) 00118 { 00119 sdi_en(); 00120 00121 while(!_DREQ); 00122 _spi.write(datum); 00123 00124 sci_dis(); 00125 } 00126 unsigned short int VS1002::read(unsigned short int address) 00127 { 00128 cs_low(); //enables SCI/disables SDI 00129 00130 while(!_DREQ); //wait unitl data request is high 00131 _spi.write(0x03); //SCI write 00132 _spi.write(address); //register address 00133 unsigned short int received = _spi.write(0x00); //write out dummy byte 00134 received <<= 8; 00135 received += _spi.write(0x00); //write out dummy byte 00136 00137 cs_high(); //enables SDI/disables SCI 00138 00139 return received; //return received word 00140 } 00141 void VS1002::sine_test_activate(unsigned char wave) 00142 { 00143 cs_high(); //enables SDI/disables SCI 00144 00145 while(!_DREQ); //wait unitl data request is high 00146 _spi.write(0x53); //SDI write 00147 _spi.write(0xEF); //SDI write 00148 _spi.write(0x6E); //SDI write 00149 _spi.write(wave); //SDI write 00150 _spi.write(0x00); //filler byte 00151 _spi.write(0x00); //filler byte 00152 _spi.write(0x00); //filler byte 00153 _spi.write(0x00); //filler byte 00154 00155 cs_low(); //enables SCI/disables SDI 00156 } 00157 void VS1002::sine_test_deactivate(void) 00158 { 00159 cs_high(); 00160 00161 while(!_DREQ); 00162 _spi.write(0x45); //SDI write 00163 _spi.write(0x78); //SDI write 00164 _spi.write(0x69); //SDI write 00165 _spi.write(0x74); //SDI write 00166 _spi.write(0x00); //filler byte 00167 _spi.write(0x00); //filler byte 00168 _spi.write(0x00); //filler byte 00169 _spi.write(0x00); //filler byte 00170 } 00171 void VS1002::volume(void) 00172 { 00173 #ifdef FIXED_VOL 00174 unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input) 00175 #else 00176 unsigned char volumize = (_VOL * 255); 00177 #endif 00178 while(!_DREQ); 00179 unsigned short int attenuation = ((256 * volumize) + volumize); 00180 sci_write(0x0B, attenuation); 00181 } 00182 00183 void VS1002::play_song(int song_number) 00184 { 00185 /*====== Song Select ======*/ 00186 00187 // char list[10000] = {0}; 00188 char list[1000] = {0}; 00189 char str[16] = {"/sd/"}; 00190 unsigned int startplace = 0; 00191 unsigned int endplace = 0; 00192 unsigned int play = 0; 00193 num_of_files = 0; 00194 00195 DIR *d; 00196 struct dirent *p; 00197 d = opendir("/sd"); 00198 if(d != NULL) 00199 { 00200 while((p = readdir(d)) != NULL) 00201 { 00202 strcat(list, "*"); 00203 strcat(list, p->d_name); 00204 num_of_files++; 00205 } 00206 } 00207 else 00208 { 00209 perror("Could not open directory!"); 00210 } 00211 strcat(list, "*"); //terminating * 00212 if(num_of_files < song_number) 00213 { 00214 return; 00215 } 00216 while(play != song_number) 00217 { 00218 char symbol = list[startplace]; 00219 startplace++; 00220 if(symbol == 0x2A) //0x2A = "*" 00221 { 00222 play++; 00223 } 00224 } 00225 play = 0; 00226 while(play != (song_number+1)) 00227 { 00228 char symbol = list[endplace]; 00229 endplace++; 00230 if(symbol == 0x2A) //0x2A = "*" 00231 { 00232 play++; 00233 } 00234 } 00235 00236 strncat(str, &list[startplace], endplace-startplace); 00237 str[(endplace-startplace)+3] = '\0'; 00238 00239 //printf("list: %s\r\n",list); //debug 00240 00241 /*====== File Transfer ======*/ 00242 00243 // return if not MP3 file 00244 if (!((strstr(str,"MP3")!=NULL)||(strstr(str,"mp3")!=NULL))) return; 00245 // display filename.mp3 00246 printf("Now Playing: %s\r\n",str); 00247 00248 FILE *song; 00249 unsigned char array[512]; 00250 00251 song = fopen(str, "rb"); 00252 00253 if(!song) 00254 { 00255 exit(1); 00256 } 00257 00258 while(!feof(song)) 00259 { 00260 fread(&array, 1, 512, song); 00261 for(int i=0; i<512; i++) 00262 { 00263 #ifndef FS_ONLY 00264 sdi_write(array[i]); 00265 // printf("."); 00266 #endif 00267 } 00268 #ifndef FS_ONLY 00269 volume(); 00270 #endif 00271 } 00272 for(int n=0; n<2048; n++) 00273 { 00274 #ifndef FS_ONLY 00275 sdi_write(0x00); 00276 #endif 00277 } 00278 fclose(song); //close the file 00279 }
Generated on Tue Aug 16 2022 02:03:51 by
1.7.2