[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
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 )
ça ne fonctionne pas ,j'ai du oublier quelque chose
merci pour votre aide
cordialement
will
p.s: je fais suivre le sketch

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

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

merci pour votre aide

cordialement
will
p.s: je fais suivre le sketch

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
Post a Comment