Forum: Mikrocontroller und Digitale Elektronik SD-Karte schreiben: ja, lesen: nein


von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Hallo Forum,

ich habe schon fleißig gesucht im Forum. Mein Problem habe ich aber 
nicht gefunden. Ich verwende einen MSP430F169 und versuche eine SD-Karte 
zu lesen. Dabei gehe ich wie im Dokument slaa281a.pdf von TI vor. 
Allerdings habe ich SIMO und SOMI vertauscht, weil das offensichtlich 
falsch dokumentiert wurde. Alle Anschlüsse gehen direkt von MSP nach 
Kartenhalter (mit ca 5cm Flachbandkabel). Den Quellcode habe ich 
ebenfalls von TI. Es geht auch schon so einiges. Die Karte wird 
initialisiert und ich kann auch darauf schreiben (mmcWriteBlock). Aber 
ich kann NICHT lesen. mmcReadBlock kommt immer mit Fehler 
MMC_DATA_TOKEN_ERROR zurück. Häh? Schreiben ja, lesen nein?!?! Was soll 
das? Kennt das Problem jemand oder hat vielleicht einen Tip für mich?

Flankensteilheit, Verbindungsprobleme, Pegel o.ä. kommt eigentlich nicht 
in Frage, wenn ich doch schreiben kann, oder?

Vielen Dank schon mal für's Lesen.

Gruß
Uli

von reflection (Gast)


Lesenswert?

Hatte ich auch und habs auch nicht hinbekommen. Falls Du eine Lösung 
findest wäre ich sehr daran interessiert. Schreiben kann ich auch ohne 
Probs, aber lesen...

Greets

von holger (Gast)


Lesenswert?

Vieleicht ist das Timeout hier zu kurz:

char mmcGetXXResponse(const char resp)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;

  while(i<=1000)
  {
    response=spiSendByte(0xff);
    if(response==resp)break;
    i++;
  }
  return response;
}


Ändere doch mal auf
  while(i<=65000)

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Hallo Holger,

ich hab's gerade probiert. Geht leider auch nicht :-(

Gruß
Uli

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Heureka :-)

Die Leute von TI haben die Parameter und den Rückgabewert der Funktion 
mmcGetXXResponse() als char definiert. Die geforderte Response zum Lesen 
ist aber 0xFE, sodass ein strenger Compiler (wie meiner) signed mit 
unsigned vergleicht und mit dem Kopf schüttelt, weil -2 != 0xFE. Wenn 
man die Compiler option "plain_char = unsigned" setzt, geht's.

Oder man schreibt alle Funktionen auf unsigned char um...

Gruß
Uli

von Mathias U. (munter)


Lesenswert?

Glückwunsch!!!
Darauf soll mal einer kommen...

von Simon K. (simon) Benutzerseite


Lesenswert?

Und warum benutzt du dann nicht stdint's wie uint8_t?

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Weil der Code nicht von mir ist, sondern von TI :-P

von Simon K. (simon) Benutzerseite


Lesenswert?

Mist! :-)

Aber ändere doch den Rückgabeparameter auf uint8_t, statt 
Compilerparameter dafür zu verändern.

Aber verdammt verzwickter "Fehler", muss man schon sagen...

von mr.chip (Gast)


Lesenswert?

Bist du dir sicher, dass Schreiben klappt? Wenn du ja nichts lesen 
kannst :-)

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.