[conseil] Carte DEV-10587 [Résolu]


bonsoir @ tous
voilà je possède cette carte (dev-10587) :  http://www.sparkfun.com/products/10587
elle fonctionne ,déjà une bonne chose  :smiley-mr-green:

mais possèdant un lecteur de carte sd (adafruit) je n'ai pas trouvé utile de prendre cette carte :
http://www.sparkfun.com/products/10628

mais voilà , la lecture de mp3 ne fonctionne pas  =(
pourtant j'ai respecté les conseils (intégré la lib , modifié le fichier sd2pinmap.h , mis les fichiers mp3 d'exemples )
quote
it relies on sdfatlib bill greiman:
http://code.google.com/p/sdfatlib/
need download , install library. compile, must change sd2pinmap.h of sdfatlib!
default ss_pin = 10;. must change line under atmega328/arduino area of code
uint8_t const ss_pin = 9;. cause sdfatlib use pin 9 'chip select'
microsd card on pin 9 of arduino layout of shield works.


ça ne fonctionne pas ,j'ai du oublier quelque chose  :smiley-red:

merci pour votre aide  ;)
cordialement
will

p.s: je fais suivre le sketch  ;) :d

voici le sketch (vous pouvez le voir sur le site) car obligé d'enlever des lignes de texte :

code: [select]


#include <spi.h>

//add sdfat libraries
#include <sdfat.h>
#include <sdfatutil.h>

//create variables used sdfat library
sd2card card;
sdvolume volume;
sdfile root;
sdfile track;


char trackname[] = "track001.mp3";
int tracknumber = 1;

char errormsg[100]; //this generic array used sprintf of error messages

#define true  0
#define false  1

//mp3 player shield pin mapping. see schematic
#define mp3_xcs 6 //control chip select pin (for accessing spi control/status registers)
#define mp3_xdcs 7 //data chip select / bsync pin
#define mp3_dreq 2 //data request pin: player asks more data
#define mp3_reset 8 //reset active low
//remember have edit sd2pinmap.h of sdfatlib library correct control sd card.

//vs10xx sci registers
#define sci_mode 0x00
#define sci_status 0x01
#define sci_bass 0x02
#define sci_clockf 0x03
#define sci_decode_time 0x04
#define sci_audata 0x05
#define sci_wram 0x06
#define sci_wramaddr 0x07
#define sci_hdat0 0x08
#define sci_hdat1 0x09
#define sci_aiaddr 0x0a
#define sci_vol 0x0b
#define sci_aictrl0 0x0c
#define sci_aictrl1 0x0d
#define sci_aictrl2 0x0e
#define sci_aictrl3 0x0f

void setup() {
  pinmode(mp3_dreq, input);
  pinmode(mp3_xcs, output);
  pinmode(mp3_xdcs, output);
  pinmode(mp3_reset, output);

  digitalwrite(mp3_xcs, high); //deselect control
  digitalwrite(mp3_xdcs, high); //deselect data
  digitalwrite(mp3_reset, low); //put vs1053 hardware reset

  serial.begin(9600); //use serial debugging
  serial.println("mp3 testing");

  //setup sd card interface
  pinmode(9, output);       //pin 10 must set output sd communication work.
  if (!card.init(spi_full_speed))  serial.println("error: card init"); //initialize sd card , configure i/o pins.
  if (!volume.init(&card)) serial.println("error: volume ini"); //initialize volume on sd card.
  if (!root.openroot(&volume)) serial.println("error: opening root"); //open root directory in volume.


  spi.setclockdivider(spi_clock_div16); //set spi bus speed 1mhz (16mhz / 16 = 1mhz)
  spi.transfer(0xff); //throw dummy byte @ bus
  //initialize vs1053 chip
  delay(10);
  digitalwrite(mp3_reset, high); //bring vs1053
  //delay(10); //we don't need delay because register changes check high dreq

  //mp3setvolume(20, 20); //set initial volume (20 = -10db) loud
  mp3setvolume(40, 40); //set initial volume (20 = -10db) manageable
  //mp3setvolume(80, 80); //set initial volume (20 = -10db) more quiet

  //let's check status of vs1053
  int mp3mode = mp3readregister(sci_mode);
  int mp3status = mp3readregister(sci_status);
  int mp3clock = mp3readregister(sci_clockf);

  serial.print("sci_mode (0x4800) = 0x");
  serial.println(mp3mode, hex);

  serial.print("sci_status (0x48) = 0x");
  serial.println(mp3status, hex);

  int vsversion = (mp3status >> 4) & 0x000f; //mask out 4 version bits
  serial.print("vs version (vs1053 4) = ");
  serial.println(vsversion, dec); //the 1053b should respond 4. vs1001 = 0, vs1011 = 1, vs1002 = 2, vs1003 = 3

  serial.print("sci_clockf = 0x");
  serial.println(mp3clock, hex);

  //now have vs1053 , running, increase internal clock multiplier , our spi rate
  mp3writeregister(sci_clockf, 0x60, 0x00); //set multiplier 3.0x


  spi.setclockdivider(spi_clock_div4); //set spi bus speed 4mhz (16mhz / 4 = 4mhz)

  mp3clock = mp3readregister(sci_clockf);
  serial.print("sci_clockf = 0x");
  serial.println(mp3clock, hex);

  //mp3 ic setup complete
}

void loop(){

  //let's play track of given number
  sprintf(trackname, "track%03d.mp3", tracknumber); //splice new file number file name
  playmp3(trackname); //go play trackxxx.mp3

  //once done playing or have exited playback reason, decide track play next
  tracknumber++; //when loop, advance next track!

  if(tracknumber > 100) {
    serial.println("whoa there cowboy!"); //soft limit. shouldn't trying open past track 100.
    while(1);
  }
}
void playmp3(char* filename) {

  if (!track.open(&root, filename, o_read)) { //open file in read mode.
    sprintf(errormsg, "failed open %s", filename);
    serial.println(errormsg);
    return;
  }

  serial.println("track open");

  uint8_t mp3databuffer[32]; //buffer of 32 bytes. vs1053 can take 32 bytes @ go.
  //track.read(mp3databuffer, sizeof(mp3databuffer)); //read first 32 bytes of song
  int need_data = true;
  long replenish_time = millis();

  serial.println("start mp3 decoding");

  while(1) {
    while(!digitalread(mp3_dreq)) {
     
      if(need_data == true) {
        if(!track.read(mp3databuffer, sizeof(mp3databuffer))) { //try reading 32 new bytes of song
          //oh no! there no data left read!
          //time exit
          break;
        }
        need_data = false;
      }

     
      serial.print("time replenish buffer: ");
      serial.print(millis() - replenish_time, dec);
      serial.print("ms");

      //test see how can before audio starts glitch
      long start_time = millis();
      //delay(150); //do nothing - audible glitches
      //delay(135); //do nothing - audible glitches
      //delay(120); //do nothing - barely audible glitches
      delay(100); //do nothing - sounds fine
      serial.print(" idle time: ");
      serial.print(millis() - start_time, dec);
      serial.println("ms");
     
      replenish_time = millis();
    }
    if(need_data == true){ //this here in case haven't had free time load new data
      if(!track.read(mp3databuffer, sizeof(mp3databuffer))) { //go out sd card , try reading 32 new bytes of song
        //oh no! there no data left read!
        //time exit
        break;
      }
      need_data = false;
    }

    //once dreq released (high) feed 32 bytes of data vs1053 our sd read buffer
    digitalwrite(mp3_xdcs, low); //select data
    for(int y = 0 ; y < sizeof(mp3databuffer) ; y++) {
      spi.transfer(mp3databuffer[y]); // send spi byte
    }

    digitalwrite(mp3_xdcs, high); //deselect data
    need_data = true; //we've dumped 32 bytes vs1053 our sd read buffer empty. set flag go more data
  }

  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating transfer complete
  digitalwrite(mp3_xdcs, high); //deselect data
 
  track.close(); //close out track

  sprintf(errormsg, "track %s done!", filename);
  serial.println(errormsg);
}

void mp3writeregister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte){
  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating ic available
  digitalwrite(mp3_xcs, low); //select control

  //sci consists of instruction byte, address byte, , 16-bit data word.
  spi.transfer(0x02); //write instruction
  spi.transfer(addressbyte);
  spi.transfer(highbyte);
  spi.transfer(lowbyte);
  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating command complete
  digitalwrite(mp3_xcs, high); //deselect control
}

//read 16-bit value of vs10xx register
unsigned int mp3readregister (unsigned char addressbyte){
  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating ic available
  digitalwrite(mp3_xcs, low); //select control

  //sci consists of instruction byte, address byte, , 16-bit data word.
  spi.transfer(0x03);  //read instruction
  spi.transfer(addressbyte);

  char response1 = spi.transfer(0xff); //read first byte
  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating command complete
  char response2 = spi.transfer(0xff); //read second byte
  while(!digitalread(mp3_dreq)) ; //wait dreq go high indicating command complete

  digitalwrite(mp3_xcs, high); //deselect control

  int resultvalue = response1 << 8;
  resultvalue |= response2;
  return resultvalue;
}

//set vs10xx volume register
void mp3setvolume(unsigned char leftchannel, unsigned char rightchannel){
  mp3writeregister(sci_vol, leftchannel, rightchannel);
}



@+


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > [conseil] Carte DEV-10587 [Résolu]


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial