Forum: Mikrocontroller und Digitale Elektronik Datei lesen mit FatFs


von Michael A. (michael_a43)


Lesenswert?

Hallo,

ich möchte mit meinem ATMEGA326 eine Datei von der SD-Karte lesen.
Hierzu verwende ich das FatFs von Elm Chan.
Der Kartenleser ist über SPI an den Controller angebunden.
Als Grundlage verwende ich das Beispiel von Elm Chan - dort ist auch die 
SPI-Integration her.

Hier folgender Code-Ausschnitt
1
res = f_mount(&FatFs, "", 1);    
2
res = f_opendir(&Dir, "folder_0");    
3
4
if (res == FR_OK) 
5
{
6
res = f_open(&File, "folder_0\\track2.wav", FA_OPEN_EXISTING|FA_READ);  
7
8
if (res == FR_OK)
9
{
10
  UINT br;
11
  uart_puts("File opend\n\r");
12
   res = f_read(&File, cDebug, 20, &br);
13
 
14
   sprintf(cDebug,"Bytes read: %d - Return: %d\n\r",br,res);
15
   uart_puts(cDebug);
16
17
}
18
else
19
{
20
  sprintf(cDebug,"Could not open the file - Return: %d\n\r",res);
21
  uart_puts(cDebug);
22
}
23
}
24
else
25
{
26
  uart_puts("Could not open the directory\n\r");  
27
}

Am Terminal sehe ich die Ausgabe "File opend" - ich gehe somit aus, dass 
bis hier alles richtig ist.
Der Returnwert vom f_read ist aber 9 -> FR_INVALID_OBJECT und die 
Variable br hat den Wert "0".

Muss ich hier noch etwas machen, bevor ich die Daten lesen kan ?

Vielen Dank schon mal im vorraus.

Gruß,

Michael

von Falk B. (falk)


Lesenswert?

@ Michael A. (michael_a43)

>Der Returnwert vom f_read ist aber 9 -> FR_INVALID_OBJECT und die
>Variable br hat den Wert "0".

>Muss ich hier noch etwas machen, bevor ich die Daten lesen kan ?

Nein, der Ansatz ist richtig. Das Directory musst du nicht öffnen, es 
reicht der absolute Pfad. Aber

"folder_0\\track2.wav"

Doppelbackslash? Wozu?

von Programmierer (Gast)


Lesenswert?

Falk B. schrieb:
> "folder_0\\track2.wav"
>
> Doppelbackslash? Wozu?
Escaping? Damit der C-Compiler den akzeptiert und einen einzelnen daraus 
macht?

von Falk B. (falk)


Lesenswert?

@Programmierer (Gast)

>> "folder_0\\track2.wav"

>> Doppelbackslash? Wozu?

>Escaping? Damit der C-Compiler den akzeptiert und einen einzelnen daraus
>macht?

Ahhh, war schon zu spät 8-0

von Michael A. (michael_a43)


Lesenswert?

Ich hab noch das Problem, wenn ich mir den Inhalt eines Ordners anzeigen 
lassen will, dass ich hier nicht alle Dateien bzw. Unterordner sehe.
Evtl. liegt es an meiner Implementierung von der SPI-Kommunikation.

Hat jemand für mich evtl. eine Beispiel implementierung für einen 
Atmega328 o.ä., damit ich diesen Fehler ausschließen kann ?

Gruß,

Michael

P.S. hat der Doppelslash ist das Escaping ;o)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Michael A. (michael_a43)

>Ich hab noch das Problem, wenn ich mir den Inhalt eines Ordners anzeigen
>lassen will, dass ich hier nicht alle Dateien bzw. Unterordner sehe.
>Evtl. liegt es an meiner Implementierung von der SPI-Kommunikation.

Niemals. Wenn dort was klemmt, gehen ganz andere Sachen nicht.

>Hat jemand für mich evtl. eine Beispiel implementierung für einen
>Atmega328 o.ä., damit ich diesen Fehler ausschließen kann ?

Die Implementation von ELM Chan ist OK, dort sind mehrere AVR-Beispiele 
drin.

Konntest du nun die Datei lesen?

von Michael A. (michael_a43)


Lesenswert?

Hallo,

bin nun einen Schritt weiter...
Das Problem liegt in der Funktion "disk_timerproc();" die ich, wie auch 
im Beispiel angegeben" alle 10 ms Aufrufe.

Wenn ich dieses Funktionsaufruf auskommentiere, kann ich die Dateien von 
der SD-Karte lesen.

Bin noch auf der Suche, warum das bei mir nicht geht.

Michael

von Falk B. (falk)


Lesenswert?

@ Michael A. (michael_a43)

>Das Problem liegt in der Funktion "disk_timerproc();" die ich, wie auch
>im Beispiel angegeben" alle 10 ms Aufrufe.

Gut.

>Wenn ich dieses Funktionsaufruf auskommentiere, kann ich die Dateien von
>der SD-Karte lesen.

Kann es sein, dass du die Macros nicht an deine Hardware angepasst hast? 
Dann erkennt deine Fat Lib nämlich nie eine Karte. Zu Einfachheit kann 
man sie als konstant definieren
1
#define MMC_CD   1 // (!(PINB & 0x10))  /* Card detected.   yes:true, no:false, default:true */
2
#define MMC_WP   0 // (PINB & 0x20)    /* Write protected. yes:true, no:false, default:false */

Beitrag "Re: Elm Chan FatFs SD Karte auf Keil MCB2300 LCP2378"

von Michael A. (michael_a43)


Lesenswert?

Hallo Falk,

vielen Dank für deine Hilfe - das war natürlich der richtige Hinweis !!
Hab an die ganzen Ports für SPI gedacht und dann die beiden vergessen 
:o(
Kann nun die Daten von der SD-Karte lesen....

Hab nur noch ein kleines Problem wenn ich WAV-Dateien auf der Karte 
abspielen will, aber dazu hab ich einen neuen Thread aufgemacht.

Nochmals vielen Dank !

Gruß,
Michael

von Falk B. (falk)


Lesenswert?

@ Michael A. (michael_a43)

>Kann nun die Daten von der SD-Karte lesen....

Kaum macht man es richtig, schon funktioniert's! ;-)

>Hab nur noch ein kleines Problem wenn ich WAV-Dateien auf der Karte
>abspielen will, aber dazu hab ich einen neuen Thread aufgemacht.

Wo?

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.