Forum: PC-Programmierung SD-Karte binär auslesen


von Franz Peter Zantis (Gast)


Lesenswert?

Vielleicht hatte schon mal jemand ein ähnliches Problem:
SD-Karten sind bei uns auf Baugruppen eingesetzt. Sie enthalten 
Konfigurationsdaten oder werden im Zusammenhang mit dem Sammeln von 
Daten (Datenlogger) benutzt.
Dabei werden die SD-Karten binär beschrieben - ohne Dateisystem. Sie 
werden also wie ein Flash-Speicher verwendet. Zum Beschreiben und 
Auslesen wird über SPI zugegriffen.
Es funktioniert soweit auch gut. Wenn allerdings die Daten über USB in 
einen PC eingelesen werden sollen, dann geht dies nur byteweise. Also in 
einer Schleife bei der pro Durchgang ein Byte gelesen wird. Das 
funktioniert sehr gut - ist aber langsam.
Ich habe versucht zwei Byte gleichzeitig auszulesen - also statt 8 
Taktzyklen des SPI-CLock 16 Taktzyklen verwendet. Auch 24 und 32 Zyklen 
habe ich bereits versucht. Allerdings kamen die Daten dann mit Lücken. 
Das erste Byte wird richtig gelesen, dann kommt ein Byte oder mehrere 
Bytes mit Nullen, dann kommt das zweite richtige Byte usw.
Bisher habe ich dafür keine Erklärung gefunden.
Eigentlich müsse es möglich sein mehrere Bytes auf einmal auszulesen. 
Nur dann kann man auch die üblichen Datendurchsätze erreichen.
Hat vielleicht schon jemand dieses Problem gehabt und gelöst?
Viele Grüße
Franz Peter Zantis

von Vlad T. (vlad_tepesch)


Lesenswert?

was spricht denn dagegen die SD Karte im PC im normalen Reader einfach 
Sektorweise auszulesen?

von Klaus (Gast)


Lesenswert?

Franz Peter Zantis schrieb:
> Ich habe versucht zwei Byte gleichzeitig auszulesen - also statt 8
> Taktzyklen des SPI-CLock 16 Taktzyklen verwendet. Auch 24 und 32 Zyklen
> habe ich bereits versucht. Allerdings kamen die Daten dann mit Lücken.

Hallo,

hier steht was zum Thema:
http://elm-chan.org/docs/mmc/mmc_e.html

Gruß Klaus

von Rolf M. (rmagnus)


Lesenswert?

Franz Peter Zantis schrieb:
> Es funktioniert soweit auch gut. Wenn allerdings die Daten über USB in
> einen PC eingelesen werden sollen, dann geht dies nur byteweise. Also in
> einer Schleife bei der pro Durchgang ein Byte gelesen wird. Das
> funktioniert sehr gut - ist aber langsam.
> Ich habe versucht zwei Byte gleichzeitig auszulesen - also statt 8
> Taktzyklen des SPI-CLock 16 Taktzyklen verwendet. Auch 24 und 32 Zyklen
> habe ich bereits versucht.

Das verstehe ich nicht. Wenn du sie auf dem PC "über USB" einliest, was 
hast du dann mit irgendwelchen SPI-Clocks am Hut?

von Jim M. (turboj)


Lesenswert?

Franz Peter Zantis schrieb:
> Es funktioniert soweit auch gut. Wenn allerdings die Daten über USB in
> einen PC eingelesen werden sollen, dann geht dies nur byteweise. Also in
> einer Schleife bei der pro Durchgang ein Byte gelesen wird. Das
> funktioniert sehr gut - ist aber langsam.

Was ist langsam? USB 1.1 Full Speed erlaubt netto ca. 1,0 MByte/sec.
Das habe ich IIRC aber nur mit >= 48 MHz Basistakt der CPU geschafft.

Franz Peter Zantis schrieb:
> Ich habe versucht zwei Byte gleichzeitig auszulesen - also statt 8
> Taktzyklen des SPI-CLock 16 Taktzyklen verwendet. Auch 24 und 32 Zyklen
> habe ich bereits versucht. Allerdings kamen die Daten dann mit Lücken.
> Das erste Byte wird richtig gelesen, dann kommt ein Byte oder mehrere
> Bytes mit Nullen, dann kommt das zweite richtige Byte usw.
> Bisher habe ich dafür keine Erklärung gefunden.

Eventuell falsche Byte Order. In meinen 16Bit SD SPI Routinen für Cortex 
M3 (Little Endian) ist jeweils ein Rev16 drin, dass die Byte Reihenfolge 
auf Big Endian tauscht. Schau Dir mal die Bytes genau an, das könnte 
auch Dein Problem sein. SPI sendet das MSB zuerst und ist damit bei 
Transfers >1 Byte immer Big Endian.

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Franz Peter Zantis schrieb:
> Eigentlich müsse es möglich sein mehrere Bytes auf einmal auszulesen.
> Nur dann kann man auch die üblichen Datendurchsätze erreichen.
> Hat vielleicht schon jemand dieses Problem gehabt und gelöst?

Du möchtest jetzt einfach deine SD-Karte am PC auslesen?
Wenn ja, dann lese deine SD-Karte mit dd aus.

Wenn du die Daten vom Controller auslesen möchtest und sie dann per µC 
über USB an den PC senden möchtest, dann lese 512Byte (immer ein Sektor) 
aus der SD-Karte aus und schicke die Daten dann an den PC.
Mit den Xmega kann man glaube ich 512Byte in einem Paket versenden, aber 
man kann ja auch in mehrere Pakete spliten und versenden.
Da gibt es extra so ein Mass-Storage-Option für die USB-Kommunikation.

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.