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
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
@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