Hallo zusammen,
ich schreibe mir gerade eine Bibliothek um mit einem AVR SD-Karten zu
Schreiben und zu Lesen. Dazu habe ich zwei Fragen...
1)
Die Initialisierung der SD-Karte funktioniert auch soweit bei meinen
beiden 4 GB Karten. Bei meiner alten 512 MB Karte klappt die
Initialisierung nicht. Da würde ich gerne wissen warum (auch wenn es
nicht wirklich wichtig ist...). Und zwar bekomme ich bei der Funktion
"SD_SoftwareReset" immer ein "NO_RESPONSE" zurück, sprich die Karte
reagiert nicht auf das Commando 0.
2)
Nachdem die Karte (jetzt meine 4 GB Karte) initialisiert worden ist,
möchte ich gerne Sektor 0 auslesen. Dazu habe ich mir mit HxD den Sektor
mal angeschaut (siehe Bild SD.png). Wenn ich die Karte nun mit dem AVR
lese steht in meinem Buffer überall 0 drin und das obwohl die Karte
problemlos durchläuft (ich erhalte nach dem Lesebefehl erst ein 0x00 und
dann ein 0xFE).
Mein Code sieht so aus:
SD.c
zu 1): 512 MB ist SDC, 4 GB ist SDHC; die Initialisierung ist
unterschiedlich, ebenso die Adressierung
zu 2): kann/will ich nichts sagen, ist mir zuviel Programm; sollte ich
eine Vermutung äußern, würde ich auf falsche Adressierung tippen
Sehe ich da mkdosfs? SD-Karten darf man nur mit dem Tool von sdcard.org
formatieren, da dies die spezifischen Anforderungen von SD-Karten beim
Layout beachtet
Daniel K. schrieb:> Die Initialisierung der SD-Karte funktioniert auch soweit bei meinen> beiden 4 GB Karten. Bei meiner alten 512 MB Karte klappt die> Initialisierung nicht.
Dass diese beiden Karten eine komplett andere Initialisierung sowie
Adressierung benutzen ist dir klar (SDSC vs. SDHC)?
> Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
4
>
> 2.>
1
> Formatierung (mehr Informationen...)
2
> [c]C-Code[/c]
3
>
> Den zweiten habe ich jetzt mal umgesetzt...
Mmh ich wollte gerade den Beitrag ändern, aber es gab ein Fehler.
Vermutlich ist die Zeit zum ändern abgelaufen. Ich hänge die Dateien mal
hier an die Antwort. Vielleicht kann ein Moderator die verschieben?
Dr. Sommer schrieb:> Sehe ich da mkdosfs? SD-Karten darf man nur mit dem Tool von sdcard.org> formatieren, da dies die spezifischen Anforderungen von SD-Karten beim> Layout beachtet>> Daniel K. schrieb:>> Die Initialisierung der SD-Karte funktioniert auch soweit bei meinen>> beiden 4 GB Karten. Bei meiner alten 512 MB Karte klappt die>> Initialisierung nicht.>> Dass diese beiden Karten eine komplett andere Initialisierung sowie> Adressierung benutzen ist dir klar (SDSC vs. SDHC)?
Die SD-Karte stammt aus einem anderen Projekt. Ich glaube da ist noch
ein u-boot Bootloader drauf. Ich habe die vor den Versuchen nicht
formatiert, da ich die nur lesen wollte und es mir gerade recht kam,
wenn da noch was drauf ist.
Das die Initialisierung bei beiden Karten anders ist, ist mir durchaus
klar. Aber betrifft dies auch den Reset, den man ganz am Anfang macht,
sprich 80 Taktzyklen erzeugen und dann das Commando 0 senden? Ich bin
bisher davon ausgegangen, dass das bei allen Kartentypen gleich ist
(siehe hier
https://electronics.stackexchange.com/questions/77417/what-is-the-correct-command-sequence-for-microsd-card-initialization-in-spi)
Die 512 MB Karte antwortet schon gar nicht auf diesen Block
1
ErrorCode=SD_SoftwareReset();
2
if(ErrorCode!=SD_SUCCESSFULL)
3
{
4
returnErrorCode;
5
}
Soweit ich verstanden habe adressiere ich bei SDHC-Karten ganze Blöcke.
Dafür verwende ich den Befehl 17 und adressiere den Sektor 0. Oder habe
ich da was falsch verstanden?
'SD_SoftwareReset': Bei diesen Dummy-FFs zu Beginn muss die SDC doch
deselektiert sein, oder habe ich das falsch in Erinnerung?
'SD_ReadSingleBlock': Sector als uint8_t?
S. Landolt schrieb:> 'SD_SoftwareReset': Bei diesen Dummy-FFs zu Beginn muss die SDC doch> deselektiert sein, oder habe ich das falsch in Erinnerung?>> 'SD_ReadSingleBlock': Sector als uint8_t?
Stimmt. Du hast recht. Hab beides korrigiert, aber das Problem ist nach
wie vor vorhanden.
Nicht mal am 512 MB-Kartenproblem hat sich etwas geändert? Schlecht.
Nochmal zu 'SD_ReadSingleBlock', auch wenn es mit dem Sektor-0-Problem
nicht direkt etwas zu tun hat: mir ist, als Assemblerprogrammierer, die
ganze Konstruktion unklar, da wird 'Adresse' übergeben, aber nicht
weiterverwendet, 'Sector' ist 0 und wird dann in einer Weise
rechts/links verschoben, die ich auch nicht verstehe, sieht irgendwie so
aus, als wäre es für eine SDC, nicht für eine SDHC gedacht.
S. Landolt schrieb:> Nicht mal am 512 MB-Kartenproblem hat sich etwas geändert? Schlecht.>> Nochmal zu 'SD_ReadSingleBlock', auch wenn es mit dem Sektor-0-Problem> nicht direkt etwas zu tun hat: mir ist, als Assemblerprogrammierer, die> ganze Konstruktion unklar, da wird 'Adresse' übergeben, aber nicht> weiterverwendet, 'Sector' ist 0 und wird dann in einer Weise> rechts/links verschoben, die ich auch nicht verstehe, sieht irgendwie so> aus, als wäre es für eine SDC, nicht für eine SDHC gedacht.
Hallo,
mit der 512 MB Karte habe ich es nicht getestet. Das mache ich im Laufe
des Tages mal. Ggf. hat sich das Problem dann gelöst...
Die Sektoren habe ich erst einmal fest kodiert, da ich das Lesen erst
einmal ausprobieren wollte. Daher habe ich die Werte erst nur in der
Funktion definiert. Die Übergabeparameter sollen später anders aussehen.
Aber ich schaue mir gleich noch mal das Schieben an. Ggf. habe ich mich
da vertan...
Jetzt bin ich irritiert: wenn ich das c-Programm richtig verstehe, lesen
Sie im Sektor 0 ab Adresse 0x1BF in den Buffer 10 Bytes ein - woher
sollen wir wissen, was dort steht, das eingangs gezeigte SD.png reicht
nicht so weit.
S. Landolt schrieb:> Jetzt bin ich irritiert: wenn ich das c-Programm richtig verstehe, lesen> Sie im Sektor 0 ab Adresse 0x1BF in den Buffer 10 Bytes ein - woher> sollen wir wissen, was dort steht, das eingangs gezeigte SD.png reicht> nicht so weit.
Hallo,
den Code hatte ich nach dem ersten Beitrag noch modifiziert und vor dem
Upload auf die ursprüngliche Version zurück geändert. Dieser Wert ist
mir leider durchgegangen. Selbstverständlich muss der Wert 0x00 sein,
damit es zum gezeigten Screenshot passt (tatsächlich ist auf der
SD-Karte an der Stelle 0x1BF 0x00...).
S. Landolt schrieb:> Und wie sieht nun unsere derzeitige gemeinsame Basis, sprich das> aktuelle Programm, aus?
Hallo,
ich habe den aktuellen Code mit einem neuen Bild angehängt.
Stand ist der, dass mit dem aktuellen Code und der gezeigten SD-Karte
nichts in der lokalen Variable "Buffer" der "SD_ReadSingleBlock"
Funktion steht.
Die SD-Karte hat zwei Partitionen - eine FAT (siehe Screenshot) und eine
Ext3, wobei die FAT-Partition den Bootbefehl enthält, daher dürfte diese
Partition ja den Anfang des Speichers der Karte darstellen.
Ausgelesen habe ich den Buffer mittels JTAG (siehe Bild "JTAG.png"). Die
Funktion "SD_InitInterface()" gibt ein Successfull zurück und auch das
0x00 und 0xFE nach dem Kommando 17 wird empfangen.
Edit: Alten Beitrag gelöscht, da ich dort eine Datei mehrfach
hochgeladen hatte und das falsch war.
Daniel K. schrieb:> Siehe Bild.
Meep, falsch.
Das ist der Sektor 0 der ersten Partition ("Laufwerksbuchstabe G:") in
Windoof. Sieht man an dem ganzen FAT16 gelumpe.
Der echte Sektor 0 hat in der Tat eine Menge Nullen am Anfang, und
erst ziemlich weit hinten die eigentliche Partitionstabelle drin. Schau
Dir mal die letzten 100 Byte an.
Den Sektor kann man unter Windows aber nur mit Admin-Rechten von der
"physichen Disk" lesen. HXD muss dafür "als Administrator" ausgeführt
werden IIRC.
Sollte man nicht, um hier klare Verhältnisse zu schaffen, eine Karte
'raw', also z.B. mit Win32DiskImager eine reine Textdatei, beschreiben?
Die Karte lässt sich ja später wieder problemlos formatieren zur
normalen Verwendung.
Jim M. schrieb:> Daniel K. schrieb:>> Siehe Bild.>> Meep, falsch.> Das ist der Sektor 0 der ersten Partition ("Laufwerksbuchstabe G:") in> Windoof. Sieht man an dem ganzen FAT16 gelumpe.>> Der echte Sektor 0 hat in der Tat eine Menge Nullen am Anfang, und> erst ziemlich weit hinten die eigentliche Partitionstabelle drin. Schau> Dir mal die letzten 100 Byte an.>> Den Sektor kann man unter Windows aber nur mit Admin-Rechten von der> "physichen Disk" lesen. HXD muss dafür "als Administrator" ausgeführt> werden IIRC.
Ahhhhhhh okay. Dann habe ich da wohl was ganz gewaltig missverstanden.
Ich probier das nachher mal an einem anderen PC aus, weil ich an diesem
PC selbst mit Adminrechte nicht genug Rechte habe um mir das in HxD
anzuschauen (Windows halt ^^).
Daniel K. schrieb:> weil ich an diesem> PC selbst mit Adminrechte nicht genug Rechte habe um mir das in HxD> anzuschauen (Windows halt ^^).
Starte HxD als Admin. Bei mir hat das selbst unter Win10 immer
funktioniert.
Dr. Sommer schrieb:> Daniel K. schrieb:>> weil ich an diesem>> PC selbst mit Adminrechte nicht genug Rechte habe um mir das in HxD>> anzuschauen (Windows halt ^^).>> Starte HxD als Admin. Bei mir hat das selbst unter Win10 immer> funktioniert.
Hier geht das leider nicht (FH-PC) :(
Muss ich gleich Zuhause machen...
Hallo zusammen,
so ich habe mir mal den physischen Datenträger angeschaut und einen
Ausschnitt davon hochgeladen.
Zudem habe ich den Offset auf 0x1B8 geändert. Allerdings lese ich
immernoch nur 0x00 aus -.-
Und zudem funktioniert die 512 MB Karte mit dem gezeigten Code noch
nicht, aber das Problem ist erst einmal sekundär. Die Anmerkung war nur
als Update zur vorherigen Antwort.
>Allerdings lese ich>immernoch nur 0x00 aus -.-
Ich sehe mehr als nur Nullen. Ab 1B8 könnte eine Partitionstabelle sein
und das 55AA am Ende sieht auch gut aus für Sektor 0.
>Allerdings lese ich>immernoch nur 0x00 aus -.-
Ach verdammt, du meinst mit dem AVR;)
>Zudem habe ich den Offset auf 0x1B8 geändert.
Lass das, nimm Null.
S. Landolt schrieb:> Vor dem CMD0 ein 'UNSELECT'? Verstehe ich nicht.
Das ist noch übrig geblieben, weil ich vorher das Select davor hatte
(das Auskommentierte). Das ist im Grunde zu viel, macht aber auch nicht
mehr als den Pin auf High zu lassen...
Also falls Ihnen eine Vorlage fehlt, mit meiner Assembler-Bibliothek
können Sie sicher nichts anfangen, aber hier habe ich etwas zu
Vergleichszwecken, vor langer Zeit irgendwo aufgegabelt, ist wohl auch
nur für SDC, nicht SDHC, aber vielleicht hilft es etwas.
Nein. Der Pin ist High und wird noch einmal auf High gesetzt, bleibt
also High, da er vorher nicht mehr auf Low gezogen wird. Die
Initialisierung der 4 GB Karte funktioniert auch problemlos, es ist nur
die 512 MB Karte die zickt.
Aber wie gesagt, ich würde gerne erst das Problem mit dem Lesen lösen.
Die 512 MB Karte schaue ich mir dann mal im Detail an.
> Die Initialisierung der 4 GB Karte funktioniert auch problemlos
Pardon, mittlerweile habe ich da meine Zweifel. Z.B. wird ohne gesetztes
SS das CMD0 von der Karte doch gar nicht gesehen.
S. Landolt schrieb:>> Die Initialisierung der 4 GB Karte funktioniert auch problemlos>> Pardon, mittlerweile habe ich da meine Zweifel. Z.B. wird ohne gesetztes> SS das CMD0 von der Karte doch gar nicht gesehen.
Das SS wird in der Funktion "SD_Command(SD_ID_TO_CMD(0), 0x00000000,
0x95, 0, 0)" gesetzt.
Das was überflüssig war, war das Selektieren und Deselektieren der
SD-Karte bei den ersten 80 Taktzyklen nach einem Power-On Reset :)
Hallo,
ich glaube ich habe das Problem ausmachen können.
Ich betreibe die SD-Karte an einem XPlained, welches über USB versorgt
wird. das Board wurde die ganze Zeit von einem Hub in einer Tastatur
versorgt. Das Auslesen hat wunderbar funktioniert, als ich das Board an
einen USB-Port am Rechner gesteckt habe.
Wahrscheinlich hat der Hub in der Tastatur einfach zu wenig Leistung
bereitstellen können (die Tastatur wird ja auch nur über USB
betrieben...) und daher hat sich die SD-Karte nicht korrekt verhalten.