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.