SD Karte - Geschwindigkeit erhöhen - PIC18F4550

Gast #1689176
Lesenswert?

hallo,

ich verwende eine SD Karte um messwerte zu speichern.

Der zurzeit verwendete µC ist ein PIC18F4550, der später durch einen 
dsPIC30F6010 ersetzt werden soll.

ich verwende den low-level-driver vom ccsc compiler, mmc_sd.c als 
header.

kein fat system, die daten werden einfach in 512Byte blöcken zuerst in 
den puffer der karte und dann in den eigentlichen speicher geschrieben. 
Das dauert über die SPI schnittstelle 30µs.

das brennen eines blockes dauert 5ms.

wenn man die 30us vernächlässigt, kommt man bei 512byte * 200 auf 
100kbyte/s.

das ist zu wenig, wie kann ich die geschwindigkeit erhöhen?

es muss möglich sein, wenn ich die sd karte in meine pc stecke und ein 
file daraufkopiere kann man es mit 1,5mByte/s schreiben.

danke für eure hilfe,

lg clemens
Gast #1689188
Lesenswert?

>wenn man die 30us vernächlässigt, kommt man bei 512byte * 200 auf
>100kbyte/s.

Mit nem AVR komm ich auf 450kb/s. Aber nicht mit jeder Karte!

>das ist zu wenig, wie kann ich die geschwindigkeit erhöhen?

Was anderes nehmen als ne SD Karte. Das Wear Levelling kann einem
ganz schön den Tag versauen. 300ms Päuschen sind da keine Seltenheit.
Gast #1689215
Lesenswert?

>z.B. mit FPGA oder CPLD.

Vergiss es. Das einzige was ein bißchen was bringt ist
ein Arsch voll RAM und im Multiblock Mode schreiben.

>es muss möglich sein, wenn ich die sd karte in meine pc stecke und ein
>file daraufkopiere kann man es mit 1,5mByte/s schreiben.

Dann nimm doch einen PC!
Moderator Persönliche Seite #1689305
Lesenswert?

Clemens schrieb:
> hallo,
>
> ich verwende eine SD Karte um messwerte zu speichern.
>
> Der zurzeit verwendete µC ist ein PIC18F4550, der später durch einen
> dsPIC30F6010 ersetzt werden soll.
>
> ich verwende den low-level-driver vom ccsc compiler, mmc_sd.c als
> header.

.c als header??

Gibt es den Quellcode zu sehen? Wird darin eine "spi_read_write" 
Funktion für jedes Byte aufgerufen auch beim Schreiben/Lesen von ganzen 
Blocks?

> kein fat system, die daten werden einfach in 512Byte blöcken zuerst in
> den puffer der karte und dann in den eigentlichen speicher geschrieben.
> Das dauert über die SPI schnittstelle 30µs.
>
> das brennen eines blockes dauert 5ms.

Das ist optimistisch. Es mag für viele Blocks so sein aber unbedingt 
testen (=mehrere Megabytes in aufeinanderfolgende Blöcke schreiben und 
die Maximalzeit festhalten). Wie von holger schon angemerkt, kann 
Schreiben eines Blocks auch mal sehr viel länger dauern.

> wenn man die 30us vernächlässigt, kommt man bei 512byte * 200 auf
> 100kbyte/s.
>
> das ist zu wenig, wie kann ich die geschwindigkeit erhöhen?

Im Mittel: SPI-Takt so hoch wie möglich (<=25MHz bei SDC), SPI so wenig 
wie möglich pollen. Kenne PIC32 nicht aber die bieten mglw. DMA oder 
zumindest einen kleinen SPI FIFO. Vielleicht gibt es ja auch ein 
"ausgewachsenes" MCI für SD-Card-Bus bei den Teilen. Multiblock hilft 
auch, manchmal sogar deutlich, wurde ja ebenfalls schon von holger 
geschrieben.

Wie auch schon von holger angemerkt, hilft zur Überbrückung der längeren 
Block-Schreibzeiten (max. 250ms in zumindest einem SDC Datenblatt) nur 
ausreichend RAM zum Puffern der zwischenzeitlich auflaufenden Daten. 
Firmware muss dann quasi parallel Daten sammeln, puffern und vorhandene 
Daten wegschreiben bzw. auf Karte warten.

> es muss möglich sein, wenn ich die sd karte in meine pc stecke und ein
> file daraufkopiere kann man es mit 1,5mByte/s schreiben.

Mit hohem SPI-Takt, Controllern mit SPI-DMA oder SPI-FIFO und halbwegs 
schnellen Karten kommt man schon in den Bereich von >1000kBytes/sec aber 
halt nur im Mittel, dazwischen kurzzeitig auch mal nur ca. 
2,5kBytes/sec.

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