Forum: Mikrocontroller und Digitale Elektronik SDIO SD-Karte ACMD41 immer busy


von M. Н. (Gast)


Lesenswert?

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.

von M. Н. (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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 ?

von Bernhard S. (bernhard)


Lesenswert?

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

von M. Н. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.