This program plays an internet radio audio stream like Shoutcast.
Dependencies: EthernetNetIf mbed HTTPClient
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
Generated on Tue Jul 12 2022 15:54:52 by 1.7.2