Forum: Mikrocontroller und Digitale Elektronik SD Karte via MMC ansteuern - Kommandos


von Noah L. (lanoa)


Lesenswert?

Hi zusammen

Ich möchte gerne mit meinem SD Karte mittels SPI ansteuern. Ich habe 
schon einiges dazu gelesen.

Nun möchte ich wissen, ob ich die Kommandos richtig verstanden habe:
(Werte Hexadezimal, Werte in ()Klammern Binär)

Zuerst mal 74 Clocks
FF FF FF (1111 1111  |   1111   1111  |1111 1111)
Antwort: FF FF FF (1111 1111  |   1111 1111  |1111 1111)

Dann das Kommando CMD0
40 00 00 00 00 95
(0100 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 1001 0101)
Antwort: 01 (0000 0001)

Wenn erfolgreich, dann CMD8
40 00 00 01 AA 87
(0100 0000 | 0000 0000 | 0000 0000 | 0000 0001 | 1010 1010 | 1000 0111)
Antwort 1 AA (0001 1010 1010)

Wenn erfolgreich, dann ACMD41
7A 00 00 00 00 C5
(0111 1010 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 1101 0101)
Antwort 00 (0000 0000)

=>> Hier bekomme ich immer 01 00 FF 80 00

Kann mir jemand sagen, ob diese initialisierungskommandos richtig sind 
und was meine erhaltene Antwort heisst?

Danke

Mfg Lanoa

von Stefan F. (Gast)


Lesenswert?

Vergleiche einfach mit einer bewärhten Library. Die avrfat32 ist recht 
überschaubar und gut dokumentiert. Der Source enthält hilfreiche 
Kommentare.

http://www.mikrocontroller.net/articles/AVR_FAT32

von Noch einer (Gast)


Lesenswert?

Oder besser noch, übernehme die 3 Low-Level Funktionen aus einer 
fertigen Library. Historisch gewachsen gibt es mehrere Arten von 
Initialisierungen. Deine Routine muss erst mal herausfinden, wie die 
Karte angesprochen werden möchte.

von asdf (Gast)


Lesenswert?

Noah Lang schrieb:
> Nun möchte ich wissen, ob ich die Kommandos richtig verstanden habe:
> (Werte Hexadezimal, Werte in ()Klammern Binär)

Da bietet es sich doch an einfach nachzulesen:
https://www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf


> Zuerst mal 74 Clocks
> FF FF FF (1111 1111  |   1111   1111  |1111 1111)
> Antwort: FF FF FF (1111 1111  |   1111 1111  |1111 1111)

Das sieht eher nicht nach 74 Clocks aus.

von Ingo K. (unseen)


Lesenswert?

Noah Lang schrieb:
> Wenn erfolgreich, dann CMD8
> 40 00 00 01 AA 87
> (0100 0000 | 0000 0000 | 0000 0000 | 0000 0001 | 1010 1010 | 1000 0111)
> Antwort 1 AA (0001 1010 1010)

Das wäre aber wegen der 0x40 nochmal CMD0. Die angegebene Antwort kann 
auch nicht stimmen, das sind entweder 4 Bit zu viel oder zu wenig.

> Wenn erfolgreich, dann ACMD41
> 7A 00 00 00 00 C5
> (0111 1010 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 1101 0101)
> Antwort 00 (0000 0000)

Und die 0x7a hier wäre READ_OCR und nicht APP_CMD.

von nachbar (Gast)


Lesenswert?

Befinde mich am gleichen Thema. Mich würde auch der Initvorgang stark 
interessieren. Hatte dazu folgende Literatur gefunden:
http://www.uni-koblenz.de/~physik/informatik/ECC/sd.pdf
Leider komm ich auch damit nicht weiter...

von Noah L. (lanoa)


Lesenswert?

Mit euren Änderungen sieht es so aus:



 Zuerst mal 74 Clocks
 FF FF FF FF FF FF FF FF FF FF (1111 1111 ... 1111 1111)
 Antwort: FF FF FF FF FF FF FF FF FF FF (1111 1111  ... 1111 1111)

 Dann das Kommando CMD0
 40 00 00 00 00 95
 (0100 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 1001 0101)
 Antwort: 01 (0000 0001)

 Wenn erfolgreich, dann CMD8
 48 00 00 01 AA 87
 (0100 1000 | 0000 0000 | 0000 0000 | 0000 0001 | 1010 1010 | 1000 0111)
 Antwort 1 AA (0001 1010 1010)


> Vergleiche einfach mit einer bewärhten Library. Die avrfat32 ist recht
> überschaubar und gut dokumentiert. Der Source enthält hilfreiche
> Kommentare.

> http://www.mikrocontroller.net/articles/AVR_FAT32

Wo sehe ich hier die Kommandos?

> Da bietet es sich doch an einfach nachzulesen:
> https://www.sdcard.org/downloads/pls/simplified_sp...

Habe ich schon angeschaut, danke

> Wenn erfolgreich, dann ACMD41
> 7A 00 00 00 00 C5
> (0111 1010 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 1101 0101)
> Antwort 00 (0000 0000)

> Und die 0x7a hier wäre READ_OCR und nicht APP_CMD.

Oh, ja stimmt. Laut dem SPI - Spek - Dokument wäre das CMD58. Um die 
ACMD Kommandos zu nutzen muss ich aber zuerst das Kommando CMD55 
schicken. Das CMD 55 (APP_CMD)entspricht:

77 00 00 00 00 65
(0111 0111 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 | 0110 0101)

und danach ACMD 41 (SD_SEND_OP_COD)

von Noah L. (lanoa)


Lesenswert?

So, jetzt weiss ich warum es nicht gegangen ist.

Also zu erst mal meine Initialisierungsroutine (die Verbesserte) 
funktionierte mit einer SanDisk 2GB SD Karte. Bei den SDHC Karten sieht 
es etwas anders aus.

Folgende Karten funktiionierten:

Kingston 8GB Class 10 SDHC Card
Samsung 8GB Class 10 SDHC

Folgende Karten funktionierten nicht!:

SanDisk 4GB Class 4 SDHC Card
SanDisk Ultra 8GB Class 10 SDHC Card

Fairerweise habe ich SanDisk die Chance gegeben, Stellung dazu zu 
nehmen. Der deutsche Vertrieb liess mich im Regen stehen und meinte, 
dass die SPI Unterstützung nicht zu ihrem "Abdeckungsgebiet" gehört.

Der englische Support zeigte sich etwas "Benutzerfreundlicher".

> I understand that you want to use the Ultra 8 GB microSDHC card in SPI
> mode (Serial Peripheral Interface) however you cannot manage to do this.
> With another 2 GB microSD card, you are not experiencing issues however.

> A first important thing would be that the host device supports indeed
> SDHC cards.
> SD/SDHC/SDXC Specifications and Compatibility

> Regarding your question, please note that all SanDisk cards are
> manufactured according to the specifications of the SD Association, of
> which SanDisk is co-founder. On this site, you can find more information
> about this. Also you can become member of the site should you require
> additional information.

Das ganze wurde dann an einenen Techniker "eskortiert"

> We have escalated (eskaliert?) your case for review by an L2 Technician.
> We will provide a response to you shortly.

Als letztes bekam ich diese Antwort:

> We would like to inform you that our technical support is limited to
> basic functionality in retail consumer devices. We do not provide
> engineering level support. Furthermore 2GB cards fall under the microSD
> spec and 8GB cards fall under the microSDHC spec.

> If your device is designed to the correct specifications you should not
> have an issue with our microSDHC cards. If you suspects the card is
> defective we would need you to test the card in a common retail device
> such as a windows computer with card reader or a mobile phone to
> establish the card as problematic. At that point we will be happy to
> replace the card if it’s within warranty.

Leider komme ich auch hier nicht weiter. Also wenn ich SanDisk Karten 
kaufe, werde ich "klatschnass".

Schönen Tag

Noah

(Ich hoffe mal, dass mein Post hier verweilen darf, ansonsten wird es 
noch viele Fehlkäufe geben.)

von Noah L. (lanoa)


Angehängte Dateien:

Lesenswert?

Anbei noch mein Ablauf mit den gesendeten und empfangenen Bits. Hier mit 
der Kingston 8GB Karte.

von Stefan F. (Gast)


Lesenswert?

Ich hatte ganz ähnliche Erfahrungen mit Sandisk und anderen Marken. Sie 
leisten einfach keinen Support für Entwickler. Das erklärt, warum in 
sämtlichen Bedienungsanleitungen von Geräten mit SD Karte steht, man 
solle im Zweifelsfall eine andere Karte versuchen.

Irgendwo muss der niedrige Preis ja herkommen.

von Jim M. (turboj)


Lesenswert?

Noah Lang schrieb:
> Anbei noch mein Ablauf mit den gesendeten und empfangenen Bits.
> Hier mit
> der Kingston 8GB Karte.

Wozu dienen die CMD1? Wenn die Karte bei ACMD41 keinen Fehlercode 
sendet, brauchst Du CMD1 nicht - nur MMCs brauchen CMD1.  Der Timeout 
scheint via stumpfer Widerholung der Befehle zu erfolgen ohne dass sich 
jemand mal den Rückgabecode anschaut. Denn sobald ACMD41 den Code 0 
zurück gibt kann man mit der Karte arbeiten.

Außerdem sendset Du ACMD41 einmal mit und einmal ohne das HCS Bit. Damit 
könntest Du Dir Probleme mit vielen SDHC Karten einhandeln. Denn bei 
ACMD41 ohne HCS müssten sie eigentlich die Funktion einstellen, weil der 
Controller dann die SDHC Addressierung nicht unterstützt.

von Noah L. (lanoa)


Lesenswert?

Warum das CMD1?
Weil mein Gerät (das ich vor ein paar Jährchen gebaut habe) auch 
weiterhin MMC Karten unterstützen sollte.

Das mit dem Timeout ohne Rückgabewertabfrage habe ich bewusst so 
gemacht. Ich habe einige Abläufe mit verschiedenen Karten getestet. 
Dabei erkannte ich, dass sich kleine SD Karten (<4GB ohne HC) sich auch 
mit CMD1 initialisieren lassen.

Zu den HCS Bits habe ich komische Erfahrungen gemacht. Die Kingston 
Karte schert sich nicht um die Bits, lässt sich auch mit HCS = 0 
initialisieren. Die Samsung Karte wird nur mit HCS = 1 initialisiert.

Mfg

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.