Forum: Mikrocontroller und Digitale Elektronik SD/MMC Verständnisfrage Blöcke


von Heleon (Gast)


Lesenswert?

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?

von MeinerEiner (Gast)


Lesenswert?

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.

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


Lesenswert?

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

von Heleon (Gast)


Lesenswert?

Danke für eure schnellen Antworten.

Werde mal einige Test's machen, ob ich alle Blöcke beschreiben kann.

von R. W. (quakeman)


Lesenswert?

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

von Heleon (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von R. W. (quakeman)


Lesenswert?

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

von Heleon (Gast)


Lesenswert?

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

von R. W. (quakeman)


Lesenswert?

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
Noch kein Account? Hier anmelden.