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
>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.
>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!
Einen PC zu verwenden ist keine Option, die platine soll in einen zylinder mit 5cm höhe und 20cm durchmesser.
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.
Wobei man auf SD-Cards nicht nur per SPI sondern auch per 4-Bit SDIO schreiben kann und es µCs gibt, die solch ein Interface besitzen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.