SD-Karte binär auslesen

Gast #4400097
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
#4400241
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?
#4400456
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.
Persönliche Seite #4400623
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren