Hallo,
ich habe ein Problem mit meiner SD-Karte.
Initialisierung klappt soweit, die Karte liefert mir auch schön alle
Werte zurück die ich brauche (Status-Flags/Kapazität etc.)
Nur wenn ich versuche zu lesen bekomme ich nur 0x00 zurück. Die Adresse
die ich anlege (0) wird auch so quittiert. Der Gegenversuch eine Adresse
die nicht durch 512 teilbar ist zu senden wird auch mit einem
Adressfehler zurückgewiesen.
Jetzt habe ich mal getestet ob es am Mode/Adressierung etc. der Karte
liegen könnte und habe einfach mal den ersten Block löschen lassen mit
START_SEL_BLOCK, END_SEL_BLOCK und ERASE. Das hat auch wunderbar
funktioniert, daher sollte die Kommunikation mit der Karte ja eigentlich
ok sein..
Brauche ich an DAT0-DAT3 vielleicht Pull-Ups ? ich habe gemessen und
laut SD Physical Spec sollten im Ruhemodus bei DAT0-DAT3 High-Pegel
anliegen. Das ist aber nur bei DAT3 der fall, die anderen sind low und
mit oscilloskop ist da auch keinerlei aktivität feststellbar.
Grüße
Hallo,
bist Du zwischenzeitlich mit Deinem Problem weitergekommen?
Ich hab gerade das gleiche Problem. Initialisieren geht, Schreiben auch,
nur lesen gibt 00 zurück (komischerweise ging es heute mittag mal eine
zeitlang, dann habe ich was am Toplevelcode geändert (nicht im Physical
layer..), leider keine Sicherheitskopie, und jetzt lese ich nur noch
"0x00". Die Karte scheint ok zu sein, zwei andere Karten weisen das
gleiche Fehlerbild auf.
ich habe auch einen Aufbau am Laufen, auch ohne Pullups und es
funktioniert (noch) einwandfrei.
Ich kann sogar bei einem Wert anfangen zu lesen, der nicht durch 512
teilbar ist :)
Wenn einer von euch rausfindet, dass man irgendwo Pullups braucht, gebt
Bescheid, dann bau ich die auch noch ein, will ja schließlich, dass es
auch weiterhin funktioniert
in der SDCARD Spec steht eindeutig, dass man im SPI-Mode die nicht
benutzten SD-Datenleitungen mit Pull-Ups versehen soll.
Ich denke das spannende Thema sind die SPI Datenleitungen. hier sieht
man die unterschiedlichsten Varianten im Netz.
Hallo,
es wäre gut zu wissen wenn man euch helfen soll, welcher Controller,
SDHC oder SD, FAT16 oder FAT32, SPI-Ansteuerung oder nicht und einen
kleinen Codeausschnitt, wo ihr die Leseroutine macht.
Gruss
Hallo,
das komplette File (Ansteuerung im SPI-Mode mit dsPIC, ältere Sandisk
16MB SDCARD, eine 2. 32MB Type von Sandisk zeigt den gleichen fehler).
Im Hauptprogramm initialisiere ich die Karte mit InitSD, dann InitMedia,
danach beschreibe ich ein paar Sektoren mit writeSector und lese einen
des Sektoren in einen Buffer zurück. Funktioniert alles bis ich den
Sektor lesen möchte. Hier liefert readSector "0x01" zurück.
>Hier liefert readSector "0x01" zurück.> return ( r == DATA_START); // return TRUE if successful
Was soll auch anderes zurückgegeben werden wenn das DATA_START
Token gefunden wurde ? Wenn ne 0 zurückkommt hast du ein Problem.
hallo, danke für die Antwort.
ich initialisiere "buffer[]" vor dem Sektor-Auslesen mit "0x05", nach
"readSector" müßte dort aber das LSB der Adresse stehen, das ich zuvor
reingeschrieben habe.
T. H. schrieb:> in der SDCARD Spec steht eindeutig, dass man im SPI-Mode die nicht> benutzten SD-Datenleitungen mit Pull-Ups versehen soll.
Wo steht das denn?
Ich finde das weder in der SD-Spezifikation noch in der (überholten)
MMC-Spezifikation von JEDEC.
Nase schrieb:> Wo steht das denn?> Ich finde das weder in der SD-Spezifikation noch in der (überholten)> MMC-Spezifikation von JEDEC.
Respekt! 10 Jahre!
Das empfiehlt sich allein schon aus der Tatsache, dass SD-Karten in der
Initialisierung im Open-Drain-Modus arbeiten. Hosts sollten dies auch,
tun es aber je nach Hersteller/Derivat nicht.
Je nach Spec. genügen die Host-internen PU's.... oder auch nicht.
Nase schrieb:> Wo steht das denn?
In der "Einleitung" zu Kapitel 6.
Du brauchst die ganze Spezifikation, in der frei verfügbaren Simplified
Spec ist dieser Teil nicht enthalten.
Gruss
brue