music player, led, motor

Dependencies:   LSM9DS1_Library_cal RPCInterface final mbed

Fork of final_mbed by Team X

Committer:
mikebenq
Date:
Mon May 01 11:05:37 2017 +0000
Revision:
2:55495227fcca
Parent:
1:f54bee9d59de
Final_mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikebenq 1:f54bee9d59de 1 #include "VS1053.h"
mikebenq 1:f54bee9d59de 2 #include "mbed.h"
mikebenq 1:f54bee9d59de 3
mikebenq 1:f54bee9d59de 4 // patch binary
mikebenq 1:f54bee9d59de 5 #include "VS1053b_patch.c"
mikebenq 1:f54bee9d59de 6 // spectrum analyzer binary
mikebenq 1:f54bee9d59de 7 #include "VS1053b_specana.c"
mikebenq 1:f54bee9d59de 8
mikebenq 1:f54bee9d59de 9 //Serial pc(USBTX, USBRX);
mikebenq 1:f54bee9d59de 10
mikebenq 1:f54bee9d59de 11 /* ==================================================================
mikebenq 1:f54bee9d59de 12 * Constructor
mikebenq 1:f54bee9d59de 13 * =================================================================*/
mikebenq 1:f54bee9d59de 14 VS1053::VS1053(
mikebenq 1:f54bee9d59de 15 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
mikebenq 1:f54bee9d59de 16 PinName dreq, PinName dcs, PinName vol)
mikebenq 1:f54bee9d59de 17 :
mikebenq 1:f54bee9d59de 18 _spi(mosi, miso, sck),
mikebenq 1:f54bee9d59de 19 _CS(cs),
mikebenq 1:f54bee9d59de 20 _RST(rst),
mikebenq 1:f54bee9d59de 21 _DREQ(dreq),
mikebenq 1:f54bee9d59de 22 _DCS(dcs),
mikebenq 1:f54bee9d59de 23 _VOL(vol) {
mikebenq 1:f54bee9d59de 24 firstTime=-1;
mikebenq 1:f54bee9d59de 25 }
mikebenq 1:f54bee9d59de 26
mikebenq 1:f54bee9d59de 27 /*===================================================================
mikebenq 1:f54bee9d59de 28 * Functions
mikebenq 1:f54bee9d59de 29 *==================================================================*/
mikebenq 1:f54bee9d59de 30
mikebenq 1:f54bee9d59de 31 void VS1053::cs_low(void)
mikebenq 1:f54bee9d59de 32 {
mikebenq 1:f54bee9d59de 33 _CS = 0;
mikebenq 1:f54bee9d59de 34 }
mikebenq 1:f54bee9d59de 35 void VS1053::cs_high(void)
mikebenq 1:f54bee9d59de 36 {
mikebenq 1:f54bee9d59de 37 _CS = 1;
mikebenq 1:f54bee9d59de 38 }
mikebenq 1:f54bee9d59de 39 void VS1053::dcs_low(void)
mikebenq 1:f54bee9d59de 40 {
mikebenq 1:f54bee9d59de 41 _DCS = 0;
mikebenq 1:f54bee9d59de 42
mikebenq 1:f54bee9d59de 43 }
mikebenq 1:f54bee9d59de 44 void VS1053::dcs_high(void)
mikebenq 1:f54bee9d59de 45 {
mikebenq 1:f54bee9d59de 46 _DCS = 1;
mikebenq 1:f54bee9d59de 47 }
mikebenq 1:f54bee9d59de 48 void VS1053::sci_en(void) //SCI enable
mikebenq 1:f54bee9d59de 49 {
mikebenq 1:f54bee9d59de 50 cs_high();
mikebenq 1:f54bee9d59de 51 dcs_high();
mikebenq 1:f54bee9d59de 52 cs_low();
mikebenq 1:f54bee9d59de 53 }
mikebenq 1:f54bee9d59de 54 void VS1053::sci_dis(void) //SCI disable
mikebenq 1:f54bee9d59de 55 {
mikebenq 1:f54bee9d59de 56 cs_high();
mikebenq 1:f54bee9d59de 57 }
mikebenq 1:f54bee9d59de 58 void VS1053::sdi_en(void) //SDI enable
mikebenq 1:f54bee9d59de 59 {
mikebenq 1:f54bee9d59de 60 dcs_high();
mikebenq 1:f54bee9d59de 61 cs_high();
mikebenq 1:f54bee9d59de 62 dcs_low();
mikebenq 1:f54bee9d59de 63 }
mikebenq 1:f54bee9d59de 64 void VS1053::sdi_dis(void) //SDI disable
mikebenq 1:f54bee9d59de 65 {
mikebenq 1:f54bee9d59de 66 dcs_high();
mikebenq 1:f54bee9d59de 67 }
mikebenq 1:f54bee9d59de 68 void VS1053::reset(void) //hardware reset
mikebenq 1:f54bee9d59de 69 {
mikebenq 1:f54bee9d59de 70 // wait(0.01);
mikebenq 1:f54bee9d59de 71 wait_ms(10);
mikebenq 1:f54bee9d59de 72 _RST = 0;
mikebenq 1:f54bee9d59de 73 // wait(0.01);
mikebenq 1:f54bee9d59de 74 wait_ms(5);
mikebenq 1:f54bee9d59de 75 _RST = 1;
mikebenq 1:f54bee9d59de 76 // wait(0.10);
mikebenq 1:f54bee9d59de 77 wait_ms(10);
mikebenq 1:f54bee9d59de 78 }
mikebenq 1:f54bee9d59de 79 void VS1053::power_down(void) //hardware and software reset
mikebenq 1:f54bee9d59de 80 {
mikebenq 1:f54bee9d59de 81 cs_low();
mikebenq 1:f54bee9d59de 82 reset();
mikebenq 1:f54bee9d59de 83 // sci_write(0x00, SM_PDOWN);
mikebenq 1:f54bee9d59de 84 sci_write(0x00, 0x10); // tempo
mikebenq 1:f54bee9d59de 85 wait(0.01);
mikebenq 1:f54bee9d59de 86 reset();
mikebenq 1:f54bee9d59de 87 }
mikebenq 1:f54bee9d59de 88 void VS1053::sci_initialise(void)
mikebenq 1:f54bee9d59de 89 {
mikebenq 1:f54bee9d59de 90 _RST = 1; //no reset
mikebenq 1:f54bee9d59de 91 _spi.format(8,0); //spi 8bit interface, steady state low
mikebenq 1:f54bee9d59de 92 // _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
mikebenq 1:f54bee9d59de 93 _spi.frequency(2000000); //rising edge data record, freq. 2Mhz
mikebenq 1:f54bee9d59de 94
mikebenq 1:f54bee9d59de 95
mikebenq 1:f54bee9d59de 96 cs_low();
mikebenq 1:f54bee9d59de 97 for(int i=0; i<4; i++)
mikebenq 1:f54bee9d59de 98 {
mikebenq 1:f54bee9d59de 99 _spi.write(0xFF); //clock the chip a bit
mikebenq 1:f54bee9d59de 100 }
mikebenq 1:f54bee9d59de 101 cs_high();
mikebenq 1:f54bee9d59de 102 dcs_high();
mikebenq 1:f54bee9d59de 103 wait_us(5);
mikebenq 1:f54bee9d59de 104 }
mikebenq 1:f54bee9d59de 105 void VS1053::sdi_initialise(void)
mikebenq 1:f54bee9d59de 106 {
mikebenq 1:f54bee9d59de 107 _spi.format(8,0);
mikebenq 1:f54bee9d59de 108 // _spi.frequency(7000000); //set to 7MHz
mikebenq 1:f54bee9d59de 109 // _spi.frequency(12000000); //set to 12MHz to make fast transfer
mikebenq 1:f54bee9d59de 110 _spi.frequency(18000000); //set to 18MHz to make fast transfer
mikebenq 1:f54bee9d59de 111 //NG does not work// _spi.frequency(24000000); //set to 24MHz to make fast transfer
mikebenq 1:f54bee9d59de 112
mikebenq 1:f54bee9d59de 113 cs_high();
mikebenq 1:f54bee9d59de 114 dcs_high();
mikebenq 1:f54bee9d59de 115 }
mikebenq 1:f54bee9d59de 116 void VS1053::sci_write(unsigned char address, unsigned short int data)
mikebenq 1:f54bee9d59de 117 {
mikebenq 1:f54bee9d59de 118 sci_en(); //enables SCI/disables SDI
mikebenq 1:f54bee9d59de 119
mikebenq 1:f54bee9d59de 120 while(!_DREQ); //wait unitl data request is high
mikebenq 1:f54bee9d59de 121 _spi.write(0x02); //SCI write
mikebenq 1:f54bee9d59de 122 _spi.write(address); //register address
mikebenq 1:f54bee9d59de 123 _spi.write((data >> 8) & 0xFF); //write out first half of data word
mikebenq 1:f54bee9d59de 124 _spi.write(data & 0xFF); //write out second half of data word
mikebenq 1:f54bee9d59de 125
mikebenq 1:f54bee9d59de 126 sci_dis(); //enables SDI/disables SCI
mikebenq 1:f54bee9d59de 127 wait_us(5);
mikebenq 1:f54bee9d59de 128 }
mikebenq 1:f54bee9d59de 129 void VS1053::sdi_write(unsigned char datum)
mikebenq 1:f54bee9d59de 130 {
mikebenq 1:f54bee9d59de 131 sdi_en();
mikebenq 1:f54bee9d59de 132
mikebenq 1:f54bee9d59de 133 while(!_DREQ);
mikebenq 1:f54bee9d59de 134 _spi.write(datum);
mikebenq 1:f54bee9d59de 135
mikebenq 1:f54bee9d59de 136 //? sci_dis();
mikebenq 1:f54bee9d59de 137 sdi_dis();
mikebenq 1:f54bee9d59de 138 }
mikebenq 1:f54bee9d59de 139 unsigned short int VS1053::sci_read(unsigned short int address)
mikebenq 1:f54bee9d59de 140 {
mikebenq 1:f54bee9d59de 141 cs_low(); //enables SCI/disables SDI
mikebenq 1:f54bee9d59de 142
mikebenq 1:f54bee9d59de 143 while(!_DREQ); //wait unitl data request is high
mikebenq 1:f54bee9d59de 144 _spi.write(0x03); //SCI write
mikebenq 1:f54bee9d59de 145 _spi.write(address); //register address
mikebenq 1:f54bee9d59de 146 unsigned short int received = _spi.write(0x00); //write out dummy byte
mikebenq 1:f54bee9d59de 147 received <<= 8;
mikebenq 1:f54bee9d59de 148 received += _spi.write(0x00); //write out dummy byte
mikebenq 1:f54bee9d59de 149
mikebenq 1:f54bee9d59de 150 cs_high(); //enables SDI/disables SCI
mikebenq 1:f54bee9d59de 151
mikebenq 1:f54bee9d59de 152 return received; //return received word
mikebenq 1:f54bee9d59de 153 }
mikebenq 1:f54bee9d59de 154 void VS1053::sine_test_activate(unsigned char wave)
mikebenq 1:f54bee9d59de 155 {
mikebenq 1:f54bee9d59de 156 cs_high(); //enables SDI/disables SCI
mikebenq 1:f54bee9d59de 157
mikebenq 1:f54bee9d59de 158 while(!_DREQ); //wait unitl data request is high
mikebenq 1:f54bee9d59de 159 _spi.write(0x53); //SDI write
mikebenq 1:f54bee9d59de 160 _spi.write(0xEF); //SDI write
mikebenq 1:f54bee9d59de 161 _spi.write(0x6E); //SDI write
mikebenq 1:f54bee9d59de 162 _spi.write(wave); //SDI write
mikebenq 1:f54bee9d59de 163 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 164 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 165 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 166 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 167
mikebenq 1:f54bee9d59de 168 cs_low(); //enables SCI/disables SDI
mikebenq 1:f54bee9d59de 169 }
mikebenq 1:f54bee9d59de 170 void VS1053::sine_test_deactivate(void)
mikebenq 1:f54bee9d59de 171 {
mikebenq 1:f54bee9d59de 172 cs_high();
mikebenq 1:f54bee9d59de 173
mikebenq 1:f54bee9d59de 174 while(!_DREQ);
mikebenq 1:f54bee9d59de 175 _spi.write(0x45); //SDI write
mikebenq 1:f54bee9d59de 176 _spi.write(0x78); //SDI write
mikebenq 1:f54bee9d59de 177 _spi.write(0x69); //SDI write
mikebenq 1:f54bee9d59de 178 _spi.write(0x74); //SDI write
mikebenq 1:f54bee9d59de 179 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 180 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 181 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 182 _spi.write(0x00); //filler byte
mikebenq 1:f54bee9d59de 183 }
mikebenq 1:f54bee9d59de 184 void VS1053::volume(void)
mikebenq 1:f54bee9d59de 185 {
mikebenq 1:f54bee9d59de 186 #ifdef FIXED_VOL
mikebenq 1:f54bee9d59de 187 unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input)
mikebenq 1:f54bee9d59de 188 #else
mikebenq 1:f54bee9d59de 189 unsigned char volumize = (_VOL * 255);
mikebenq 1:f54bee9d59de 190 #endif
mikebenq 1:f54bee9d59de 191 while(!_DREQ);
mikebenq 1:f54bee9d59de 192
mikebenq 1:f54bee9d59de 193 unsigned short int attenuation = ((256 * volumize) + volumize);
mikebenq 1:f54bee9d59de 194 sci_write(0x0B, attenuation);
mikebenq 1:f54bee9d59de 195 }
mikebenq 1:f54bee9d59de 196
mikebenq 1:f54bee9d59de 197 void VS1053::writeStream(unsigned char *array, int size)
mikebenq 1:f54bee9d59de 198 {
mikebenq 1:f54bee9d59de 199 for(int i=0; i<size; i++)
mikebenq 1:f54bee9d59de 200 {
mikebenq 1:f54bee9d59de 201 sdi_write(array[i]);
mikebenq 1:f54bee9d59de 202 }
mikebenq 1:f54bee9d59de 203 volume();
mikebenq 1:f54bee9d59de 204 }
mikebenq 1:f54bee9d59de 205
mikebenq 1:f54bee9d59de 206 #if 0
mikebenq 1:f54bee9d59de 207 // this function does not work
mikebenq 1:f54bee9d59de 208 // because of function call overhead
mikebenq 1:f54bee9d59de 209 void VS1053::putcStream(unsigned char datum)
mikebenq 1:f54bee9d59de 210 {
mikebenq 1:f54bee9d59de 211 sdi_write(datum);
mikebenq 1:f54bee9d59de 212 }
mikebenq 1:f54bee9d59de 213 #endif
mikebenq 1:f54bee9d59de 214
mikebenq 1:f54bee9d59de 215 unsigned short int VS1053::wram_read(unsigned short int address)
mikebenq 1:f54bee9d59de 216 {
mikebenq 1:f54bee9d59de 217 unsigned short int tmp1,tmp2;
mikebenq 1:f54bee9d59de 218 sci_write(SCI_WRAMADDR,address);
mikebenq 1:f54bee9d59de 219 tmp1=sci_read(SCI_WRAM);
mikebenq 1:f54bee9d59de 220 sci_write(SCI_WRAMADDR,address);
mikebenq 1:f54bee9d59de 221 tmp2=sci_read(SCI_WRAM);
mikebenq 1:f54bee9d59de 222 if (tmp1==tmp2) return tmp1;
mikebenq 1:f54bee9d59de 223 sci_write(SCI_WRAMADDR,address);
mikebenq 1:f54bee9d59de 224 tmp1=sci_read(SCI_WRAM);
mikebenq 1:f54bee9d59de 225 if (tmp1==tmp2) return tmp1;
mikebenq 1:f54bee9d59de 226 sci_write(SCI_WRAMADDR,address);
mikebenq 1:f54bee9d59de 227 tmp1=sci_read(SCI_WRAM);
mikebenq 1:f54bee9d59de 228 if (tmp1==tmp2) return tmp1;
mikebenq 1:f54bee9d59de 229 return tmp1;
mikebenq 1:f54bee9d59de 230 }
mikebenq 1:f54bee9d59de 231
mikebenq 1:f54bee9d59de 232 void VS1053::wram_write(unsigned short int address, unsigned short int data)
mikebenq 1:f54bee9d59de 233 {
mikebenq 1:f54bee9d59de 234 sci_write(SCI_WRAMADDR,address);
mikebenq 1:f54bee9d59de 235 sci_write(SCI_WRAM,data);
mikebenq 1:f54bee9d59de 236 return;
mikebenq 1:f54bee9d59de 237 }
mikebenq 1:f54bee9d59de 238
mikebenq 1:f54bee9d59de 239
mikebenq 1:f54bee9d59de 240 void VS1053::terminateStream(void)
mikebenq 1:f54bee9d59de 241 {
mikebenq 1:f54bee9d59de 242 #if 1
mikebenq 1:f54bee9d59de 243 unsigned int endFillByte=wram_read(para_endFillByte);
mikebenq 1:f54bee9d59de 244 // printf("endFillByte:%04X\r\n",endFillByte); // debug
mikebenq 1:f54bee9d59de 245 for(int n=0; n<2052; n++) sdi_write(0xFF&endFillByte);
mikebenq 1:f54bee9d59de 246 sci_write(SCI_MODE,(SM_SDINEW+SM_CANCEL));
mikebenq 1:f54bee9d59de 247 for(int n=0; n<2048; n++) sdi_write(0xFF&endFillByte);
mikebenq 1:f54bee9d59de 248 // don't reset if you don't want to lose the patch
mikebenq 1:f54bee9d59de 249 // sci_write(SCI_MODE,(SM_SDINEW+SM_RESET)); // set mode reg.
mikebenq 1:f54bee9d59de 250 // wait_ms(10);
mikebenq 1:f54bee9d59de 251 #endif
mikebenq 1:f54bee9d59de 252 }
mikebenq 1:f54bee9d59de 253
mikebenq 1:f54bee9d59de 254 void VS1053::write_plugin(const unsigned short *plugin, unsigned int len)
mikebenq 1:f54bee9d59de 255 {
mikebenq 1:f54bee9d59de 256 unsigned int i;
mikebenq 1:f54bee9d59de 257 unsigned short addr, n, val;
mikebenq 1:f54bee9d59de 258
mikebenq 1:f54bee9d59de 259 for(i=0; i<len;)
mikebenq 1:f54bee9d59de 260 {
mikebenq 1:f54bee9d59de 261 addr = plugin[i++];
mikebenq 1:f54bee9d59de 262 n = plugin[i++];
mikebenq 1:f54bee9d59de 263 if(n & 0x8000U) //RLE run, replicate n samples
mikebenq 1:f54bee9d59de 264 {
mikebenq 1:f54bee9d59de 265 n &= 0x7FFF;
mikebenq 1:f54bee9d59de 266 val = plugin[i++];
mikebenq 1:f54bee9d59de 267 while(n--)
mikebenq 1:f54bee9d59de 268 {
mikebenq 1:f54bee9d59de 269 sci_write(addr,val);
mikebenq 1:f54bee9d59de 270 }
mikebenq 1:f54bee9d59de 271 }
mikebenq 1:f54bee9d59de 272 else //copy run, copy n sample
mikebenq 1:f54bee9d59de 273 {
mikebenq 1:f54bee9d59de 274 while(n--)
mikebenq 1:f54bee9d59de 275 {
mikebenq 1:f54bee9d59de 276 val = plugin[i++];
mikebenq 1:f54bee9d59de 277 sci_write(addr,val);
mikebenq 1:f54bee9d59de 278 }
mikebenq 1:f54bee9d59de 279 }
mikebenq 1:f54bee9d59de 280 }
mikebenq 1:f54bee9d59de 281
mikebenq 1:f54bee9d59de 282 return;
mikebenq 1:f54bee9d59de 283 }
mikebenq 1:f54bee9d59de 284
mikebenq 1:f54bee9d59de 285
mikebenq 1:f54bee9d59de 286 void VS1053::initialize(void)
mikebenq 1:f54bee9d59de 287 {
mikebenq 1:f54bee9d59de 288 _RST = 1;
mikebenq 1:f54bee9d59de 289 cs_high(); //chip disabled
mikebenq 1:f54bee9d59de 290 sci_initialise(); //initialise MBED
mikebenq 1:f54bee9d59de 291 sci_write(SCI_MODE,(SM_SDINEW+SM_RESET)); // set mode reg.
mikebenq 1:f54bee9d59de 292 wait_ms(10);
mikebenq 1:f54bee9d59de 293 #if 1
mikebenq 1:f54bee9d59de 294 // debug
mikebenq 1:f54bee9d59de 295 unsigned int chipID_0=wram_read(para_chipID_0);
mikebenq 1:f54bee9d59de 296 if (firstTime) printf("chipID_0:%04X\r\n",chipID_0); // debug
mikebenq 1:f54bee9d59de 297 unsigned int chipID_1=wram_read(para_chipID_1);
mikebenq 1:f54bee9d59de 298 if (firstTime) printf("chipID_1:%04X\r\n",chipID_1); // debug
mikebenq 1:f54bee9d59de 299 unsigned int struct_version=wram_read(para_version);
mikebenq 1:f54bee9d59de 300 if (firstTime) printf("structure version:%04X\r\n",struct_version); // debug
mikebenq 1:f54bee9d59de 301 #endif
mikebenq 1:f54bee9d59de 302 //get chip version, set clock multiplier and load patch
mikebenq 1:f54bee9d59de 303 int i = (sci_read(SCI_STATUS)&0xF0)>>4;
mikebenq 1:f54bee9d59de 304 if(i == 4)
mikebenq 1:f54bee9d59de 305 {
mikebenq 1:f54bee9d59de 306 if (firstTime) printf("Installed Chip is: VS1053\r\n");
mikebenq 1:f54bee9d59de 307 sci_write(SCI_CLOCKF, (SC_MULT_XTALIx50+SC_ADD_20x));
mikebenq 1:f54bee9d59de 308 #ifdef VS_PATCH
mikebenq 1:f54bee9d59de 309 // loading patch
mikebenq 1:f54bee9d59de 310 write_plugin(vs1053b_patch, sizeof(vs1053b_patch)/2);
mikebenq 1:f54bee9d59de 311 if (firstTime) {
mikebenq 1:f54bee9d59de 312 printf("VS1053b patch loaded.\r\n");
mikebenq 1:f54bee9d59de 313 printf("patch size:%d bytes\r\n",sizeof(vs1053b_patch));
mikebenq 1:f54bee9d59de 314 }
mikebenq 1:f54bee9d59de 315 #endif
mikebenq 1:f54bee9d59de 316 #ifdef VS_SPECANA
mikebenq 1:f54bee9d59de 317 // loading plugin(spectrum analyzer)
mikebenq 1:f54bee9d59de 318 write_plugin(vs1053b_specana, sizeof(vs1053b_specana)/2);
mikebenq 1:f54bee9d59de 319 if (firstTime) printf("VS1053b specana loaded.\r\n");
mikebenq 1:f54bee9d59de 320 #endif
mikebenq 1:f54bee9d59de 321 }
mikebenq 1:f54bee9d59de 322 else printf("??? Not Supported Chip???\r\n");
mikebenq 1:f54bee9d59de 323 sdi_initialise();
mikebenq 1:f54bee9d59de 324 firstTime=0; // disable message when init after 1st time
mikebenq 1:f54bee9d59de 325 }