Ich möchte eine 2GB SD sandisk Karte verwenden um Messdaten zu
speichern. Vorerst habe ich mir ein Testaufbau zusammengebaut und mit
dem Code von Stefan Seegl die Karte zum laufen gebracht. Funktioniert
auch meistens.
Jedoch ist mir das Prinzip der Speicheranordnung noch nicht ganz klar.
Bitte korrigiert micht, wen ich das falsch interpretiere:
- Blöcke von 512 Byte, schreiben und lesen
- Adresse gibt Block an, in dem 512Byte Speicher sind
- Bei 2GB ca. 4'100'000 Blöcke à 512 Byte
Können Blöcke defekt sein? Wen ja, könnte ich jeden Block, bevor ich ihn
beschreibe zuerst lesen und wen dies funktioniert auf ihm speichern.
Falls er nicht funktioniert auf den nächsten Block schreiben und
irgendwo diesen als defekt deklarieren?
Die Geometrie stimmt soweit.
Wobei aber in der Karte nicht 2x an die gleiche Stelle gespeichert wird,
wenn man den gleichen Block beschreibt. Der Controller in der Karte
sorgt dafür, dass möglichst der ganze Bereich gleichmässig benutzt wird.
(solangs keine Billigkarten sind)
Wenn du auf die Karte noch ein FAT-Dateisystem draufhaust, dann gibts
hier sogar nen Eintrag, wenn ein Speicherbereich defekt ist.
>Der Controller in der Karte>sorgt dafür, dass möglichst der ganze Bereich gleichmässig benutzt wird.>(solangs keine Billigkarten sind)
Dies ist bei allen SD-Karten so.
>Können Blöcke defekt sein?
Sicher, aber die wirst Du nie zu Gesicht bekommen. Die internen
Algorithmen maskieren defekte Blöcke aus, nachdem ihr Inhalt auf einen
Reserveblock kopiert wurde. Von außen gesehen, greifst Du immer auf
funktionierende Blöcke zu. Irgendwann sind aber soviele Blöcke defekt,
daß die Reserveblöcke aufgebraucht sind und von da an schrumpft der
Speicherplatz unwiederbringlich.
Heleon schrieb:
> - Adresse gibt Block an, in dem 512Byte Speicher sind
Ich weis nicht, ob du dich jetzt auf eine spezielle Funktion in deinem
Code beziehst.
Aber vom Protokoll zur SD-Karte her wird z.B. beim Lesen per CMD17 die
Adresse in Bytes und nicht Blöcken angegeben. Erst bei SDHC Karten wird
dort Anstatt Bytes die Adresse in Blöcken angegeben, da mit 32Bit
ansonsten der Speicherbereich gar nicht mehr zu verwalten wäre.
Ciao,
Rainer
Sieht so aus, soweit ich den Code interpretieren kann.
Ich habe manchmal noch mühe die Karte anzusprechen, ich glaube es liegt
an der Versorgungsspannung, benutze für die 3,3V den LM317. Jedoch
glaube ich liegt das Problem am SDK500, beide 5 + 3,3V Spannung erzeugen
das Signal auf dem Foto, bei Belastung.
Also die Methode wandelt die Adresse angegeben in Blocks automatisch in
Bytes um. Also musst du die Methode mit Blocks als Adresse auch
aufrufen.
Die Versorgungsspannung scheint sehr wichtig zu sein um einen stabilen
Betrieb einer SD-Karte zu gewährleisten. Dazu gibt es auch einige
Threads hier im Forum. Ich würde mal versuchen die Pufferkondensatoren
des LM317 etwas zu vergrößern. Dadurch dürfte der Spannungseinbruch
geringer ausfallen. Ebenfalls solltest du die Versorgungsspannung der
SD-Karte möglichst nah am Sockel mit einem 100nF Kondensator gegen Masse
gegen Störungen abblocken, falls du es noch nicht hast.
Ciao,
Rainer
Danke für die promten und guten Antworten, ich hoffe ich kann eines
Tages anderen auch mit meinem Wissen helfen.
Das Spannungsproblem habe ich nun im Griff, habe eine stärkere
Versorgungspannung angeschlossen.
Die Fehlerquote ist nun sehr minimal, lasse den mega8 mit 8MHz laufen
und die höchste Spi geschwindigkeit eingestellt. Nach kurzen
anlaufschwierigkeiten habe ich keine Fehler mehr. Da ich später
wahrscheinlich eine ATMega644P mit 3,3V laufen lasse, brauche ich mich
auch nicht mehr um die Pegelwandler zu kümmern. Wollte einfach mal mit
dem Mega8 teste, ob ich mit der SD klar komme.
Werde mich nun an die HCSD wagen, dafüre werde ich jetzt aber mal selbst
nach Dokumentationen suchen, frage dann wieder wen ich anstehe:-)
Nochmals danke für die Unterstüzung
Reto
Ich kann dir, gerade wegen der Initialisierung, die SD-Karten
Spezifikation empfehlen. Denn es gibt ja SD-Karten nach Spezifikation
1.0 und 2.0 und dann eben noch SDHC-Karten nach Spezifikation 2.0 und
alle werden auch etwas anderst initialisiert. In der Spec ist ein sehr
gutes Ablaufdiagramm für die Initialisierung drin.
Ich habe meine Init Routine selber anhand dieser Spec aufgebaut und kann
erfolgreich alle Kartentypen damit ansprechen.
http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf
Ciao,
Rainer