Hallo, ich versuche eine SD-Karte am STM32F407 ohne die HAL Libraries zu betreiben. Ich sende zuerst CMD0 => klappt. Dann CMD8. Die Karte antwortet spezifikationsgemäß und akzeptiert meine Spannung. Dann sende ich ACMD41 (CMD55 + CMD41). Das CMD55 wird akzeptiert und die KArte ist im Application Mode (Durch Antwort von CMD55) verifiziert. auf das anschließende ACMD41 antwortet die Karte immer mit "0x00ff8000" Das ist soweit auch korrekt. Nur ist das BUSY bit nicht gesetzt und das CCS auch nicht. ich wiederhole das ACMD41 momentan in einer Dauerschleife, die erst unterbrochen wird, wenn die Karte anzeigt, dass sie bereit ist (BUSY=1 und CCS=1, da 16 GB Karte). Das CMD55 sende ich mit RCA=0, da noch keine zugeteilt ist. ACMD41 wird mit HCS=1 gesendet, da CMD8 erfolgreich war. Leider antwortet die Karte immer nur mit "0x00ff8000". Auch nach mehreren zehntausend Abfragen. Ich habe daraufhin ein wenig mit der Clock gespielt. Momentan ist sie auf knapp 100 kHz. Davor war kanpp unter 400 kHz. Ebenso habe ich mehrere verschiedene Karte ausprobiert. Keine geht. Wie gesagt, CMD8 funktioniert einwandfrei. Somit gehe ich davon aus, dass die Kommunikation geht. Woran könnte es noch liegen? Ich habe ebenfalls Pull-ups an allen Leitungen zur SD-Karte.
Ich glaube ich habe den Fehler selbst gefunden: Followings are general rules of the argument of ACMD41: (1) If the voltage window field (bit 23-0) in the argument is set to zero, it is called "inquiry CMD41" that does not start initialization and is use for getting OCR. The inquiry ACMD41 shall ignore the other field (bit 31-24) in the argument. (2) If the voltage window field (bit 23-0) in the argument is set to non-zero at the first time, it is called "first ACMD41" that starts initialization. The other field (bit 31-24) in the argument is effective. (3) The argument of following ACMD41 shall be the same as that of the first ACMD41. Ich habe mein Argument von ACMD41 falsch gesetzt. ich werde das gelich mal probieren.
Ich sitze gerade vor dem gleichen Problem CMD8 funktioniert: Send: 0x48 0x00 0x00 0x01 0xAA 0x87 Recv: 0x01 0x00 0x00 0x01 0xAA Wie sendest Du ACMD41 ?
Initialisierung einer SDHC Card: Send: 0x48 0x00 0x00 0x01 0xAA 0x87 (CMD8) Recv: 0x01 0x00 0x00 0x01 0xAA SCHLEIFE: Send: 0x77 0x00 0x00 0x00 0x00 0x01 (CMD55, das "Prefix" für ein ACMD); Recv: 0x01 (R1-noch "In Idle State") Send: 0x69 0x40 0x00 0x00 0x00 0x01 (ACMD41) Recv: 0x01 (R1-noch "In Idle State") Send: 0x77 0x00 0x00 0x00 0x00 0x01 (CMD55) Recv: 0x01 oder 0x00 Send: 0x69 0x40 0x00 0x00 0x00 0x01(ACMD41) Recv: 0x00 (R1-Antwort, jetzt ohne "In Idle State") GOTO SCHLEIFE
Ich möchte hier noch kurz die finale "Lösung" meines Problems publizieren: Die Karte scheint nach dem Powerup etwas eigen zu sein. Vermutlich steht das in der Spezifikation, wenn ich diese komplett gelesen hätte... Sobald ich der Karte direkt nach dem Powerup CMD0 + CMD8 + ACMD41 sende, initialisiert sie sich nie. Auch nach Minuten. Selbst wenn man CMD0 wiederholt. Die Lösung: Nach dem poweron einige ms warten. Dann klappt alles. (Ich warte gegenwärtig 250 ms)
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.