Hallo Ich versuche eine SD-Karte anzusteuern. Hardware: Mega128L mit 3,3V über 2,2k Reihenwiderstände an Karte, keine Levelshifter, keine Pullups. Software SPI mit etwas weniger als 400khz. Die CMD0, CMD1 Init funktioniert, ich kann CID und CSD mit CMD9 und CMD10 auslesen. STATUS-Register und Read-Block funktionieren nicht. Hier wird das Read-Block-Commando (CMD17) bestätigt, aber die Karte sendet nie das begehrte 0xFE (Daten sind bereitgestellt). -- Sonderbares: Der SD-Mode (nicht der SPI-Mode) der Karte kann im Init-Zustand nur CMD9 und CMD10 ausführen, aber CMD17 geht nur im Transfer-Mode nach vorherigem CMD7. Will sagen, vielleicht ist meine Karte gar nicht richtig im SPI-Mode und führt daher nur CMD9 und 10 aus, aber nicht den Block-Read CMD17. Das verstehe, wer will. Ich jedenfalls noch nicht. Gibt es Vorschläge, warum das so ist und wo mein Problem liegt?
> ... über 2,2k Reihenwiderstände an Karte,
Warum das?
ich hatte Angst, dass ich wegen eines Programmierfehlers einen Kurzschluss mache. Deswegen die 2,2k. Die müssten 1,5mA oder so durchlassen. -- Ich habe gerade die Init mit ACMD41 getestet (da CMD1 bei den dünnen SD-karten wohl nicht implementiert sei). Die neue Init geht, ich kann aber wieder nur CID und CSD auslesen, das 0xFE fehlt weiterhin nach Read-Block-Commando.
Die Widerstände sind superliquid. Wenn schon, dann 100...220 Ohm.
Naja, die Widerstände hatte ich eben schon draußen. Das war nicht der Fehler.
Wenn das "0xFE" nicht kommt, dann clockst Du nicht lange genug oder sendest nicht das richtige Kommando.
Das Clocken ist wohl nicht das Problem. Es wird in einer while-Schleife immer gelesen und auf 0XFE gewartet. Ich verwende den Code von Ulrich Radig. Darin habe ich die Flanken in read write geändert, dann lief die Init. Der Rest aber nicht. -- Jetzt gerade gehe ich zwei Wege: 1. eigenen Code schreiben 2. Hardware-SPI verwenden zu 1: Muss ich gleichzeitig schreiben und lesen (in einer routine) oder kann ich erst schreiben und danach die antwort lesen? zu 2: Ich habe den mega128L. Darin sind MISO und MOSI frei, aber SCK ist ja dauernd mit dem AVR-ISP-Brenner (Atmel 910) verbunden. Die beiden SCK muss ich trennen, sonst habe ich dauernd Kurzschlüsse. Wie wird das normalerweilse gemacht?
Die Verwendung des Hardware-SPI ist nicht (unbedingt) erfordrlich - der Fehler liegt im Programm. Einen eigenen Code zu schreiben ist lehrreich und deckt den Fehler vielleicht auf. Ein DSO ist für solcherlei Experimente extrem hilfreich.
Ich habe jetzt selber ein Programm geschrieben (ist im Anhang). Wieder geht die Init, ich kann CMD9 und 10 ausführen (CID, CSD auslesen). Aber Read_Block geht wieder nicht. Commando17 wird mit 0 bestätigt, ich lese dann in einer while-Schleife, aber es kommt kein Data Start Token 0XFE. Könnt ihr euch mal mein Programm dazu ansehen?
So, ich habe jetzt die Karte an die Hardware-SPI angeschlossen und SCK mit einem Schalter abgeschaltet beim Brennen. Diesmal habe ich die Ulrich Radig Software gar nicht verändert. Und wieder dasselbe! Wie sonst auch, kann ich nur Init, CID, CSD lesen. Beim Read-Block lesen warte ich wieder nur auf 0xFE. Das heißt für mich, die Hardware ist der Knackpunkt. Ich habe den mega128L mit 8 Mhz. Einen teuren SD-karten-Halter, der mit 20cm langen Kabeln an den Hardware-Spi-Port des mega128L angeschlossen ist. Vor der SD-Karte sind 2,2k Ohm Reihenwiderstände zum Schutz. Do der SD-Karte hat einen 90k Pullup. Kein 100nF und auch kein Elko an der SD-Karte. Vorschläge bzgl. der Hardware?
Jetzt ist ein 100nF bei der Sd-Karte, die Reihenwiderstände sind raus. Keine Veränderung :-|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.