SD Karten

In Star Trek Next Generation war mal die Rede von Naniten, die 1 GB Speicher hätten haben sollen.

Das ist wirklich utopisch bzw. pure Übertreibung

dachte ich damals in den 90ern.

Und heute haben SD-Karten kleiner als ein Daumennagel Kapazitäten von einem Terabyte und mehr. … also kann man schon sagen, dass 1 GB Daten nur mehr die Größe ein paar Körperzellen hat …


SD-Karten wurden anfangs als Ersatz für Datenspeicher in Videokameras entwickelt und waren im PC nur eine Art “Zusatzspeicher”.
Doch nach und nach wurden sie eine günstige Alternative zu normalen Festplatten und SSDs von denen Betriebssysteme gestartet werden konnten. Der Raspberry PI und alle seine SoC Verwandten tun das.

Aber auch für Mikrocontroller sind die Karten eine interessante Lösung um entweder Daten zu lesen oder Informationen zu speichern.

SD-Card-SPI-Board

SPI als Schnittstelle zur SD Karte

Das Serial Peripheral Interface (kurz SPI) setzt 4 Leitungen ein, die direkt mit entsprechenden Pins der SD-Karte verbunden werden, denn jede SD-Karte sollte den SPI-Modus zur Datenübertragung unterstützen.

Nachdem unsere Controller der Master und die Karte der Slave ist, werden Bits am MOSI Anschluss vom der MCU zur Karte gesendet, während gleichzeitig die Karte über MISO Daten zurücksenden kann. Ob ein Bit mit 0 oder 1 übertragen wird, wird über den Taktgeber (SCK - Clock) ermittelt. Immer wenn die von LOW auf HIGH wechselt, wird gemessen, ob an MOSI oder MISO ein Spannung (HIGH) anliegt. Beim Arduino UNO liegen SCK auf Pin 13, MOSI auf Pin 12 und MISO auf Pin 11.

Die 4. Leitung heißt Chip-Select (CS) manchmal auch Slave-Select (SS) genannt und ist seitens der MCU ein Output-Pin auf HIGH wenn KEINE Kommunikation stattfinden soll. Sobald Daten ausgetauscht werden sollen, muss CS/SS auf LOW wechseln.
So lassen sich mehrere SPI-Slaves parallel betreiben, die abwechselnd auf LOW (an) und HIGH (aus) geschaltet werden. Beim Arduino Uno ist laut Standard Pin 10 für CS vorgesehen, aber es kann auch jeder andere digitale Pin genutzt werden um ein Gerät für SPI zu aktivieren.

Arduino UNO SPI SD-Card-SPI-Board Backside

Dateisysteme nutzen

Das binäre Protokoll ist im SD-Standard dokumentiert, aber man kann es sich auch aus der SD-Bibliothek herleiten, die bei der Arduino IDE mitgeliefert wird.

Neben Initialisierung und Zustandsinfos abfragen fall die Read- und Write-Kommandos ins Auge. Sie lassen einen Block durch eine 32 Bit Adressierung auslesen. Bei einer üblichen Block-Größe von 512 Bytes kommen wir also auf ein Maximum von 2 Terabyte, die man über diese Schnittstelle bearbeiten kann.

Ebenfalls in der Arduino SD-Bibliothek integriert ist ein kleiner FAT und FAT32 Treiber, der Dateisystemoperationen einfachst auf SD-Karten Blocklese- und Schreibaktionen übersetzt.

Man kann so per Code Dateien anlegen und mit z.B. Sensorwerten befüllen.
Umgekehrt lassen sich natürlich auch Dateien öffnen und auslesen, womit man Stück für Stück ein Bild auslesen und z.B.: auf ein LCD-Display zeichnen kann.

Das muss man natürlich Stückweise tun, denn die 2 KByte RAM eines Arduino UNO können unmöglich ein 320x240 Pixel Bild als Ganzes aufbewahren.

Fazit

Die Tatsache, dass es heute so unglaublich einfach ist auch reguläre Speichermedien wie SD-Karten mit einer Hand voll Zeilen auf einer MCU anzusprechen, versetzt mich immer wieder ins Staunen.

Wenn ich daran denke, wie kompliziert im Vergleich BIOS Aufrufe am PC zu DOS Zeiten früher waren um Bytes auf eine Diskette zu schreiben, dagegen ist die Programmierung eines SD-Karten Datenloggers heute ein Klacks.

Ich gebe zu bisher eher wenig mit SD-Karten auf MCUs in der Praxis gearbeitet zu haben, schließlich muss ich bei mir zu Hause nichts loggen … und wenn ich es müsste, wäre immer die Einstellung der Uhrzeit ein kritisches Thema.

Aber diese Technik - davon bin ich überzeugt - wird mir in künftigen Projekten noch sehr gute und vor allem notwendige Dienste leisten. Denn Parameter für ein Embedded System lassen sich über dieses Medium immer noch am leichtesten übertragen. Einfach eine Karte in den PC stecken, Datei anlegen, in den MCU- SD-Slot stecken und der dort laufende Code liest die Änderungen aus um sie anzuwenden.

Ja, so stelle ich mir das vor!