Dependents: MP3_player_on_Orange
Revision 0:9abce67c084e, committed 2012-03-14
- Comitter:
- nameless129
- Date:
- Wed Mar 14 14:08:32 2012 +0000
- Commit message:
Changed in this revision
VS1002.cpp | Show annotated file Show diff for this revision Revisions of this file |
VS1002.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 9abce67c084e VS1002.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VS1002.cpp Wed Mar 14 14:08:32 2012 +0000 @@ -0,0 +1,279 @@ +#include "VS1002.h" +#include "mbed.h" + + +Serial pc(USBTX, USBRX); + +/* ================================================================== + * Constructor + * =================================================================*/ +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) + : + _sd(mmosi, mmiso, ssck, ccs, name), + _spi(mosi, miso, sck), + _CS(cs), + _RST(rst), + _DREQ(dreq), + _DCS(dcs), + _VOL(vol) { + + } + +/*=================================================================== + * Functions + *==================================================================*/ + +void VS1002::cs_low(void) +{ + _CS = 0; +} +void VS1002::cs_high(void) +{ + _CS = 1; +} +void VS1002::dcs_low(void) +{ + _DCS = 0; +} +void VS1002::dcs_high(void) +{ + _DCS = 1; +} +void VS1002::sci_en(void) //SCI enable +{ + cs_high(); + dcs_high(); + cs_low(); +} +void VS1002::sci_dis(void) //SCI disable +{ + cs_high(); +} +void VS1002::sdi_en(void) //SDI enable +{ + dcs_high(); + cs_high(); + dcs_low(); +} +void VS1002::sdi_dis(void) //SDI disable +{ + dcs_high(); +} +void VS1002::reset(void) //hardware reset +{ + wait(0.01); + _RST = 0; + wait(0.01); + _RST = 1; + wait(0.10); +} +void VS1002::power_down(void) //hardware and software reset +{ + cs_low(); + reset(); + sci_write(0x00, SM_PDOWN); + wait(0.01); + reset(); +} +void VS1002::sci_initialise(void) +{ + _RST = 1; //no reset + _spi.format(8,0); //spi 8bit interface, steady state low + _spi.frequency(1000000); //rising edge data record, freq. 1Mhz + + cs_low(); + for(int i=0; i<4; i++) + { + _spi.write(0xFF); //clock the chip a bit + } + cs_high(); + dcs_high(); + wait_us(5); +} +void VS1002::sdi_initialise(void) +{ + _spi.format(8,0); + _spi.frequency(7000000); //set to 7MHz + + cs_high(); + dcs_high(); +} +void VS1002::sci_write(unsigned char address, unsigned short int data) +{ + sci_en(); //enables SCI/disables SDI + + while(!_DREQ); //wait unitl data request is high + _spi.write(0x02); //SCI write + _spi.write(address); //register address + _spi.write((data >> 8) & 0xFF); //write out first half of data word + _spi.write(data & 0xFF); //write out second half of data word + + sci_dis(); //enables SDI/disables SCI + wait_us(5); +} +void VS1002::sdi_write(unsigned char datum) +{ + sdi_en(); + + while(!_DREQ); + _spi.write(datum); + + sci_dis(); +} +unsigned short int VS1002::read(unsigned short int address) +{ + cs_low(); //enables SCI/disables SDI + + while(!_DREQ); //wait unitl data request is high + _spi.write(0x03); //SCI write + _spi.write(address); //register address + unsigned short int received = _spi.write(0x00); //write out dummy byte + received <<= 8; + received += _spi.write(0x00); //write out dummy byte + + cs_high(); //enables SDI/disables SCI + + return received; //return received word +} +void VS1002::sine_test_activate(unsigned char wave) +{ + cs_high(); //enables SDI/disables SCI + + while(!_DREQ); //wait unitl data request is high + _spi.write(0x53); //SDI write + _spi.write(0xEF); //SDI write + _spi.write(0x6E); //SDI write + _spi.write(wave); //SDI write + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte + + cs_low(); //enables SCI/disables SDI +} +void VS1002::sine_test_deactivate(void) +{ + cs_high(); + + while(!_DREQ); + _spi.write(0x45); //SDI write + _spi.write(0x78); //SDI write + _spi.write(0x69); //SDI write + _spi.write(0x74); //SDI write + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte + _spi.write(0x00); //filler byte +} +void VS1002::volume(void) +{ + #ifdef FIXED_VOL + unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input) + #else + unsigned char volumize = (_VOL * 255); + #endif + while(!_DREQ); + unsigned short int attenuation = ((256 * volumize) + volumize); + sci_write(0x0B, attenuation); +} + +void VS1002::play_song(int song_number) +{ + /*====== Song Select ======*/ + +// char list[10000] = {0}; + char list[1000] = {0}; + char str[16] = {"/sd/"}; + unsigned int startplace = 0; + unsigned int endplace = 0; + unsigned int play = 0; + num_of_files = 0; + + DIR *d; + struct dirent *p; + d = opendir("/sd"); + if(d != NULL) + { + while((p = readdir(d)) != NULL) + { + strcat(list, "*"); + strcat(list, p->d_name); + num_of_files++; + } + } + else + { + perror("Could not open directory!"); + } + strcat(list, "*"); //terminating * + if(num_of_files < song_number) + { + return; + } + while(play != song_number) + { + char symbol = list[startplace]; + startplace++; + if(symbol == 0x2A) //0x2A = "*" + { + play++; + } + } + play = 0; + while(play != (song_number+1)) + { + char symbol = list[endplace]; + endplace++; + if(symbol == 0x2A) //0x2A = "*" + { + play++; + } + } + + strncat(str, &list[startplace], endplace-startplace); + str[(endplace-startplace)+3] = '\0'; + +//printf("list: %s\r\n",list); //debug + + /*====== File Transfer ======*/ + + // return if not MP3 file + if (!((strstr(str,"MP3")!=NULL)||(strstr(str,"mp3")!=NULL))) return; + // display filename.mp3 + printf("Now Playing: %s\r\n",str); + + FILE *song; + unsigned char array[512]; + + song = fopen(str, "rb"); + + if(!song) + { + exit(1); + } + + while(!feof(song)) + { + fread(&array, 1, 512, song); + for(int i=0; i<512; i++) + { +#ifndef FS_ONLY + sdi_write(array[i]); + // printf("."); +#endif + } +#ifndef FS_ONLY + volume(); +#endif + } + for(int n=0; n<2048; n++) + { +#ifndef FS_ONLY + sdi_write(0x00); +#endif + } + fclose(song); //close the file +}
diff -r 000000000000 -r 9abce67c084e VS1002.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VS1002.h Wed Mar 14 14:08:32 2012 +0000 @@ -0,0 +1,77 @@ +#ifndef VS1002_H +#define VS1002_H + +//file system only +//#define FS_ONLY + +//no vol control +//#define FIXED_VOL + +#include "mbed.h" +#include "SDFileSystem.h" +#include "string" +#include "string.h" + +//SCI_MODE register bits as of p.26 of the datasheet +#define SM_DIFF 0x0001 +#define SM_SETTOZERO 0x0002 +#define SM_RESET 0x0004 +#define SM_OUTOFWAV 0x0008 +#define SM_PDOWN 0x0010 +#define SM_TESTS 0x0020 +#define SM_STREAM 0x0040 +#define SM_PLUSV 0x0080 +#define SM_DACT 0x0100 +#define SM_SDIORD 0x0200 +#define SM_SDISHARE 0x0400 +#define SM_SDINEW 0x0800 +#define SM_ADPCM 0x1000 +#define SM_ADPCM_HP 0x2000 + + +class VS1002 { + +public: +// VS1002(int _mmosi, int _mmiso, int _ssck, int _ccs, const char* _name, +// int _mosi, int _miso, int _sck, int _cs, int _rst, int _dreq, int _dcs, int _vol); + 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); + + void cs_low(void); + void cs_high(void); + void dcs_low(void); + void dcs_high(void); + void sci_en(void); + void sci_dis(void); + void sdi_en(void); + void sdi_dis(void); + + void sci_initialise(void); + void sdi_initialise(void); + void reset(void); + void power_down(void); + + void sci_write(unsigned char, unsigned short int); + void sdi_write(unsigned char); + unsigned short int read(unsigned short int); + void sine_test_activate(unsigned char); + void volume(void); + void sine_test_deactivate(void); + void play_song(int); + + int num_of_files; + + DigitalIn _DREQ; + DigitalOut _RST; + AnalogIn _VOL; + +protected: + + SPI _spi; + DigitalOut _CS; + DigitalOut _DCS; + SDFileSystem _sd; + +}; +#endif