Hallo,
ich habe hier das STM3210C-Eval Board und versuche darauf, das FatFs
Beispiel von ST zum laufen zu bekommen.
Laut readme sollte das Projekt direkt lauffähig sein.
Ich habe es mit SW4STM32 geöffnet, kann es ohne Fehler und Warnungen
kompelieren und kann es auf den Controller laden. Es läuft auch zunächst
ohne Probleme.
Die Karte wird gefunden, eingebunden und formatiert. Bei diesen
Funktionen tritt kein Fehler auf.
Jedoch dann beim Versuch eine Datei zu öffnen respektive zu schreiben.
Die Funktion f_open gibt immer den Fehler FR_NO_FILESYSTEM zurück.
Formatiert wurde die Karte jedoch, sehe ich in Windows. Habe die Karte
mal testweise mit dem SD Card Formatter formatiert, und die Zeilen zum
formatieren im Code auskommentiert, selber Fehler. Auch wenn ich die
Datei am PC erstelle und drauf kopiere, kann der STM32 die Datei nicht
lesen, wieder selber Fehler.
Beim debuggen habe ich den Fehler zurück verfolgen können. Innerhalb von
f_open wird find_volume aufgerufen. Hier scheint dann das Problem von
der Funktion check_fs zu kommen, da diese 2 zurück gibt.
Das ist der Teil vom Code, bei dem die 2 gesetzt wird:
1
/* 0:FAT boor sector, 1:Valid boor sector but not FAT, 2:Not a boot sector, 3:Disk error */
2
if(LD_WORD(&fs->win.d8[BS_55AA])!=0xAA55)/* Check boot record signature (always placed at offset 510 even if the sector size is >512) */
3
return2;
Laut dem Kommentar darüber scheint es keinen boot sector zu geben.
Wo liegt mein Fehler?
Danke :)
Die Signatur 0xaa55 weisst darauf hin, dass das FS versucht, auf einem
Jedec kompatiblen externen Flash Baustein zu arbeiten. Wenn dein FS aber
(wie Du schreibst) auf einer SD Karte liegt, musst Du einen Anderen low
level Treiber einsetzen. Soweit ich weiss, kriegt Du von einer SD Karte
niemals Werte von "absoluten Adressen" zurück.
BTW, der ST Beispielcode is traditionell völlig unbrauchbar.
Adapter schrieb:> Die Signatur 0xaa55 weisst darauf hin, dass das FS versucht, auf einem> Jedec kompatiblen externen Flash Baustein zu arbeiten.
Was bringt Dich auf diese überaus interessante Idee?
Nein, mit JEDEC oder Flash hat das nichts zu tun.
> At the end of the boot sector is a two-byte structure> called a signature word or end of sector marker,> which is always set to 0x55AA.
Quelle:
https://technet.microsoft.com/en-us/library/cc976796.aspx
Hallo ihr zwei,
ich habe jetzt mal eine andere SD Karte probiert, und siehe da, damit
ging es sofort. Keine Ahnung von welchem Hersteller die Karte ist, die
dabei war, steht nichts drauf. Aber sie hat 2 GB und ist eine uSD.
Ich habe jetzt die uSD HC von SanDisk mit 32 GB probiert und die
funktioniert einwandfrei.
Aber vielleicht findet sich trotzdem eine Lösung warum die beiliegende
Karte nicht funktioniert.
User861 schrieb:> Aber vielleicht findet sich trotzdem eine Lösung warum die beiliegende> Karte nicht funktioniert.
Vielleicht war sie nicht formatiert bzw. nicht richtig formatiert?
Wenn sie z.B. in einem Raspberry Pi o.ä. verwendet wurde, bestehen
Chancen, daß sie mit irgendeinem unixoiden Dateisystem und nicht FAT16
formatiert wurde.
Mit dem "SD Card Formatter" kannst Du SD-Karten standardkonform
formatieren:
https://www.sdcard.org/downloads/formatter_4/
Hallo Rufus,
das hatte ich auch bereits getestet. Aber half leider nichts. Habe
sowohl die schnelle als auch die ausführliche Formatierung getestet.
Heute habe ich noch zwei weitere SD-Karten ausprobieren können. Eine
etwas ältere microSD mit 128 MB (ja, Mega, nicht Giga), mit welcher es
ebenfalls nicht funktioniert.
Und dann noch eine 4 GB microSD HC von SanDisk, welche wiederum
einwandfrei funktioniert.
Unter Windows funktionieren sie alle, aber auf dem Eval Board nur die HC
Karten, wobei es auch egal ist, ob sie mit FAT oder FAT32 formatiert
werden, entweder sie gehen immer, oder gar nicht.
Die älteren v1 sd Karten i.r. Bis 2gb werden byteweise adressiert, die
neueren dann per lba
wobei 1block immer 512Byte sind... Der Treiber muss erkennen um was es
sich handelt
und entsprechend beim senden von befehlen wie read/write bei dem
Adressen Parameter
berücksichtigen. Das wird beim initialisieren der karte festgestellt um
was es sich handelt.
Die Sd card spec kann man runterladen, dicker wälzer, schaue dir die
Initialisierung an und vergleiche mal mit deiner Implementierung.
Eventuell liegt hier der Hase begraben wenn durch falsche Annahme nicht
richtig adressiert wird, dann ließt man wider Erwartung ganz andere
werte....