This program plays an internet radio audio stream like Shoutcast.

Dependencies:   EthernetNetIf mbed HTTPClient

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers VS1002.cpp Source File

VS1002.cpp

00001 
00002 
00003 #include "VS1002.h"
00004 #include "mbed.h"
00005 #include "MSCFileSystem.h"
00006 
00007 
00008 /* ==================================================================
00009  * Constructor
00010  * =================================================================*/
00011 
00012 VS1002::VS1002(PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs, PinName vol)
00013 :_spi(mosi, miso, sck), _CS(cs), _RST(rst), _DREQ(dreq), _DCS(dcs), _VOL(vol)
00014 {      
00015 
00016 }   
00017 
00018 
00019 /*===================================================================
00020  * Functions
00021  *==================================================================*/
00022  
00023 void VS1002::cs_low(void)
00024 {
00025     _CS = 0;                                
00026 }
00027 void VS1002::cs_high(void)
00028 {
00029     _CS = 1;                                
00030 }
00031 void VS1002::dcs_low(void)
00032 {
00033     _DCS = 0;
00034 }
00035 void VS1002::dcs_high(void)
00036 {
00037     _DCS = 1;
00038 }
00039 void VS1002::sci_en(void)                    //SCI enable
00040 {
00041     cs_high();
00042     dcs_high();
00043     cs_low();
00044 }
00045 void VS1002::sci_dis(void)                    //SCI disable
00046 {
00047     cs_high();
00048 }
00049 void VS1002::sdi_en(void)                    //SDI enable
00050 {
00051     dcs_high();
00052     cs_high();
00053     dcs_low();
00054 }
00055 void VS1002::sdi_dis(void)                    //SDI disable
00056 {
00057     dcs_high();
00058 }
00059 void VS1002::reset(void)                    //hardware reset
00060 {
00061     wait(0.01);
00062     _RST = 0;
00063     wait(0.01);
00064     _RST = 1;
00065     wait(0.10);
00066 }
00067 void VS1002::power_down(void)                //hardware and software reset
00068 {
00069     cs_low();
00070     reset();
00071     sci_write(0x00, SM_PDOWN);
00072     wait(0.01);
00073     reset();
00074 }
00075 void VS1002::sci_initialise(void)
00076 {
00077     _RST = 1;                                //no reset
00078     _spi.format(8,0);                        //spi 8bit interface, steady state low
00079     _spi.frequency(1000000);                //rising edge data record, freq. 1Mhz
00080     
00081     cs_low();
00082     for(int i=0; i<4; i++)
00083     {
00084     _spi.write(0xFF);                        //clock the chip a bit
00085     }
00086     cs_high();
00087     dcs_high();
00088     wait_us(5);
00089 }
00090 void VS1002::sdi_initialise(void)
00091 {
00092     _spi.format(8,0);
00093     _spi.frequency(7000000);                //set to 7MHz
00094     
00095     cs_high();
00096     dcs_high();
00097 }
00098 void VS1002::sci_write(unsigned char address, unsigned short int data)
00099 {
00100     sci_en();                                //enables SCI/disables SDI
00101     
00102     while(!_DREQ);                            //wait unitl data request is high
00103     _spi.write(0x02);                        //SCI write
00104     _spi.write(address);                    //register address
00105     _spi.write((data >> 8) & 0xFF);            //write out first half of data word
00106     _spi.write(data & 0xFF);                //write out second half of data word
00107     
00108     sci_dis();                                //enables SDI/disables SCI
00109     wait_us(5);
00110 }
00111 void VS1002::sdi_write(unsigned char datum)
00112 {
00113     sdi_en();
00114     
00115     while(!_DREQ);
00116     _spi.write(datum);
00117     
00118     sci_dis();
00119 }
00120 unsigned short int VS1002::read(unsigned short int address)
00121 {
00122     cs_low();                                //enables SCI/disables SDI
00123     
00124     while(!_DREQ);                            //wait unitl data request is high
00125     _spi.write(0x03);                        //SCI write
00126     _spi.write(address);                    //register address
00127     unsigned short int received = _spi.write(0x00);    //write out dummy byte
00128     received <<= 8;
00129     received += _spi.write(0x00);            //write out dummy byte
00130     
00131     cs_high();                                //enables SDI/disables SCI
00132     
00133     return received;                        //return received word
00134 }
00135 void VS1002::sine_test_activate(unsigned char wave)
00136 {
00137     cs_high();                                //enables SDI/disables SCI
00138     
00139     while(!_DREQ);                            //wait unitl data request is high
00140     _spi.write(0x53);                        //SDI write
00141     _spi.write(0xEF);                        //SDI write
00142     _spi.write(0x6E);                        //SDI write
00143     _spi.write(wave);                        //SDI write
00144     _spi.write(0x00);                        //filler byte
00145     _spi.write(0x00);                        //filler byte
00146     _spi.write(0x00);                        //filler byte
00147     _spi.write(0x00);                        //filler byte
00148 
00149     cs_low();                                //enables SCI/disables SDI
00150 }
00151 void VS1002::sine_test_deactivate(void)
00152 {
00153     cs_high();
00154     
00155     while(!_DREQ);
00156     _spi.write(0x45);                        //SDI write
00157     _spi.write(0x78);                        //SDI write
00158     _spi.write(0x69);                        //SDI write
00159     _spi.write(0x74);                        //SDI write
00160     _spi.write(0x00);                        //filler byte
00161     _spi.write(0x00);                        //filler byte
00162     _spi.write(0x00);                        //filler byte
00163     _spi.write(0x00);                        //filler byte
00164 }
00165 void VS1002::volume(void)
00166 {
00167     unsigned char volumize = (_VOL * 255);
00168     while(!_DREQ);
00169     
00170     unsigned short int attenuation = ((256 * volumize) + volumize);
00171     sci_write(0x0B, attenuation);
00172 }
00173 
00174 
00175 //Play the mp3 file from the USB filesystem (stream.mp3 on usb system)
00176 void VS1002::play_song()
00177 {
00178 
00179            
00180     /*====== File Transfer ======*/
00181     
00182     FILE *song;
00183     unsigned char array[512];    
00184     song = fopen("/msc/stream.mp3", "rb");
00185     
00186     if(!song) 
00187     {
00188         exit(1);
00189     }
00190    
00191        while(!feof(song))
00192     {
00193            fread(&array, 1, 512, song);
00194            for(int i=0; i<512; i++)
00195            {
00196                sdi_write(array[i]);
00197            }
00198            volume();
00199        }
00200     for(int n=0; n<2048; n++)
00201        {
00202            sdi_write(0x00);
00203        }
00204     fclose(song); 
00205   
00206                                    
00207 }
00208