Forum: Mikrocontroller und Digitale Elektronik MP3 VS1053 gibt merkwürdiges rauschen mit dem Sound aus


von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Könnts sein, dasse mein Code gesehen hast?

Das klingt so als würde er nicht schnell genug Daten bekommen oder 
kleine Schnipsel doppelt abspielen.

Ich verwende nur einen 32Byte Puffer und mach den wieder voll wenn er 
komplett an den IC gesendet wurde.

Die SD Lib hat ja auch schon nen Cluster gebuffert.
Auf wieviel MHz laufen die SPI denn für SD Karte und MP3 decoder?

Das mit den 2 Buffern ist etwas verwirrend am Abend.

von C. H. (hedie)


Lesenswert?

Vielen Dank für deine schnelle Antwort

Martin Wende schrieb:
> Könnts sein, dasse mein Code gesehen hast?

Hast du ein HelloMP3 drinne gehabt?


Martin Wende schrieb:
> Ich verwende nur einen 32Byte Puffer und mach den wieder voll wenn er
> komplett an den IC gesendet wurde.

Hmm, dies hatte ich zu beginn auch mal, dachte aber, dass das erneute 
Befüllen des Buffer mit nur 32Bytes von der Karte etwas viel rechenpower 
für nichts verbraucht (zum öffnen des filesystems, erneutes setzen des 
lese addresse etc...) deshalb habe ich einen grossen (bzw. zwei) buffer 
genommen und diesen stück für stück immer um 32bytes reduziert...

Wenn dieser leer war, wieder auf einen schlag z.B. 4096 Bytes 
eingelesen.


Martin Wende schrieb:
> Auf wieviel MHz laufen die SPI denn für SD Karte und MP3 decoder?

SD-Card ist ca 4.5MHz
VS1053 ist ca. 800Khz-1MHz

von C. H. (hedie)


Lesenswert?

So habe nun herausgefunden, dass es an der Bitrate der Files liegt.

64kbit/s ist gut und wird problemlos abgespielt.

Sobald es jedoch höher wird, kommen oben erwähnte effekte zum vorschein 
und ein grausiger sound kommt heraus.

Ich kann mir dies nicht erklären, da der vs1053 ja auch bei den höheren 
Bitraten nicht mekkert, dass er zu wenig daten habe.

Wie man ja auf dem LA Log sehen kann (siehe bild mp3.jpg)
wird der DREQ Pin manchmal high (= er braucht daten) dann werden auch 
welche geliefert, und dann geht er wieder auf low.

Somit ist der interne 2048Byte Buffer des vs1053 ja immer gut gefüllt.

Weshalb tut er sich den dennoch schweer mir meinen Dateien?

von Claudio (Gast)


Lesenswert?

Hat vielleicht sonst noch jemand eine idee?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Versuchs ersmal mit IGORRRR mehr Takt! beim SD Karten SPI.

Scheint so zu sein als würde er einen Puffer 2 mal senden, weil er von 
der SD karte noch nicht aufgefüllt wurde.

Außerdem ist das Bufferumschalten "Ärghs!", bau dir maln FIFO!

Bei mir siehts so aus (einfachst Beispiel, ohne FIFO):
1
void play_file(unsigned char* filename){
2
3
  uint8_t j;
4
  
5
  ffopen(filename);
6
  seek = file.length;  
7
  
8
  //abspielen
9
  while(seek){
10
    if (VS_get_DREQ()) {
11
      if (seek >= 32){
12
        for (j = 0; j<32; j++){
13
          buffer[j] = ffread();
14
          seek--;
15
        }
16
        VS_write_databytes((unsigned const char*)&buffer, 32);
17
      }else{
18
        for (j = 0; j<seek; j++){
19
          buffer[j] = ffread();
20
          seek--;
21
        }
22
        VS_write_databytes((unsigned const char*)&buffer, ++j);
23
      }
24
    }
25
  }
26
  
27
  ffclose();
28
  VS_new_file();
29
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.