Hallo zusammen
Ich habe hier ein VLSI VS1053 Demo Board mit einem VS1053 MP3 Decoder
Chip drauf
http://ibay365-goodsimg.s3.amazonaws.com/864/20110509/20110509100307-98d56.jpg
So sieht das aus...
Nun habe ich das ganze an ein ET-TEAM STM32F103 Demo Board angeschlossen
http://futurlec.com/Pictures/STM32_Board_A600.jpg
Ich lese derzeit von der SD-Card (petitFat von elm chan) die mp3 oder
wav datei in einen Buffer, welcher dann ausgegeben wird.
Immer 32Bytes nach einander wenn der chip diese braucht.
Die Karte hängt am SPI1 und der Chip an SOFT-SPI
Ich habe performance halber zwei Buffer verwendet.
Das ganze sieht dann etwa so aus:
1 | if(buffSelect == 1)
|
2 | {
|
3 | rc = f_read(&fil, buff1, sizeof(buff1), &br); /* Lese 4096Bytes */
|
4 | if (rc || !br) break; /* Error or end of file */
|
5 | buffSelect = 5; //Buffer1 ist voll
|
6 | }
|
7 |
|
8 | if(buffSelect == 2)
|
9 | {
|
10 | rc = f_read(&fil, buff2, sizeof(buff2), &br); /* Lese 4096Bytes */
|
11 | if (rc || !br) break; /* Error or end of file */
|
12 | buffSelect = 4; //Buffer2 ist voll
|
13 | }
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | while(!VS_DREQ_CHECK()); //Warte bis Buffer 32Bytes fasst
|
19 |
|
20 | if((buffSelect == 2) || (buffSelect == 4)) //buffer2 ist in bearbeitung oder voll
|
21 | {
|
22 | vs_data32(&buff1[uiBuffAddress]); //Ab aktueller Buffer Adresse übergeben
|
23 | uiBuffAddress+=32;
|
24 | if(uiBuffAddress == sizeof(buff1)) //kompletter buffer übertragen
|
25 | {
|
26 | //variable setzen, damit der jetzt leere buffer1 wieder befüllt wird
|
27 | buffSelect = 1; //Buffer1 füllen
|
28 | uiBuffAddress = 0;
|
29 | }
|
30 | }
|
31 |
|
32 |
|
33 | if((buffSelect == 1) || (buffSelect == 5)) //Buffer 1 ist in bearbeitung oder voll
|
34 | {
|
35 | vs_data32(&buff2[uiBuffAddress]); //Ab aktueller Buffer Adresse übergeben
|
36 | uiBuffAddress+=32;
|
37 | if(uiBuffAddress == sizeof(buff2)) //kompletter buffer übertragen
|
38 | {
|
39 | //variable setzen, damit der jetzt leere buffer1 wieder befüllt wird
|
40 | buffSelect = 2; //Buffer1 füllen
|
41 | uiBuffAddress = 0;
|
42 | }
|
43 | }
|
Dies funktioniert an sich auch, jedoch ist das, wass der Chip ausgibt,
alles andere als schön.
Ich habe nach etwas googlen einen kleinen code gefunden von jemandem der
auch mit dem Teil experimentierte. Dieser hat eine kurze mp3 direkt im
Programm code hinzugefügt.
Ich habe dies auch mal gemacht und siehe da, es klang auf einmal "gut".
Leider habe ich keine Idee mehr, woran es liegen könnte.
Ich habe auch schon den LA angehängt.
Was auffält, bei einem wav file, ist der buffer des vs1053 beinahe
ständig leer (sieht man am DREQ) der Controller schiebt also immer Daten
nach.
Das was rauskommt ist allerdings besser als wenn der buffer voll wird
wie beim mp3...
Doch seht selbst und vorallem hört selbst ;)
ich hoffe jemand hat noch eine idee...
#### edit
Noch eine Anmerkung :)
Wenn ich den Buffer sagen wir auf ca 15kBytes erhöhe, und diesen mit dem
Inhalt der Speicherkarte befülle, und nun nur noch diesen Buffer
abspiele,
klingt es genau so merkwürdig.
Obwohl es dann aus dem "innern" speicher abspielt.