Forum: Mikrocontroller und Digitale Elektronik Veränderung des Dummy- Bytes nach CMD0 bei SD- Card


von Security (Gast)


Lesenswert?

Es gibt ja schon unzählige Beiträge zu der Initialisierung von SD- 
Karten, aber zu diesem Problem konnte ich einfach keine Antwort finden.

Mein Vorhaben:
Nachdem ich CMD0 schicke, gehe ich in eine do-while Schleife in der ein 
Dummy- Byte (0xFF) geschrieben wird und auf den Response von CMD0 warte. 
Ich bleibe eben solange in der Schleife bis ein Response kommt.

Mein Problem:
Nach dem ersten Dummy- Byte steht aber nicht mehr 0xFF drinnen sondern 
irgendein Wert und es ist immer derselbe. Die einzigen SD- Karten bei 
denen das nicht der Fall ist sind von Corsair und die werden schon zur 
Rarität. Alle anderen Karten (Kingston, SanDisk, ...) geben mir nach dem 
ersten Dumy irgend einen Wert zurück.
Nach langer Debuggerei konnte ich feststellen, dass ein gültiger 
Response immer nach 2 Dummy- Bytes kommt (das Timing liegt ja bei 1-8 
Bytes). Also auch bei den "nicht- funktionsfähigen" SD- Karten konnte 
ich nach dem 2. Dummy- Byte einen gültigen Response erhalten (also 0x01) 
wenn ich die Schleife nach dem ersten Dummy weiterlaufen ließ.
Eine profisorische Lösung wäre einfach auf den zu gewünschten Response 
(0x01) zu warten und dann die Schleife zu verlassen, aber wenn ich 
Fehlerauswerten will, weiß ich dann nicht ob es sich um einen gültigen 
Response handelt oder irgendeinen Wert.
Die Funktion in der das Kommando geschickt und auf den Response gewartet 
wird, wird bis zu 20 mal aufgerufen bis eben ein ensprechender Response 
kommt.

Ich würde jetzt also gerne wissen wieso ich nach dem ersten Dummy einen 
anderen Wert als 0xFF bekomme.
1
timeout=255;
2
do
3
  {
4
   SPI_WRITE(DUMMY_WRITE);
5
   SPI_WAIT();     // wait for SPI- flag
6
   by=SPI_DATA_REGISTER;
7
8
   timeout--;
9
   if(timeout==0) break; // no response
10
  } while(by==DUMMY_WRITE);

Ich habe schon einige freie SD- Spezifikationen durchgesehen und 
unzählige Foren durchgestöbert, aber dieses Problem wird so eigentlich 
nie behandelt.

von Michael W. (mictronics) Benutzerseite


Lesenswert?

>Nach dem ersten Dummy- Byte steht aber nicht mehr 0xFF drinnen sondern
>irgendein Wert und es ist immer derselbe.

Und welchen Wert hat "irgendein Wert und es ist immer derselbe"?

von Security (Gast)


Lesenswert?

Je nach Marke unterschiedlich:159, 191, 31
Ich hatte auch schon spekuliert auf einen Response zu warten bei dem das 
MSB auf 0 ist, bis ich dann Karten getest habe bei denen ich den Wert 31 
bekam, und die Abfrage somit keine Wirkung gezeigt hätte.

von Michael W. (mictronics) Benutzerseite


Lesenswert?

Es gibt bei CMD0 nur einen Response auf den du warten solltest, nämlich 
den das die Karte in Idle State ist.

Das ganze in einer Schleife mit begrenzter Anzahl durchläufen und einem 
kurzen Delay zwischen den Response abfragen.

Ich nutze 5 Durchläufe mit einem Delay von 100ms zwischen den Repsonse 
Abfragen. Hat bisher funktioniert, slebst bei 4GB KArten die etwas 
länger brauchen.

von Security (Gast)


Lesenswert?

Nachdem ich keine Erklärung für mein Phänomen mit den komischen Werten 
bekomme,  habe ich es doch mit einer profisorischen Lösung probieren 
müßen.
Ich habe jetzt eigens für CMD0 eine extra Abfrage eingebaut die einfach 
nach dem Response 0x01 wartet.

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.