Forum: Mikrocontroller und Digitale Elektronik Probleme mit SD-Karte


von Gast (Gast)


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!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Hab ich vielleicht etwas übersehen/vergessen?

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

von Gast (Gast)


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).

von Gast (Gast)


Angehängte Dateien:

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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


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

von Gast (Gast)


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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


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

von Gast (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Gast (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Gast (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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

von Gast (Gast)


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...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ich auch.

von Gast (Gast)


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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


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

von Gast (Gast)


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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


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

von Gast (Gast)


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

von Gast (Gast)


Lesenswert?

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

von MagIO (Gast)


Lesenswert?

WinHex ... gibts ne trial Version von.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

HxD kann das auch und ist FREE.

von Gast (Gast)


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?

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.