www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR VS1011 MP3-Daten richtig senden


Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

auch ich will mich einmal hier zu Wort melden.

Ich versuche seit Tagen korrekte MP3-Dateien an einen VS1011 im NewMode 
zu senden.

Ich kann Register auslesen, den Sinus Test durchführen und vernehme ein 
Knacken, Rauschen und abgehackten Lärm in den Lautsprechern, wenn ich 
die Audio-Daten sende.

Ich denke das Problem liegt also eindeutig in dem Code, den ich zum 
Senden der Dateien verwende.
Ich habe bisher drei SD/MMC Libraries ausprobiert, sie alle 
funktionieren wirklich wunderbar, nur leider nicht für meine Zwecke.

Ich initialisierie folgendermaßen:
HardReset->Softreset->SetzeModus(SDINEW)->Setze ClockDoubler->Schreibe 
ins AUDATA register

Wie gesagt, der Sinus Test funktioniert, der Quarz schwingt also?

Erster Versuch (Library von Daniel R. siehe: 
http://www.mikrocontroller.net/articles/AVR_FAT32:
void Play()
{
unsigned char file_name[20]="test    mp3";
 if(MMC_FILE_EXISTS == ffopen(file_name))
 {
 //geht super
 uputs((unsigned char*)"Datei exisitert!\n");
        // setzen einer Variable und dann runterzählen geht am schnellsten !
        unsigned long int seek=file.length;
     //runterspulen
        while ( seek > 0)
      {
      //buffer voll
          WaitforDREQ();
        SelectSDI();
        //32 Byte Blöcke senden
        for (long i = seek; i > (seek-32); i--)
        {
        WriteByteSPI(ffread());
        }
        DeSelectSDI();

        seek = seek - 32;
    }
     
      uputs((unsigned char*)"Dateiende!\n");
        ffclose();
     }
    
}

Ich höre nichts.

Zweiter Versuch (Library von Ulrich Radig):
Clustervar = 0;
if (fat_search_file((unsigned char *)"test.mp3",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
{
uputs("\nDatei gefunden!!\r\n");
  

    for (int b = 0;b<52;b++)
      {
      fat_read_file (Clustervar,Buffer,b);
      
       uint8_t k = 0;    
       WaitforDREQ();
       SelectSDI();
      while(k < 512)
      {

               WriteByteSPI(Buffer[k]);
         k++;
      }
      DeSelectSDI();
      

  }
    
    }
    return;

Hier vernehme ich abgehackten Lärm aus den Kopfhörern, der jedoch 
schnell wieder vorbei ist. Ich nehme an es handelt sich dabei um einen 
Dekodierungsversuch =).

Ich entschuldige mich schon jetzt für meine miserablen Programmierkünste 
und wünsche euch allen einen schönen Tag!

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß mit an Sicherheit grenzender Wahrscheinlichkeit, dass es hier 
Leute gibt, die das Wissen. Deswegen starte ich mal einen 
Wiederbelebungsversuch.

Viele Grüße.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>       uint8_t k = 0;
>      while(k < 512)

k ist immer kleiner als 512 weil es nie größer als 255 wird.

>        SelectSDI();
>        //32 Byte Blöcke senden
>        for (long i = seek; i > (seek-32); i--)
>        {
>        WriteByteSPI(ffread());
>        }
>        DeSelectSDI();

Hast du zwei getrennte SPI?

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersteinmal vielen Dank, dass hier jemand antwortet :).

Ich verwende ein Hardware SPI. An diesem Hängen die SD-Karte und der 
VS1011 (und der ISP, aber den ziehe ich raus).

Viele Grüße.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich verwende ein Hardware SPI. An diesem Hängen die SD-Karte und der
>VS1011 (und der ISP, aber den ziehe ich raus).

Dann versuchs mal so:

       //32 Byte Blöcke senden
       for (long i = seek; i > (seek-32); i--)
       {
        unsigned char by;
        by = ffread();
        SelectSDI();
        WriteByteSPI(by);
        DeSelectSDI();
       }

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daraus wurde leider auch nichts, es scheint mir fast so, als wäre seek 
immer 0 und er würde die Schleife überspringen. Schreibe ich direkt in 
den Schleifeninhalt eine kurze Rückmeldung per UART, kommt diese nicht 
an.

Ich erhalte nur "Datei gefunden!" und "Dateiende!".

Das sind aber auch einfach sehr viele Fehlerquellen....

Viele Grüße und ganz herzlichen Dank für ihre Bemühungen.

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es jetzt nochmal anders Versucht:

      uint8_t buffer[32];
      uint8_t i = 0;
        do{
           buffer[i] = ffread();
       i++;
       if (i > 31)
       {
         uputs((unsigned char*)"Sende Datenblock!\n");
         WaitforDREQ();
        SelectSDI();
        for (uint8_t k = 0; k < 32; k++)
        {
          WriteByteSPI(buffer[k]);
        } 
        DeSelectSDI();
        i = 0;

       }
        }while(--seek);

Jetzt habe ich zumindestens die Ausgabe "Sende Datenblock!" sehr häufig, 
er scheint also die Datei zu lesen. Ich höre ein pulsierendes leises 
Piepsen. (erinnert mich an einen alten CD-Player, wenn man CDs gespult 
hat).

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Jetzt habe ich zumindestens die Ausgabe "Sende Datenblock!" sehr häufig,

Dann nimm die Ausgabe mal raus. Was glaubst du wie lange die dauert?
Möglicherweise ist der Puffer dann schon abgespielt.

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat leider den gleichen Effekt. Kann es sein, dass die Datei einfach 
viel zu schnell übertragen wird?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das hat leider den gleichen Effekt. Kann es sein, dass die Datei einfach
>viel zu schnell übertragen wird?

Wenn du auf DREQ wartest nicht.

Das hier passt auch noch nicht:

        }while(--seek);


Besser:

 if(seek > 32) seek -= 32;
 else seek = 0;
 }while(seek);


Wie sehen eigentlich

        WaitforDREQ();
        SelectSDI();
        WriteByteSPI(buffer[k]);

aus?

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die 3 Funktionen:
void WaitforDREQ()
{
loop_until_bit_is_set(PINA, DREQ);

}
uint8_t
WriteByteSPI (uint8_t data)
{

    SPDR = data;    

    while (!(SPSR & _BV (SPIF)));  

    return SPDR;
}
void SelectSDI()
{
  PORTA &= ~_BV(xDCS);
}

Hier noch die SPI Schnittstelle an sich:
void InitSPI(void)
{

    DDRB |= _BV (MOSI) | _BV (SCK);  
    PORTB |= _BV (MOSI) | _BV (SCK);

    DDRB |= _BV (SS);
    PORTB |= _BV (SS);  

  SPCR = _BV (MSTR) | _BV (SPE); 
  SPCR |= _BV (SPR0);
}

Autor: DinoKrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was noch zu sagen wäre ist, dass ich zuerst eigentlich die SD/MMC 
library von Roland Riegel nehmen wollte, weil ich für diese ein Beispiel 
zum korrekten Senden der Daten habe.
Die Library erkennt aber nach erfolgreicher initialisierung der 
Speicherkarte leider die Datei "test.mp3" nicht.

Verwendetder Code:
  struct fat16_file_struct* fd = open_file_in_dir(fs, dd, "test.mp3");
   uint8_t buffer[32];
  if(!fd)
    {
//hier landet er immer, fs und dd wurden korrekt zugewiesen
  uputs("Datei nicht gefunden!");
  return;
  }

Autor: Dinokrokodil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir jetzt das DREQ Signal nochmal genau angesehen, ist es 
normal das es immer zwischen 0 und 1 schwankt, also das es nie eine Zeit 
lang auf eins bleibt, sondern mit relativ schneller Geschwindigkeit 
zwischen beiden Zuständen hin und her pendelt (auch nach dem 
Hard/Softreset), dabei aber keinem bestimmten Muster folgt?

Viele Grüße.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.