SD Karten
« | 19 Jul 2020 | »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.
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.
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!