Hallo, endlich funktionieren meine Lese- und Schreibroutinen für SD-Karten an meinem uC-Board! Ich habe sie mit einer neuen 2GB Karte von Intenso und einer 3 Jahre alten 256MB von Toshiba (mit HAMA Aufkleber) getestet. Dabei wurden jeweils 10000 Blocks a 512Byte an aufeinanderfolgende Addresse geschrieben bzw. gelesen. Alle Blöcke waren gleich und mit HEX-Zahlen von 0-FF gefüllt (jeweils 2 mal). Die Ergebnisse haben mich erstaunt: Toshiba Intenso Lesen: 1027kB/s 808kB/s Schreiben: 419.8kB/s 73.8kB/s Ich hätte nicht gedacht, dass der Unterschied so gross sein kann. Insbesondere die niedrige Schreibrate der Intenso-Karte kommt mir merkwürdig vor. Wie können Speicherchips so unterschiedliche Zugriffszeiten haben? Da die Toshiba Karte so viel besser ist, glaube ich nicht, dass es an meiner Software liegt, oder etwa doch? Ein Blick auf das TAAC-Feld im CSD-Register bringt auch erstaunliches zu Tage: Toshiba: 0x2B == 2us Zugriffszeit Intenso: 0x3E == 3ms " Beide Werte haben wenig mit der tatsächlichen Datenrate zu tun. Gruss Mike
Es ist nicht die Zugriffszeit, sondern die Schreibzeit. Tja. Irgenwo muss/kann man sparen...
Intenso is ja auch der letzte Rotz den man kaufen kann... da solltest Dich nicht wundern.
Ich habe das Schreiben gerade noch mal getestet. Die Intenso Karte steigert sich! Immerhin schafft sie jetzt 178.6 kB/s. Sie muss offenbar erst eingefahren werden! Dennoch würde ein komplettes Beschreiben mit 2GB immer noch ca. 3 Stunden dauern. Gruss Mike
@Mike: Bei diesen niedrigen Schreibraten würde ich dann doch eher noch Optimierungspotentiale bei Deiner Software vermuten. Wenn Du die Karte z.B. in Windows mit Daten belädst wird die Schreibrate eher mehrere MB/s betragen. Was für ein µC-System verwendest Du denn? Und wie hoch ist Deine SPI-Frequenz? Gruß, Daniel
Ein vergleich mit dem schreiben am PC ist hier soweit ich weis nicht zulaessig, da die Karte vom Pc ja nicht im SPI Modus angesprochen wird. lg Stefan
@Daniel Ich benutze einen LPC2378 mit 48Mhz Prozessortakt, die Taktfrequenz der SD-Karte beträgt zur Zeit 12Mhz. Dies gibt bei einer Busbreite von 4 bit eine maximale Transferrate von 6Mb/s. Sicherlich ist die Software nicht optimal, ich schreibe jeden Block einzelnen, so dass ein gewisser Overhead anfällt. Mit multiple block write würde es sicher noch schneller gehen. Ziel ist es aber, die EFSL Library zu implementieren, und die unterstützt Mehrfachblöcke leider nicht. Trotzdem ist es auffällig, dass die gleiche Software mit unterschiedlichen Karten so grosse Unterschiede zeigt. Es lohnt sich also doch, in Markenprodukte zu investieren. Gruss Mike
@Daniel,Stefan Um Missverständnisse zu vermeiden: Meine Karte wird über den SD-Bus, nicht über SPI angesprochen. Ich werde noch mal versuchen, den Takt auf 24 Mhz zu erhöhen, maximal 25 sind ja erlaubt Gruss Mike
Achso - entschuldigung. Dachte mir das du die Karte (so wie fast alle hier) im SPI Modus betreibst. Wenn dem nicht so ist dann verwundet mich die Datenrate ebenfalls. lg Stefan
Testergebnisse mit 24Mhz Kartentakt: Toshiba Intenso Lesen: 1603kB/s 1130kB/s Schreiben: 503kB/s 180kB/s Beim Lesen bringt's was, beim Schreiben wenig. Letzendlich gehe ich aber wieder zurück auf 12Mhz, da mir die Leserate bei weitem ausreicht. Schliesslich soll der Prozessor ja auch was Sinnvolles mit den Daten anfangen.
Könnte evtl. an einer "wear-leveling" Technik liegen: Die neuen günstigen Karten nutzen MLC-Chips, die nur bis ca. 10.000 Schreibvorgänge spezifiziert werden. Um in dem Speicherbereich in dem die FAT-liegt auf ne geeignete Lebensdauer zu kommen werden die Blöcke/Cluster laufend in andere Bereiche verlegt. Hab neulich was über ne Transcend 133x (oder langsamer, mit MLC-Chips jedenfalls) gelesen. Die war in den ersten 10-15% des Speicherbereichs auch Schneckenlangsam.
Ich habe die SD-Spezifikation noch einmal gründlich studiert. Der Grund für die schlechte Schreibperformance liegt wahrscheinlich darin, dass die grosse 2GB Karte intern grössere Blöcke als 512 Bytes verwendet (z.B. 2kB). Bei jedem Schreiben eines 512er Sektors muss der komplette Block gelöscht, die Daten zwischengespeichert und wieder neu programmiert werden. Das kostet natürlich Zeit, un damit ist die Karte gegnüber ihren kleineren Schwestern im Nachteil. Als Gegenmassnahme bietet sich an, grössere Schreiboperationen (Multiple Block Write) zu verwenden und eine entsprechende Zahl von Sektoren per pre-erase (ACMD23) im Voraus zu löschen. Leider dürfte das in den meisten embedded Systemen am fehlenden Puffer-RAM scheitern. Da ich die EFSL verwenden möchte, geht's ohnehin nicht, denn die EFSL kann nur 512-byte Sektoren schreiben. Gruss Mike
@Mike: habe noch nirgends Infos zum 4 Bit Modus gefunden, da man dafür anscheinend löhnen muss. Könntest du mir diese Infos bitte zukommen lassen. kosmos at mayn punkt de
als ich mal mit SD-Karten 'rumgebastelt hatte, war es sehr entscheidend, die Sektoren vorher zu löschen. Dann war das Schreiben wesentlich schneller. Wenn es Dir auf Geschwindigkeit ankommt, nimm eine CF-Karte (wie in den teureren Fotoapparaten). Mehr Hardwareaufwand, aber viel einfacher anzusteuern finde ich (insbesondere das Gezicke bei der Initialisierung von SD fällt weg) und viel schneller.
@Thomas: Hier die neueste Version der Spezifikation für die SD-Karte, direkt von der SD Group. Da steht genau drin, wie man auf den 4-bit mode umschaltet (mit ACMD6). Es ist ein weit verbreiteter Irrtum, dass die SD-Karten Spezifikation nicht öffentlich sei, geheimgehalten wird lediglich der Zugriff auf die kryptographischen Spezialfunktionen. Diese finden sich in der Security spec, die tatsächlich nur Mitgliedern der SD Group zugänglich ist. In der Praxis werden diese Spezialfunktionen so gut wie nie genutzt, für die Anwendung als Speichermedium reicht die normale Spec völlig aus. Gruss Mike
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.