AUDIO LIB

Dependents:   HagridOS5

Fork of VS1053 by Vassilis Serasidis

Committer:
Hagrid
Date:
Wed Feb 21 14:57:39 2018 +0000
Revision:
9:e5337a55871a
Parent:
8:5ad25d480d5f
Add feature to my project

Who changed what in which revision?

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