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.
Danke für eure schnellen Antworten. Werde mal einige Test's machen, ob ich alle Blöcke beschreiben kann.
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.
1 | unsigned char mmc_start_read_block(unsigned long adr, unsigned char adrshift) |
2 | {
|
3 | adr = adr << adrshift; |
4 | |
5 | cmd[0] = 0x40 + MMC_READ_SINGLE_BLOCK; |
6 | cmd[1] = (adr & 0xFF000000) >> 0x18; |
7 | cmd[2] = (adr & 0x00FF0000) >> 0x10; |
8 | cmd[3] = (adr & 0x0000FF00) >> 0x08; |
9 | cmd[4] = (adr & 0x000000FF); |
10 | cmd[5] = 0x95; |
11 | |
12 | SPCR = 1<<SPE | 1<<MSTR | SPI_READ_CLOCK; //SPI Enable, SPI Master Mode |
13 | |
14 | if (send_cmd() != 0x00) { |
15 | MMC_PORT |= 1<<MMC_CS; //MMC Chip Select -> High (deactivate); |
16 | return(MMC_CMDERROR); //wrong response! |
17 | }
|
18 | |
19 | if (wait_start_byte()) |
20 | {
|
21 | MMC_PORT |= 1<<MMC_CS; //MMC Chip Select -> High (deactivate); |
22 | return MMC_NOSTARTBYTE; |
23 | }
|
24 | |
25 | return(MMC_OK); |
26 | }
|
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
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.