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