Forum: Mikrocontroller und Digitale Elektronik Beschleunigung des Leseprozess auf SD-Karte


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Ich nutze die Library von Roland Riegel um eine SD-Karte zu lesen.
Wenn ich eine MP3 abspielen werde, möchte ich auch die MP3-Tags 
anzeigen.

Leider befinden sich diese 128 Bytes AM ENDE der Datei.

Ich nutze folgende Funktion um sie zu lesen:
1
void mp3GetTags()
2
{
3
  int32_t offset = -128;
4
  unsigned char tags[128];
5
  char str[92];
6
  uint8_t l, i;
7
  int16_t len;
8
9
  setStringToScroll(mp3ToPlay);
10
  if(fat_seek_file(fd, &offset, FAT_SEEK_END) != 0)
11
  {
12
    if((len = fat_read_file(fd, tags, 128)) == 128)
13
    {
14
      if(strncmp((char*)tags, "TAG", 3) == 0)
15
      {
16
        bzero(str, 92);
17
        i = 0;
18
        if(tags[33] != 0)
19
        {
20
          for(l = 33; l < 63 && tags[l] != 0; l++)    // Artist
21
            str[i++] = tags[l];
22
          str[i++] = ' ';
23
          str[i++] = '-';
24
          str[i++] = ' ';
25
        }
26
        for(l = 3; l < 33 && tags[l] != 0; l++)       // Title
27
          str[i++] = tags[l];
28
        if(tags[97] != 0)                             // Comment
29
        {
30
          str[i++] = ' ';
31
          str[i++] = '-';
32
          str[i++] = ' ';
33
          for(l = 97; l < 127 && tags[l] != 0; l++)
34
            str[i++] = tags[l];
35
        }
36
        setStringToScroll(str);
37
      }
38
    }
39
  }
40
  offset = 0;
41
  fat_seek_file(fd, &offset, FAT_SEEK_SET);
42
}

Die Funktion arbeitet problemlos, ist aber sehr langsam. Wenn die Datei 
4MB groß ist, braucht die Funktion ~4 Sekunden um mir die MP3-Tags 
zurückzugeben.

Frage: sieht ihr eine Möglichkeit, diese Funktion irgendwie zu 
beschleunigen?
Ich bin 100% sicher, daß das Problem bei der fat_read_file liegt, denn 
die fat_seek_file ändert nur einen Zeiger.

Eventuell, eine andere Frage: da der MP3-Decoder mit einer maximalen 
SPI-Clock von 3.5MHz arbeiten kann, nutze ich einen SPI-Clock von 2MHz 
für alle Geräte (SD und MP3-Decoder).

Macht es Probleme wenn ich einen Clock für die SD-Karte nutze, und einen 
anderen für die MP3 (eventuell auch nur für die Funktion, die die 
MP3-Tags liest)? Beide nutzen Hardware-SPI.

Nochwas: was ist der maximale Clock, der ich mit einer SD-Karte nutzen 
kann? Ich kann bis 8MHz arbeiten (der ATMega32 nutzt einen 16MHz Quarz).
Ist es zu viel? Wenn nicht, würde eventuell die Zeit um einen Faktor 4 
reduzieren...

Danke für eure Meinungen!
Luca Bertoncello

von Hans W. (stampede)


Lesenswert?

Hallo,

>>Eventuell, eine andere Frage: da der MP3-Decoder mit einer maximalen
>>SPI-Clock von 3.5MHz arbeiten kann, nutze ich einen SPI-Clock von 2MHz
>>für alle Geräte (SD und MP3-Decoder).

Das macht doch mal gar keinen Sinn. Da alles Geräte am Bus ihre eigene 
CS-Line haben, kannst du den SPI immer mit dem max. möglichen Clock für 
das entsprechende Device takten. Und wenn du mal die Clock für die SD 
von 2MHz auf die erlaubten 20MHz anhebst (oder wie der AVR auch immer 
schafft), wird das dein Ergebnis schon mal deutlich verbessern.

Welchen Decoder benutzt du?

Gruß
Stefan

von Luca B. (lucabert)


Lesenswert?

Hans W. schrieb:
> Hallo,
>
>>>Eventuell, eine andere Frage: da der MP3-Decoder mit einer maximalen
>>>SPI-Clock von 3.5MHz arbeiten kann, nutze ich einen SPI-Clock von 2MHz
>>>für alle Geräte (SD und MP3-Decoder).
>
> Das macht doch mal gar keinen Sinn. Da alles Geräte am Bus ihre eigene
> CS-Line haben, kannst du den SPI immer mit dem max. möglichen Clock für
> das entsprechende Device takten. Und wenn du mal die Clock für die SD
> von 2MHz auf die erlaubten 20MHz anhebst (oder wie der AVR auch immer
> schafft), wird das dein Ergebnis schon mal deutlich verbessern.

Aha! Ich war nicht sicher... Ich werde probieren!

> Welchen Decoder benutzt du?

VS1011e. Gutes Ding, hat aber dieser Grenze: max SPI-Clock <= 
ClockVS1011 / 7.
Wenn ich den Chip mit 24.576MHz tatkte, sind ~3.5MHz... :(

Grüße
Luca Bertoncello

von Hans W. (stampede)


Lesenswert?

Hi,

>>Value for SCI reads must be sufficiently below CLKI/
>>6 to allow timing variation between the systems.
>>SCI and SDI writes allow CLKI/4 .
Das heisst, dass du schreibend mit rund 6MHz in den VS1011e schicken 
kannst.
Nur: Der VS1053 ist viel viel besser :)

Gruss,
Stefan

von Luca B. (lucabert)


Lesenswert?

Hans W. schrieb:
> Hi,
>
>>>Value for SCI reads must be sufficiently below CLKI/
>>>6 to allow timing variation between the systems.
>>>SCI and SDI writes allow CLKI/4 .
> Das heisst, dass du schreibend mit rund 6MHz in den VS1011e schicken
> kannst.

Also, der Hersteller des Chips hat mir mehrmals gesagt, daß ich maximal 
Clock/7 nutzen darf!
Und es wurde mir auch bestätigt mit eigenen Erfahrung, daß wenn ich 
schneller als 3.5MHz die Daten schicke, versteht der Chip nur Bahnhof 
und gut Abspielen und eine Glückssache...

> Nur: Der VS1053 ist viel viel besser :)

Ich diskutiere nicht! Ich habe aber nur den VS1011e... :D

Also, ich kann mit der SD-Karte mit 8MHz sprechen und mit dem VS1011e 
mit 2MHz, richtig?
Und wenn ich den ChipSelect des VS1011e nicht setze, ist ihm egal, 
welcher Clock ich nutze, richtig?

Ich werde dann mein Programm anpassen!

Grüße
Luca Bertoncello

von Hans W. (stampede)


Lesenswert?

HI,

>>Also, der Hersteller des Chips hat mir mehrmals gesagt, daß ich maximal
>>Clock/7 nutzen darf!
Dann sollte das DB überarbeitet werden.
>>Also, ich kann mit der SD-Karte mit 8MHz sprechen und mit dem VS1011e
>>mit 2MHz, richtig?
>>Und wenn ich den ChipSelect des VS1011e nicht setze, ist ihm egal,
>>welcher Clock ich nutze, richtig?
Exakt.

Gruß
Stefan

von Luca B. (lucabert)


Lesenswert?

Hans W. schrieb:

> Das macht doch mal gar keinen Sinn. Da alles Geräte am Bus ihre eigene
> CS-Line haben, kannst du den SPI immer mit dem max. möglichen Clock für
> das entsprechende Device takten. Und wenn du mal die Clock für die SD
> von 2MHz auf die erlaubten 20MHz anhebst (oder wie der AVR auch immer
> schafft), wird das dein Ergebnis schon mal deutlich verbessern.

So, ich habe das Programma angepasst.
Die Verwaltung der SD-Karte erfolgt mit einem Takt von 8MHz, und die 
Verwaltung des VS1011e mit einem Takt von 2MHz.

Alles funktioniert prima, und die Zeit bei der Ablesung der MP3-Tags hat 
sich um einen Faktor 4 reduziert!

Besten Dank
Luca Bertoncello

von Hans W. (stampede)


Lesenswert?

Hi,

>Alles funktioniert prima, und die Zeit bei der Ablesung der MP3-Tags hat
>sich um einen Faktor 4 reduziert!
SO war es zu erwarten. Wenn dir das mit den Tags lange dauert, wäre es 
auch denkbar, dass die ID3V1 Tags einfach nicht ausliest, sondern die 
ID3V2.x. Diese befinden sich am Anfang der Datei und du musst nicht die 
ganze Clusterkette durchrödeln um an die Daten zu kommen. Und die 
ID3V2.x werden von so ziemlich jeder Software angelegt.

Gruß
Stefan

von Luca B. (lucabert)


Lesenswert?

Hans W. schrieb:
> Hi,
>
>>Alles funktioniert prima, und die Zeit bei der Ablesung der MP3-Tags hat
>>sich um einen Faktor 4 reduziert!
> SO war es zu erwarten. Wenn dir das mit den Tags lange dauert, wäre es
> auch denkbar, dass die ID3V1 Tags einfach nicht ausliest, sondern die
> ID3V2.x. Diese befinden sich am Anfang der Datei und du musst nicht die
> ganze Clusterkette durchrödeln um an die Daten zu kommen. Und die
> ID3V2.x werden von so ziemlich jeder Software angelegt.

Ach! Das wäre auch eine gute Idee...
Ich suche die Dokumentation der ID3V2.x. Wenn es nicht so aufwändig ist, 
das Programm anzupassen, werde ich es implementieren!

Danke
Luca Bertoncello

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.