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!
>Hab ich vielleicht etwas übersehen/vergessen?
Ja, Angaben über Deine Schaltung, den Controller und die
Programmiersprache/Libraries zu posten.
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).
Hier ein Ausschnitt des Schaltplanes. Am Ausgang des PB4 hab ich noch ein Pulldown angebracht, damit die Karte beim Reset (Port=Tristate) inaktiv ist.
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.
Gut, aber wo ist dann das Problem? Hast Du Deinen SPI-Output mal mitgeloggt?
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
Kann mir jemand ein Programm nennen, mit dem ich einzelne Byte/Blöcke auf dem PC lesen kann?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.