Team X / Mbed 2 deprecated final_mbed

Dependencies:   LSM9DS1_Library_cal RPCInterface final mbed

Fork of SDFileSystem_HelloWorld by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers VS1053.cpp Source File

VS1053.cpp

00001 #include "VS1053.h"
00002 #include "mbed.h"
00003 
00004 // patch binary
00005 #include "VS1053b_patch.c"
00006 // spectrum analyzer binary
00007 #include "VS1053b_specana.c"
00008 
00009 //Serial pc(USBTX, USBRX);
00010 
00011 /* ==================================================================
00012  * Constructor
00013  * =================================================================*/
00014 VS1053::VS1053(
00015          PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
00016          PinName dreq, PinName dcs, PinName vol)
00017     :
00018      _spi(mosi, miso, sck), 
00019      _CS(cs), 
00020      _RST(rst), 
00021      _DREQ(dreq),
00022      _DCS(dcs), 
00023      _VOL(vol) {
00024         firstTime=-1;    
00025     }    
00026 
00027 /*===================================================================
00028  * Functions
00029  *==================================================================*/
00030  
00031 void VS1053::cs_low(void)
00032 {
00033     _CS = 0;                                
00034 }
00035 void VS1053::cs_high(void)
00036 {
00037     _CS = 1;                                
00038 }
00039 void VS1053::dcs_low(void)
00040 {
00041     _DCS = 0;
00042  
00043 }
00044 void VS1053::dcs_high(void)
00045 {
00046     _DCS = 1;
00047 }
00048 void VS1053::sci_en(void)                    //SCI enable
00049 {
00050     cs_high();
00051     dcs_high();
00052     cs_low();
00053 }
00054 void VS1053::sci_dis(void)                    //SCI disable
00055 {
00056     cs_high();
00057 }
00058 void VS1053::sdi_en(void)                    //SDI enable
00059 {
00060     dcs_high();
00061     cs_high();
00062     dcs_low();
00063 }
00064 void VS1053::sdi_dis(void)                    //SDI disable
00065 {
00066     dcs_high();
00067 }
00068 void VS1053::reset(void)                    //hardware reset
00069 {
00070 //    wait(0.01);
00071     wait_ms(10);
00072     _RST = 0;
00073 //    wait(0.01);
00074     wait_ms(5);
00075     _RST = 1;
00076 //    wait(0.10);
00077     wait_ms(10);
00078 }
00079 void VS1053::power_down(void)                //hardware and software reset
00080 {
00081     cs_low();
00082     reset();
00083 //    sci_write(0x00, SM_PDOWN);
00084     sci_write(0x00, 0x10); // tempo
00085     wait(0.01);
00086     reset();
00087 }
00088 void VS1053::sci_initialise(void)
00089 {
00090     _RST = 1;                                //no reset
00091     _spi.format(8,0);                        //spi 8bit interface, steady state low
00092  //   _spi.frequency(1000000);                //rising edge data record, freq. 1Mhz
00093     _spi.frequency(2000000);                //rising edge data record, freq. 2Mhz
00094 
00095     
00096     cs_low();
00097     for(int i=0; i<4; i++)
00098     {
00099     _spi.write(0xFF);                        //clock the chip a bit
00100     }
00101     cs_high();
00102     dcs_high();
00103     wait_us(5);
00104 }
00105 void VS1053::sdi_initialise(void)
00106 {
00107     _spi.format(8,0);
00108 //    _spi.frequency(7000000);                //set to 7MHz
00109 //    _spi.frequency(12000000);                //set to 12MHz to make fast transfer
00110     _spi.frequency(18000000);                //set to 18MHz to make fast transfer
00111 //NG does not work//    _spi.frequency(24000000);                //set to 24MHz to make fast transfer
00112     
00113     cs_high();
00114     dcs_high();
00115 }
00116 void VS1053::sci_write(unsigned char address, unsigned short int data)
00117 {
00118     sci_en();                                //enables SCI/disables SDI
00119     
00120     while(!_DREQ);                            //wait unitl data request is high
00121     _spi.write(0x02);                        //SCI write
00122     _spi.write(address);                    //register address
00123     _spi.write((data >> 8) & 0xFF);            //write out first half of data word
00124     _spi.write(data & 0xFF);                //write out second half of data word
00125     
00126     sci_dis();                                //enables SDI/disables SCI
00127     wait_us(5);
00128 }
00129 void VS1053::sdi_write(unsigned char datum)
00130 {
00131     sdi_en();
00132     
00133     while(!_DREQ);
00134     _spi.write(datum);
00135     
00136 //?    sci_dis();
00137       sdi_dis();
00138 }
00139 unsigned short int VS1053::sci_read(unsigned short int address)
00140 {
00141     cs_low();                                //enables SCI/disables SDI
00142     
00143     while(!_DREQ);                            //wait unitl data request is high
00144     _spi.write(0x03);                        //SCI write
00145     _spi.write(address);                    //register address
00146     unsigned short int received = _spi.write(0x00);    //write out dummy byte
00147     received <<= 8;
00148     received += _spi.write(0x00);            //write out dummy byte
00149     
00150     cs_high();                                //enables SDI/disables SCI
00151     
00152     return received;                        //return received word
00153 }
00154 void VS1053::sine_test_activate(unsigned char wave)
00155 {
00156     cs_high();                                //enables SDI/disables SCI
00157     
00158     while(!_DREQ);                            //wait unitl data request is high
00159     _spi.write(0x53);                        //SDI write
00160     _spi.write(0xEF);                        //SDI write
00161     _spi.write(0x6E);                        //SDI write
00162     _spi.write(wave);                        //SDI write
00163     _spi.write(0x00);                        //filler byte
00164     _spi.write(0x00);                        //filler byte
00165     _spi.write(0x00);                        //filler byte
00166     _spi.write(0x00);                        //filler byte
00167 
00168     cs_low();                                //enables SCI/disables SDI
00169 }
00170 void VS1053::sine_test_deactivate(void)
00171 {
00172     cs_high();
00173     
00174     while(!_DREQ);
00175     _spi.write(0x45);                        //SDI write
00176     _spi.write(0x78);                        //SDI write
00177     _spi.write(0x69);                        //SDI write
00178     _spi.write(0x74);                        //SDI write
00179     _spi.write(0x00);                        //filler byte
00180     _spi.write(0x00);                        //filler byte
00181     _spi.write(0x00);                        //filler byte
00182     _spi.write(0x00);                        //filler byte
00183 }
00184 void VS1053::volume(void)
00185 {
00186  #ifdef FIXED_VOL
00187     unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input)
00188  #else
00189     unsigned char volumize = (_VOL * 255);
00190  #endif
00191     while(!_DREQ);
00192     
00193     unsigned short int attenuation = ((256 * volumize) + volumize);
00194     sci_write(0x0B, attenuation);
00195 }
00196 
00197 void VS1053::writeStream(unsigned char *array, int size)
00198 {
00199    for(int i=0; i<size; i++)
00200    {
00201        sdi_write(array[i]);
00202    }
00203    volume();
00204 }
00205 
00206 #if 0
00207 // this function does not work
00208 // because of function call overhead
00209 void VS1053::putcStream(unsigned char datum)
00210 {
00211     sdi_write(datum);
00212 }
00213 #endif
00214 
00215 unsigned short int VS1053::wram_read(unsigned short int address)
00216 {
00217     unsigned short int tmp1,tmp2;
00218     sci_write(SCI_WRAMADDR,address);
00219     tmp1=sci_read(SCI_WRAM);
00220     sci_write(SCI_WRAMADDR,address);
00221     tmp2=sci_read(SCI_WRAM);
00222     if (tmp1==tmp2) return tmp1;
00223     sci_write(SCI_WRAMADDR,address);
00224     tmp1=sci_read(SCI_WRAM);
00225     if (tmp1==tmp2) return tmp1;
00226     sci_write(SCI_WRAMADDR,address);    
00227     tmp1=sci_read(SCI_WRAM);
00228     if (tmp1==tmp2) return tmp1;
00229     return tmp1;    
00230 }
00231 
00232 void VS1053::wram_write(unsigned short int address, unsigned short int data)
00233 {
00234     sci_write(SCI_WRAMADDR,address);
00235     sci_write(SCI_WRAM,data);
00236     return;
00237 }
00238 
00239 
00240 void VS1053::terminateStream(void)
00241 {
00242 #if 1
00243     unsigned int endFillByte=wram_read(para_endFillByte);
00244 //    printf("endFillByte:%04X\r\n",endFillByte); // debug
00245     for(int n=0; n<2052; n++) sdi_write(0xFF&endFillByte);
00246     sci_write(SCI_MODE,(SM_SDINEW+SM_CANCEL));
00247     for(int n=0; n<2048; n++) sdi_write(0xFF&endFillByte);
00248     // don't reset if you don't want to lose the patch 
00249     //    sci_write(SCI_MODE,(SM_SDINEW+SM_RESET)); //  set mode reg.
00250     //    wait_ms(10); 
00251 #endif 
00252 }
00253 
00254 void VS1053::write_plugin(const unsigned short *plugin, unsigned int len)
00255 {
00256   unsigned int i;
00257   unsigned short addr, n, val;
00258 
00259   for(i=0; i<len;)
00260   {
00261     addr = plugin[i++];
00262     n    = plugin[i++];
00263     if(n & 0x8000U) //RLE run, replicate n samples
00264     {
00265       n  &= 0x7FFF;
00266       val = plugin[i++];
00267       while(n--) 
00268       {
00269         sci_write(addr,val);
00270       }
00271     }
00272     else //copy run, copy n sample
00273     {
00274       while(n--)
00275       {
00276         val = plugin[i++];
00277         sci_write(addr,val);
00278       }
00279     }
00280   }
00281 
00282   return;
00283 }
00284 
00285 
00286 void VS1053::initialize(void)
00287 {
00288     _RST = 1;
00289     cs_high();                           //chip disabled
00290     sci_initialise();                    //initialise MBED
00291     sci_write(SCI_MODE,(SM_SDINEW+SM_RESET)); //  set mode reg.
00292     wait_ms(10); 
00293 #if 1
00294        // debug
00295         unsigned int chipID_0=wram_read(para_chipID_0);
00296         if (firstTime) printf("chipID_0:%04X\r\n",chipID_0); // debug
00297         unsigned int chipID_1=wram_read(para_chipID_1);
00298         if (firstTime) printf("chipID_1:%04X\r\n",chipID_1); // debug      
00299         unsigned int struct_version=wram_read(para_version);
00300         if (firstTime) printf("structure version:%04X\r\n",struct_version); // debug      
00301  #endif
00302     //get chip version, set clock multiplier and load patch
00303     int i = (sci_read(SCI_STATUS)&0xF0)>>4;
00304     if(i == 4) 
00305     {
00306         if (firstTime) printf("Installed Chip is: VS1053\r\n");
00307         sci_write(SCI_CLOCKF, (SC_MULT_XTALIx50+SC_ADD_20x)); 
00308 #ifdef VS_PATCH
00309         // loading patch
00310         write_plugin(vs1053b_patch, sizeof(vs1053b_patch)/2);
00311         if (firstTime) {
00312             printf("VS1053b patch loaded.\r\n");
00313             printf("patch size:%d bytes\r\n",sizeof(vs1053b_patch));
00314         }
00315 #endif
00316 #ifdef VS_SPECANA
00317         // loading plugin(spectrum analyzer)
00318         write_plugin(vs1053b_specana, sizeof(vs1053b_specana)/2);
00319         if (firstTime) printf("VS1053b specana loaded.\r\n");
00320 #endif
00321     }
00322     else printf("??? Not Supported Chip???\r\n");
00323     sdi_initialise(); 
00324     firstTime=0; // disable message when init after 1st time
00325 }