Forum: Mikrocontroller und Digitale Elektronik FatFs Sector falsch eingelesen


von DoBr (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein Problem bei der Implementierung von FatFs. Meinen Code habe
ich bereits als zip-File angehängt.
Ich benutze einen ATMEGA1284P und einen 16MHz Quarz. Mein Evalboard
versorge ich mit 3,3V damit die SD-Karte keine Probleme macht.
Um ISP und SPI zu trennen habe ich 1k Widerstände vor die SD Karte
gesetzt.
Meine Fuses sind 0xFD, 0xD3, 0xFD
Nun zu meinem Problem.

Wenn ich das Programm starte läuft alles erst mal ganz gut. Ich kann die
Karte initialisieren und mounten.
Dann starte ich die Funktion f_open. Als Fehler rückgabe der Funktion
bekomme ich  FR_NO_FILESYSTEM.
Daher überprüfte ich dich Funktion check_fs innerhalb der Funktion
find_volume (ebenfalls in f_open).
Dabei stellte ich fest, dass die boot record signature nicht erkannt
wird.

Also habe ich mit dem HexEditor mir mal die Signatur angesehen, die auf
der SD Karte liegt. Meine SD Karte hatte ich zuvor FAT32 mit Sektorgröße
512 formatiert. Und in den ersten Sektoren sind die letzten Byte immer
mit 0xAA55 belegt. Ein Fehler in der Formatierung liegt also nicht vor.

Da ich keinen JTAG Programmer zur Hand habe sondern nur ISP kann ich
leider nicht genau auslesen, was stattdessen eingelesen wird.

Daher habe ich ein Digitaloszilloskop zur Hand genommen und mir die
Übertragung angesehen.

Dazu habe ich mir den die Funktion rcvr_datablock mit Portbits markiert
um genau den Empfang der 512Byte am Oszi erkennen zu können. Und dabei
stellte ich fest, dass das erste Byte (0xEB) noch stimmt. Das zweite
jedoch schon nicht mehr (0x58 wird zu 0x20) und in etwa die letzten 32
Byte (kann auch sein, dass ich mich um 1-2 verzählt habe) sind 0xFF.

Ich habe den Code durchgesehen und weiß langsam nicht mehr wo ich suchen
soll.
Es wäre schön, wenn jemand anderes meinen Code zumindest mal laufen
lässt, und nachsieht ob bei ihm dasselbe Problem besteht. Oder mir
einen Tipp gibt wo ich noch suchen kann, bzw. was ich sonst noch tun
kann.

Vielen Dank schon jetzt für die Hilfe!

von Jim M. (turboj)


Lesenswert?

DoBr schrieb:
> Also habe ich mit dem HexEditor mir mal die Signatur angesehen, die auf
> der SD Karte liegt.

Mit welchem? Viele zeigen Dir nur den Inhalt der 1. Partition an, nicht 
aber die Partitionstabelle, weil das u.a. Admin Privilegien erfordert.

Die Partitionstabelle und der 1. Sektor einer FAT Partition enden 
gemeinerweise beide auf 0x55 0xAA.

DoBr schrieb:
> Meine SD Karte hatte ich zuvor FAT32 mit Sektorgröße
> 512 formatiert.

Dadurch wird die FAT vergrößert und man muss viele zusätzliche 
Schreibzugriffe drauf machen. Solange man nicht entsetzlich viele kleine 
Dateien unterbringen möchte, sind 32 KB Cluster für µC Anwendungen 
wesentlich besser geeignet.

Ist das eventuell eine SDHC Karte >= 16 GB? Die verwenden einen anderen 
Code in der Partitionstabelle, den manche FAT Implementierungen nicht 
kennen.

von DoBr (Gast)


Lesenswert?

Hallo,

danke für die schnelle Antwort.
Ich verwende HxD mit Administratorrechten. Ich habe nur eine Partition.
Die Sektoren 0-3 enden alle mit 0x55 0xAA.
Es wird mit dem Code von FatFs jedoch Sektor 0 ausgelesen.

Die Clustergröße habe ich verwendet, da Chan sie auf seiner Homepage als 
"übliche" Clustergröße bezeichnete und ich mir somit sicher sein konnte, 
dass er seinen Code damit getestet hat.

Die SD Karte hat 512MB und ist somit keine SDHC Karte. FATFS würde sonst 
auch einen anderen Fehler melden, das habe ich aus Interesse schon 
vorher mal getestet.

von Falk B. (falk)


Lesenswert?

@ DoBr (Gast)

>ich habe ein Problem bei der Implementierung von FatFs.

Du meinst das von ELMChan?

>Ich benutze einen ATMEGA1284P und einen 16MHz Quarz. Mein Evalboard
>versorge ich mit 3,3V damit die SD-Karte keine Probleme macht.

Gut.

>Um ISP und SPI zu trennen habe ich 1k Widerstände vor die SD Karte
>gesetzt.

SCHLECHT! Und unnütz! Pack einen Pull-Up an das Chip Select der SD-Karte 
und gut! KEINE Widerstände. Bei vollem SD-Takt holst du dir da 
ordentlich Probleme an den Hals!

>Ich habe den Code durchgesehen und weiß langsam nicht mehr wo ich suchen
>soll.

Der Code ist OK! Der die seit Jahren im Umlauf und gut getestet! Das 
Problem liegt höchstwahrscheinlich an deinem Hardwareaufbau!

von Falk B. (falk)


Lesenswert?

@DoBr (Gast)

>Die SD Karte hat 512MB und ist somit keine SDHC Karte. FATFS würde sonst
>auch einen anderen Fehler melden, das habe ich aus Interesse schon
>vorher mal getestet.

FatFs arbeitet auch mit SDHC Karten.

von DoBr (Gast)


Lesenswert?

Ja ich verwende das von ElmChan
Vielen Dank!
Ich habe die Widerstände ausgelötet, und jetzt geht es. Da kann ich mich 
ja zu tode suchen, warum empfielt Atmel so einen Kram, wenn es nicht 
geht

Meinst du ich bekomme Probleme mit dem ISP, wenn ich zusätzlich noch ein 
Schieberegister und einen Relaistreiber über die SPI ansteuere?

von Falk B. (falk)


Lesenswert?

@ DoBr (Gast)

>Ich habe die Widerstände ausgelötet, und jetzt geht es. Da kann ich mich
>ja zu tode suchen, warum empfielt Atmel so einen Kram, wenn es nicht
>geht

Auch bei Atmel arbeiten manchmal Praktikanten, die ohne ausreichende 
Kontrolle was veröffentlichen dürfen ;-)

>Meinst du ich bekomme Probleme mit dem ISP, wenn ich zusätzlich noch ein
>Schieberegister und einen Relaistreiber über die SPI ansteuere?

Nicht, wenn man es richtig macht (tm). Der Trick ist einfach, jedes Chip 
Select per externem Pull-Up zu deaktivieren, wenn der AVR programmiert 
wird. Dann sind alle SPI-ICs ruhig.

von Falk B. (falk)


Lesenswert?

@ DoBr (Gast)

>>Daher habe ich ein Digitaloszilloskop zur Hand genommen und mir die
>>Übertragung angesehen.

>Ich habe die Widerstände ausgelötet, und jetzt geht es.

Da hast du an der falschen Stelle gemessen oder dein Oszi ist eine 10 
MHz Gurke. Mach die Widerstände nochmal rein und miss alle Signale an 
BEIDEN Seiten der Widerstände und staune!

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.