mikrocontroller.net

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


Autor: Heleon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heleon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure schnellen Antworten.

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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Heleon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
unsigned char mmc_start_read_block(unsigned long adr, unsigned char adrshift)
{
  adr = adr << adrshift;
  
  cmd[0] = 0x40 + MMC_READ_SINGLE_BLOCK;
  cmd[1] = (adr & 0xFF000000) >> 0x18;
  cmd[2] = (adr & 0x00FF0000) >> 0x10;
  cmd[3] = (adr & 0x0000FF00) >> 0x08;
  cmd[4] = (adr & 0x000000FF);
  cmd[5] = 0x95;
  
  SPCR = 1<<SPE | 1<<MSTR | SPI_READ_CLOCK; //SPI Enable, SPI Master Mode
  
  if (send_cmd() != 0x00) {
    MMC_PORT |= 1<<MMC_CS; //MMC Chip Select -> High (deactivate);
    return(MMC_CMDERROR); //wrong response!
  }
  
  if (wait_start_byte())
  {
    MMC_PORT |= 1<<MMC_CS; //MMC Chip Select -> High (deactivate);
    return MMC_NOSTARTBYTE;
  }
  
  return(MMC_OK);
}

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Heleon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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/S...

Ciao,
     Rainer

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.