Dependents:   MP3_player_on_Orange

Files at this revision

API Documentation at this revision

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