mbeduino MP3 Sheild player MP3 player that runs on mebeduin with MP3 Shield. Regarding mbeduino, refer to: http://mbed.org/users/okini3939/notebook/mbeduino/ Regarding MP3 Shiled, refer to: http://www.sparkfun.com/commerce/product_info.php?products_id=9736

Dependencies:   mbed SDFileSystem

Revision:
0:67cb2f650c15
Child:
1:c47269f0e9e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VS1053.cpp	Tue Oct 12 14:11:52 2010 +0000
@@ -0,0 +1,208 @@
+#include "VS1053.h"
+#include "mbed.h"
+
+
+Serial pc(USBTX, USBRX);
+
+/* ==================================================================
+ * Constructor
+ * =================================================================*/
+VS1053::VS1053(
+         PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
+         PinName dreq, PinName dcs, PinName vol)
+    :
+     _spi(mosi, miso, sck), 
+     _CS(cs), 
+     _RST(rst), 
+     _DREQ(dreq),
+     _DCS(dcs), 
+     _VOL(vol) {
+    
+    }    
+
+/*===================================================================
+ * Functions
+ *==================================================================*/
+ 
+void VS1053::cs_low(void)
+{
+    _CS = 0;                                
+}
+void VS1053::cs_high(void)
+{
+    _CS = 1;                                
+}
+void VS1053::dcs_low(void)
+{
+    _DCS = 0;
+}
+void VS1053::dcs_high(void)
+{
+    _DCS = 1;
+}
+void VS1053::sci_en(void)                    //SCI enable
+{
+    cs_high();
+    dcs_high();
+    cs_low();
+}
+void VS1053::sci_dis(void)                    //SCI disable
+{
+    cs_high();
+}
+void VS1053::sdi_en(void)                    //SDI enable
+{
+    dcs_high();
+    cs_high();
+    dcs_low();
+}
+void VS1053::sdi_dis(void)                    //SDI disable
+{
+    dcs_high();
+}
+void VS1053::reset(void)                    //hardware reset
+{
+    wait(0.01);
+    _RST = 0;
+    wait(0.01);
+    _RST = 1;
+    wait(0.10);
+}
+void VS1053::power_down(void)                //hardware and software reset
+{
+    cs_low();
+    reset();
+//    sci_write(0x00, SM_PDOWN);
+    sci_write(0x00, 0x10); // tempo
+    wait(0.01);
+    reset();
+}
+void VS1053::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 VS1053::sdi_initialise(void)
+{
+    _spi.format(8,0);
+    _spi.frequency(7000000);                //set to 7MHz
+    
+    cs_high();
+    dcs_high();
+}
+void VS1053::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 VS1053::sdi_write(unsigned char datum)
+{
+    sdi_en();
+    
+    while(!_DREQ);
+    _spi.write(datum);
+    
+    sci_dis();
+}
+unsigned short int VS1053::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 VS1053::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 VS1053::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 VS1053::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 VS1053::writeStream(unsigned char *array, int size)
+{
+   for(int i=0; i<size; i++)
+   {
+       sdi_write(array[i]);
+   }
+   volume();
+}
+
+#if 0
+// this function does not work
+// because of function call overhead
+void VS1053::putcStream(unsigned char datum)
+{
+    sdi_write(datum);
+}
+#endif
+
+void VS1053::terminateStream(void)
+{
+    for(int n=0; n<2048; n++)
+       {
+           sdi_write(0x00);
+       }
+
+}