mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit SD-Karte


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bei der Benutzung einer SD-Karte ist bei mir ein seltsamer Fehler 
aufgetreten. Ich habe eine größere Menge Daten auf die Karte 
geschrieben, was auch funktioniert hat. Heute hab ich einen einzelnen 
Block geschrieben, dabei gab es keine Fehlermeldung. Das Lesen hat 
zunächst auch (mehrere Male) funktioniert. Allerdings, nachdem ich die 
Versorgung ausgeschalten habe, waren die neuen Daten weg und nur die, 
die ich davor geschrieben hatte, auf den Speicherplätzen. Solang ich 
einen Reset über den Programmer gemacht habe, waren alle Daten da.

Kennt jemand dieses Verhalten?
Hab ich vielleicht etwas übersehen/vergessen?

Danke für eure Hilfe!

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hab ich vielleicht etwas übersehen/vergessen?

Ja, Angaben über Deine Schaltung, den Controller und die 
Programmiersprache/Libraries zu posten.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Controller ist ein Atmega32 programmiert in Assembler.
Fertige Library hab ich nicht verwendet.

Fehler in der Schaltung kann ich weitgehend ausschließen, da die 
Initialisierung einwandfrei funktioniert und auch beim Lesen/Schreiben 
keine Fehlermeldungungen angegeben werden(Responce=0).

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein Ausschnitt des Schaltplanes.
Am Ausgang des PB4 hab ich noch ein Pulldown angebracht, damit die Karte 
beim Reset (Port=Tristate) inaktiv ist.

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so ein Problem hatte ich auch schon. Bei mir lags daran, daß ich 
nach dem Schreiben die busy-phase der Karte nicht gepollt habe, sondern 
erst beim nächsten command.Bei manchen karten hat's nix gemacht, bei 
anderen(billigen) war dann der letzte Schreibvorgang nicht auf der 
Karte.Manche Karten können offenbar die Daten nur dann aufs Flash 
schreiben, wenn es einen Clock gibt.

Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gebhard,

deinen Vorschlag habe ich jetzt umgesetzt. Aber das Problem bleibt das 
Gleiche.
Muss man die Karte auf eine bestimmte Weise abschalten, den Master 
abmelden? Ich habe in der Richtung nichts im Datenblatt gefunden und 
gehe davon aus, dass man einfach den Strom wegnehmen darf.

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> Muss man die Karte auf eine bestimmte Weise abschalten, den Master
> abmelden? Ich habe in der Richtung nichts im Datenblatt gefunden und
> gehe davon aus, dass man einfach den Strom wegnehmen darf.

Hmm... Ich hab immer nur die karte nach dem letzten Schreibvorgang aus 
dem bestromten Sockel gezogen, das war nie ein Problem.
Was noch dein Problem verursachen könnte ist die CS Leitung.Bei mir 
haben alle Kartentypen funktioniert, wenn ich bei jedem Byte das CS 
gesetzt/gelöscht habe. Beim blockweise Setzen/löschen von CS gabs bei 
manchen Karten Probleme.

Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, dass mit dem CS was sein kann, dachte ich mir auch. Nur was mir 
völlig unerklärlich ist, ist dass die Daten solange lesbar sind (da 
sind), solange die Versorgung nicht unterbrochen war.

Ich probier mal den Chip Select nach jedem Byte aus und melde mich dann 
wieder.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem ChipSelect nach jedem Byte ist Unsinn. Es gibt klare 
Spezifikationen, wie mit dem ChipSelect bei den verschiedenen Commands 
umzugehen ist. Das Command selbst wird mit aktivem /CS gegeben, 
Responses werden bei aktivem /CS gelesen, dann wird das /CS gelöscht und 
wieder aktiviert, damit die Daten gelesen oder geschrieben werden 
können. Während Block-Operationen ist das /CS die gesamte Zeit aktiv.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich im Datenblatt jetzt auch nachgelesen. Probiert hab ichs 
trotzdem. Die Karte scheint auch einfach weiterzuarbeiten.Zumindest gibt 
sie ein Null-Responce. Allerdings könnte das ja auch ein Busy-Token 
sein. Danach kann ich ja auch wieder lesen, das heißt, an der 
Übertragung kann es kaum liegen.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Busy muß beim Schreiben undbedingt abgefragt werden. Während des 
Busy-Status kann/darf nichts anderes als die Abfrage des Busy-Status an 
die Karte gesendet werden. Erst wenn der Busy-Status beendet ist, dürfen 
weitere Schreib- oder Steuerkommandos an die Karte gesendet werden.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Busy kann ja erst auftreten, wenn die Daten schon gesendet sind. Vor dem 
Senden eines Commands frag ich auch BUSY ab. Nach dem Rat von Gebhard 
frag ich es auch nach dem Empfang des Data-Response ab bis die Karte 
bereit ist.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, aber wo ist dann das Problem? Hast Du Deinen SPI-Output mal 
mitgeloggt?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das Problem ist, dass ich den Block nicht fest speichern kann. Den 
SPI hab ich nicht mitgeloggt, hab keine Möglichkeit dazu.

Ich hab keine Erklärung für das Verhalten. Bin Ratlos...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich auch.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich nochmals versucht das Problem einzugrenzen. Wenn ich die 
Karte bei laufendem Controller abziehe (Hot unplug) und anschließend den 
Controller über den Programmieradapter aus dem AVRStudio heraus resette, 
sind die Daten weg (Init der Karte dann auf Tasterdruck). Führe ich nur 
den Reset - ohne die Karte abzuziehen und wieder einzustecken - durch, 
so bleiben die Daten erhalten.


Ich habe hier im Forum mal gelesen, dass es ein Tool gibt, mit dem man 
eine unformatierte Karte auslesen kann. An den Namen erinnere ich mich 
nicht mehr. Könnt ihr mir ein solches empfehlen? Das würde ja auch eine 
Möglichkeit zur Fehlersuche bieten.

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, laß uns festhalten: Die Daten auf der SD-Karte sind weg, wenn man 
die Versorgung unterbricht. D.H. die Daten wurden nicht geflasht, oder, 
was ich noch gar nicht nachgefragt habe,das Filesystem, so vorhanden 
,schließt das File nicht korrekt. Was für ein Filesystem verwendest du?.
Unabhängig davon könntest du mal probieren, nach den Daten noch einen 
dummy-block zu schreiben. Da sollten dann wohl die Daten drauf sein.

Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gebhard,

ich verwende kein Dateisystem. Bzw. nur ein sehr primitives lineares. 
Für diese Tests habe ich aber lediglich einen Block an einer bestimmten 
Adresse geschrieben und jeweils geschaut, wann die Werte gleich sind.
Dass die Daten nicht ins Flash geschrieben wurden, habe ich mir auch 
schon gedacht. Allerdings kann man das ja von außen nicht beeinflussen, 
d.h. wäre dies der Fall, dann wäre die Karte im Grunde kaputt.

Genau, die Daten auf der Karte sind weg, wenn (und nur wenn) ich
die Versorgung unterbreche. Dann könnte höchstens noch ein Fehler in der 
Initialisierung sein, der sich aber je nach Reset(Warmstart/Kaltstart) 
unterschiedlich verhalten müsste.

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier das mal mit dem dummy block. Wenn die vorher geschriebenen Daten 
da sind, muß ein Fehler in deiner Sektor-Write-Routine sein. Kannst du 
die mal posten?

Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit dummy block? So wie ich es gemacht habe, einfach einen 
Block (512Byte) auf die Karte schreiben, oder? Mittlerweile hab ich auch 
den Block als ganzen (ohne Routine, die auch Blöcke kleiner 512B 
verarbeitet) geschrieben und gelesen. Das Ergebnis war das gleiche.

Für heute mach ich Feierabend. Ich meld mich morgen wieder.

Danke für die Hilfe!

Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemand ein Programm nennen, mit dem ich einzelne Byte/Blöcke 
auf dem PC lesen kann?

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WinHex ... gibts ne trial Version von.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HxD kann das auch und ist FREE.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Infos.

Mit dem HxD-Editor hab ich mir jetzt die Speicherstelle angesehen, bei 
der das Problem immer aufgetreten ist. Das Verhalten war genau das 
gleiche wie in meiner Applikation! Solange die Karte eingesteckt war, 
hat das Byte gestimmt, so wie ich es eingetragen habe. Und auch dann, 
wenn ich das HxD-Fenster geschlossen habe und die Karte neu ausgelesen. 
Nur nach dem Abziehen waren wieder Nullen an besagter Stelle. Zur 
Kontrolle hab ich auch an einer anderen Stelle ein Byte 
geschrieben/verändert. Dieses war auch nach der Stromunterbrechung noch 
zu lesen.

So wie es aussieht, ist die Karte also an dieser Stelle kaputt oder hat 
einen Firmwarefehler.

Wenn an dieser Stelle ein Write Protect gesetzt wäre (ich weiß nicht, ob 
das bei dieser Karte überhaupt geht; ist eine Transcend 1GB), müsste 
beim Schreiben doch eine Fehlermeldung zurückgegeben werden, oder?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.