www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD Card - Blocklength


Autor: Philipp C. (philippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich entwickle gerade einen SD Kartentreiber und habe da ein 
Verständnisproblem. Wie ist die Blocklänge zu verstehen. Bei mir 
funktioniert nämlich das Multiple Block Read nicht.

Den ersten Block kann ich lesen, der 2 Byte CRC kommt auch noch, aber 
dann gibt es nur noch FF´s. Muß die Blocklänge dafür angepasst werden? 
Eigentlich lese ich solange ich Daten benötige und sende dann STOP 
Transmission.

Ich kann die Blocklänge auf 1024, 2048 setzen und wenn ich wieder zurück 
gehe auf 512, dann bekomme ich kein 0x00 sondern 0x01 als Antwort.

Philipp

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

vielleicht hilft dir der source:
http://www.microchip.com/Microchip.WWW.SecureSoftw...

und da File IO System for PIC18 PIC24 dsPIC PIC32

das ist eine sd lib von microchip. ist relativ gut dokumentiert. 
verwende ich auch. vielleicht kannst du dort bisschen abgucken.

unterstuetzt aber kein sdhc. wenn du dabei hilfe brauchst sag bescheid. 
meine mdd version unterstützt sdhc...

lg ;)

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den meisten Karten ist die Blocklänge eh auf 512 Bytes gesetzt und 
kann nicht mehr verändert werden. Ich benutzte auch SD-Karten mit 
Multiple Block Read. Nach dem CRC16 bekomme ich allerdings immer noch 
genau 2 Bytes, die NICHT zu dem gespeicherten Datenstrom passen. Werden 
auch die übersprungen, dann klappt alles wunderbar. Komisch, dass Du nur 
noch falsche Daten bekommst (oder hast Du vielleicht dort wirklich "FF" 
gespeichert?).
Vielleicht auch mal ne andere Karte probieren?
Deine Vorgehensweise erscheint mir jedenfalls korrekt.

Gruß,

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, da ich nun schon etwas zu lange daran sitze, hab ich es mir mal mit 
einem Analyser angesehen. Nach jedem Block (inkl. CRC16) kommt so lange 
0x00 bis er auf busy geht (0xFE). Bei meiner Karte kommt somit nach 
jedem Datenblock einmal 0x00 und einmal 0xFE. Dann kommen die nächsten 
Daten. Das dürfte dann auch mit deinen 2 Bytes stimmen.

Philipp

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

dann verhalten sich ja die Karten offenbar immer gleich. Ich konnte dies 
aber nicht den SD-Specs entnehmen oder ich habe es nicht verstanden.
Da kommt dann gleich die nächste Frage auf: Kann ich mich darauf 
verlassen, dass es nach einem Block mit CRC IMMER zwei Bytes sind (00 
und FE) oder wie wäre die angemessene Vorgehensweise nach dem Lesen des 
ersten Blocks?
Auf irgendwelche Werte prüfen halte ich für nicht machbar, die könnten 
ja auch aus dem nächsten Datenblock stammen...

Gruß,

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(00 und FE) oder wie wäre die angemessene Vorgehensweise nach dem Lesen
>des ersten Blocks?

Warten auf 0xFE

Autor: Philipp C. (philippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So mache ich es ...
           
wTimeout = 0xFF;   
while ((rc != 0xFE) && wTimeout--) { rc = bySD_ReadByte(); }
wTimeout = 0xFF;   
while ((rc == 0xFE) && wTimeout--) { rc = bySD_ReadByte(); }

// rc contains the first data byte
*pbyReadBuffer++ = rc;


Als erstes warte ich auf "0xFE" (busy),
dann auf das erste nicht busy = Daten.


Philipp

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, aber was mache ich falls in meinem Datenblock die ersten 200 Bytes 
zufällig auch "0xFE" sind?

Gruß,

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso? So lange die Anzahl der empfangenen Bytes kleiner als die 
Blockgröße ist, sind es Daten. Danach kommt dann der hier gezeigte Code.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>OK, aber was mache ich falls in meinem Datenblock die ersten 200 Bytes
>zufällig auch "0xFE" sind?

Nur das erste zählt. Das ist das Start Block Token.

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>OK, aber was mache ich falls in meinem Datenblock die ersten 200 Bytes
>>zufällig auch "0xFE" sind?
>
> Nur das erste zählt. Das ist das Start Block Token.

Ja, aber dann ist die Vorgehensweise

while ((rc == 0xFE) && wTimeout--) { rc = bySD_ReadByte(); }

falsch, denn hier wird nicht nur auf das erste 0xFE geschaut.
Oder anders gesagt: Die Karte darf tatsächlich immer nur ein Byte 0xFE 
als Busy senden, niemals beliebig viele, da ich das dann evtl. nicht von 
Daten unterscheiden kann...

Gruß,

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nach den Daten (Länge ist die Blocklänge) kommt ja das Statusbyte 
und danach FE. Die Anzahl kann variieren (langsame Karte), deshalb ein 
"While". Ich hab es nun mit 16M,256M,512M,1G,2G und 8G ausprobiert und 
:-)

MMC habe ich leider keine, aber wenn die Specs 2.0 auch für die SDXC 
gelten (so steht es auf einer Seite), dann sollte ich bis 2TB ruhe 
haben.

Philipp

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas K. schrieb:
> Wieso? So lange die Anzahl der empfangenen Bytes kleiner als die
> Blockgröße ist, sind es Daten. Danach kommt dann der hier gezeigte Code.

Es geht aber um das Finden des Anfangs vom ZWEITEN Block.

Gruß,

Autor: Philipp C. (philippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp schrieb:
> Also nach den Daten (Länge ist die Blocklänge) kommt ja das Statusbyte
> und danach FE. Die Anzahl kann variieren (langsame Karte)
>
> Philipp

Danke, mein Fehler. Stimmt es gibt nur ein FE, aber es können mehrere FF 
kommen bis zum Status (sollte 0x00 sein). Also letzte "While" streichen.

Philipp

Autor: Oliver R. (superberti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp schrieb:
> Also nach den Daten (Länge ist die Blocklänge) kommt ja das Statusbyte
> und danach FE. Die Anzahl kann variieren (langsame Karte), deshalb ein
> "While". Ich hab es nun mit 16M,256M,512M,1G,2G und 8G ausprobiert und
> :-)
>
Jetzt stell Dir doch mal vor, die ersten 200 Bytes des ZWEITEN 
Datenblocks bestehen aus 0xFE. Mit obigen Code würdest Du die dann in 
die Tonne lesen und dir einen Offset von 200 Bytes einfangen. Damit wäre 
Dein Datenstrom korrupt.

Gruß,

Autor: microchip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hätte da auch noch eine kleine Frage. Ich benutze auch das MDD von 
Mikrochip und möchte möglichst schnell auf die Karte schreiben.
Das ganze funktioniert soweit auch schon, nur kommt mir alles zu langsam 
vor.
Ist es günstiger (schneller) immer 512Byte auf einmal abzuschicken oder 
kann ich auch einfach immer nur z.B. 32 Byte an das MDD schicken. Das 
MDD "sammelt" anscheinend bis 512Byte voll sind und schickt die dann 
erst an die SD-Karte.
Also macht es Sinn selbst 512Byte anzusammeln und dann an MDD zu 
schicken oder macht es keinen Unterschied wenn ich das MDD sammeln 
lasse?
Hoffe das ist verständlich!?
Es gibt ja auch Geschwindigkeitsunterschied bei den SD- Karten. Wie kann 
ich herausfinden, ohne jede zu testen, welche am schnellsten ist?

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.