EEPROM-Speicher mit dem Raspberry Pi nutzen

© Ktsdesign, 123RF

Langzeitgedächtnis

Obwohl ein RasPi mit einer entsprechenden SD-Karte über ausreichend Flash-Speicher verfügt, erweist sich ein zusätzlicher EEPROM manchmal als äußerst nützlich.

Als IT noch EDV hieß, gab es eine Vorliebe für ausführliche Umschreibungen neuer Technologien: EEPROM steht als Abkürzung für das englische "Electrically Erasable Programmable Read-only Memory". Diese Beschreibung klingt wie ein Widerspruch in sich, denn er bedeutet, dass ein eigentlich nur zum Lesen gedachter Speicher sich elektrisch löschen und wieder programmieren lässt.

Die Beschreibung ist jedoch der chipinternen Funktionsweise geschuldet, bei der die Zugriffe beim Schreiben und Lesen auf die Bereiche des Speichers etliche Zwischenschritte erfordern. Wie auch immer – ein EEPROM kann Daten speichern und ohne anliegende Spannung dauerhaft halten. Die Firma Microchip gibt zum Beispiel eine Haltbarkeit der Daten auf dem Chip von mehr als 200 Jahren an. Allerdings gewährleisten die einschlägigen Hersteller üblicherweise die Beständigkeit gespeicherter Daten nur für einen Zeitraum von 10 Jahren.

EEPROMs verfügen über relativ geringe Speicherkapazitäten, typischerweise 128 bis 256 Byte (1 bis 2 Kbit). Das scheint wenig, reicht aber in der Welt der Mikrocontroller oft völlig aus – schließlich hat Twitter mit 140 Byte die Nachrichtenwelt auf den Kopf gestellt. Für den Fall des Falles gibt es jedoch auch EEPROM-Bausteine mit höheren Kapazitäten bis in den mehrstelligen Mbit-Bereich.

Aufgrund der internen Funktionsweise unterscheiden sich die Lese- und Schreibgeschwindigkeit bei einem EEPROM erheblich. Das EEPROM 24AA02 von Microchip liest beispielsweise 1 Byte in einigen Mikrosekunden, benötigt aber zum Schreiben von 1 Byte mindestens 5 Millisekunden – also tausendmal so lange.

Die Speicherchips kommen in Mikrocontroller-Schaltungen meist zum dauerhaften Speichern von Konfigurationsdaten zum Einsatz, quasi als winziger Ersatz für Festplatten. Selbst beim RasPi, der ja eigentlich über ausreichend Speicherkapazität auf der SD-Karte verfügt, lohnt sich unter Umständen der Einsatz eines solchen Bausteins. Liegt etwa die WLAN-Konfiguration auf einem externen EEPROM, steht sie einem neu eingerichteten System schnell und sicher zur Verfügung.

Hardware und Bus

Für erste Experimente mit EEPROMs am RasPi benötigen Sie ein Steckbrett und einige Bauteile. Die Tabelle "Einkaufsliste" nennt Beispiele für die Module und die ungefähren Preise. Alternativ zum Erwerb eines einzelnen I2C-EEPROM-Chips bietet es sich an, für einen kleinen Aufpreis gleich ein Echtzeituhr-Modul samt aufgelötetem EEPROM zu kaufen. Die via I2C ansteuerbaren Varianten auf Basis der RTCs DS1307 und DS3231 für jeweils etwa 5 Euro verfügen über einen 32 Kbit großen Speicherbaustein.

Einkaufsliste

Bauteil

Preis (ca.)

2 Stück 10 kOhm Widerstände

2 Euro für 30 Stück

Steckbrett halblang, Jumper-Kabel

5 Euro

I2C EEPROM 24AA02 oder 24C02

1 bis 3 Euro

SPI EEPROM 25A512

3 Euro

Es gibt EEPROMs sowohl für den I2C- als auch für den SPI-Bus; der RasPi unterstützt beide Bussysteme. Eine Einführung in den I2C-Bus gibt bei Bedarf ein älterer RPG-Artikel [1], den Sie auch auf der Heft-DVD finden. Der Vorteil dieses Bussystems: Sie dürfen bis zu 128 Geräte an nur zwei Leitungen adressieren. Mit einer Taktrate von bis zu 400 kHz am RasPi ist der Bus für EEPROMs ausreichend schnell.

Bei SPI handelt es sich um das schnellere der beiden Systeme, mit bis zu 125 MHz taktet es mehr als dreihundertmal höher als I2C. Beim Schreiben allerdings muss der SPI-Bus auf das EEPROM warten und bietet dann gegenüber I2C keinen Geschwindigkeitsvorteil. Dafür gelingt das Lesen deutlich fixer: Je nach Chip erreichen Sie zwei- bis zehnmal höhere Datenraten. Der Nachteil: Jedes Gerät nimmt eine eigene Leitung in Anspruch, sodass der RasPi nur zwei parallel angeschlossene SPI-Komponenten unterstützt.

Erste Versuche mit I<+>2<+>C

EEPROMs für den I2C-Bus sind sehr verbreitet. Da sie sich ohne zusätzliche Leitungen an den Bus anschließen lassen, bringen einige Sensoren oder Erweiterungen sie quasi huckepack mit, wie etwa die schon erwähnten RTC-Module.

Ein Blog-Beitrag auf Raspilab.wordpress.com [2] beschreibt, wie Sie den I2C-Bus am RasPi einrichten und eine solche Uhr in Betrieb nehmen. Abbildung 1 zeigt, wie Sie das RTC-Modul am GPIO-Port anschließen, Abbildung 2 zeigt dazu im Vergleich den Anschluss eines I2C-EEPROMs.

Abbildung 1: Anschluss einer I2C-Echtzeituhr am GPIO-Port des RasPi.
Abbildung 2: Anschluss des I2C-EEPROMs 24C32N am GPIO-Port des RasPi.

Haben Sie alles verdrahtet und das Modul i2c_dev im Kernel geladen, steht das Modul bereit für den Einsatz. Ein Aufruf von lsmod | grep i2c_dev sollte das Modul anzeigen. Im Folgenden verwenden wir eine DS3231-RTC-Platine, auf der ein Atmel 24C32N mit 32 Kbit Speicher verbaut ist. Der I2cdetect-Aufruf aus Listing 1 listet konsequenterweise zwei Geräte am I2C-Bus auf.

Listing 1

 

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Bei den ausgegebenen Werten handelt es sich um die Adressen, unter denen Sie die Uhr und den EEPROM ansprechen. Eine erste Kontaktaufnahme erfolgt mit den I2C-Tools. Dem Datenblatt [3] zufolge findet sich der Chip 24C32N im Adressbereich 0x50 bis 0x57. Die konkrete Adresse kodieren Sie durch den Anschluss der Pins A0, A1 und A2 an die Spannung Vcc. Sind alle drei Pins angeschlossen, wie bei der RTC DS3231 der Fall, hört der Chip auf die Adresse 0x57.

Der 24C32N erlaubt es, den Speicher byteweise oder in Blöcken von 32 Byte zu beschreiben. Das Schreiben in Blöcken beschleunigt den Vorgang erheblich, da hierbei interne Puffer zum Einsatz kommen. Für einen ersten Test genügen jedoch die Programme i2cset und i2cget aus den I2C-Tools. Im Folgenden ersparen wir uns mit einigen kleinen Skripten die Handarbeit, die ansonsten für das Vor- und Nachbereiten der Daten erforderlich wäre. Vergessen Sie nicht, die Skripte nach dem Abspeichern ausführbar zu machen.

Das Skript aus Listing 2 schreibt eine Zeichenkette in das EEPROM. Der verwendete 24C32N erlaubt das Schreiben von bis zu 32 Byte an einem Stück, weshalb das Skript in Zeile 6 prüft, ob der Text dieser Länge entspricht. Es adressiert den Speicher als ein einziges langes Feld. Die I2C-Tools erwarten die Angaben zu Adresse und Bytes in hexadezimaler Form.

Listing 2

 

#!/bin/bash
I2C_ADRESSE="0x57"
DATA_ADRESSE="0x00 0x00"
# Nicht länger als 32 Zeichen am Stück:
TEXT="Hallo Welt auf einem EEPROM"
DATA_LEN=${#TEXT}
[ $DATA_LEN -gt 32 ] && exit
WORTE32=$(echo $TEXT | hexdump -e '32/1 "0x%02X " "\n"' | sed 's/0x //g')
sudo i2cset -y 1 $I2C_ADRESSE $DATA_ADRESSE $WORTE32 i
echo "$DATA_LEN Bytes geschrieben"

Das Skript beginnt einfach an der hexadezimalen Adresse 0x00 0x00, also am Anfang. Die höchste hexadezimale Adresse beim 24C32N lautet 0x0F 0xFF. Auf diese Weise adressieren Sie bei Bedarf jedes der 4096 Bytes einzeln. Zeile 7 konvertiert die Zeichen in hexadezimale Werte und macht daraus Blöcke zu je 32 Zeichen. Das Sed-Kommando schneidet nicht konvertierte Zeichen ab; diese erscheinen als 0x.

Um die Zeichen wieder auszulesen, nutzt das Skript in Listing 3 das Programm i2cget, das Auslesen geschieht Byte für Byte. Zunächst braucht das Skript eine Angabe dazu, wie viele Bytes Sie lesen wollen. Daher übergeben Sie die Anzahl als ersten Parameter (Zeile 3). Laut Datenblatt des 24C32N leiten Sie das Lesen des Speichers mit einem Schreibzugriff auf die Datenadresse ein. Aus diesem Grund findet sich in Zeile 5 ein solcher Aufruf.

Danach erfolgt das byteweise Auslesen durch den wiederholten Aufruf von i2cget. Der interne Zeiger für die Adressen springt bei diesem Baustein automatisch weiter. Da das Skript von einem Text ausgeht, konvertiert es für die Ausgabe zusätzlich die Bytes. Die Ausgabe des Skripts sieht im Beispiel dann so aus wie in Listing 4.

Listing 3

 

#!/bin/bash
I2C_ADRESSE="0x57"
DATA_ADRESSE="0x00 0x00"
DATA_LEN=$1
sudo i2cset -y 1 $I2C_ADRESSE $DATA_ADRESSE i
for i in $(seq 1 $DATA_LEN); do
  echo $(sudo i2cget -y 1 $I2C_ADRESSE) | xxd -r;
done
echo
echo "$DATA_LEN Bytes gelesen"

Listing 4

 

$ ./readEE.sh 27
Hallo Welt auf einem EEPROM
27 Bytes gelesen

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Aktuelle Ausgabe

10/2017
Addon-Boards

Diese Ausgabe als PDF kaufen

Preis € 7,99
(inkl. 19% MwSt.)

Neuigkeiten

  • Neues auf der Heft-DVD

    Nur mit dem optimalen System und der richtigen Software nutzen Sie das volle Potenzial eines Mini-PC. Mit der Heft-DVD erhalten Sie nicht nur die neusten Distributionen für den Raspberry Pi und Konsorten, sondern gleichzeitig auch die passenden Programme zu den Artikeln.

  • Aufgewacht!

    Der Raspberry Pi fährt auf Kommando herunter, doch zum Aufwachen fehlt ihm eine Echtzeituhr. Mit einer RTC und ein paar Schaltungen steuern Sie den Schlaf- und Wachrhythmus des Mini-Rechners.

  • Schneller Wechsel

    Mit dem Messkopf ExpEYES Junior erfassen Sie auf einfache Weise die Flimmerfrequenz von verschiedenen Lichtquellen.

  • Knirps

    Der 3,2 Zoll kleine Monitor von Joy-it, zusammen mit dem RasPi kaum größer als eine Packung Zündhölzer, bietet eine interessante Alternative zu einer reinen Headless-Konfiguration. Er erleichtert das Überwachen des Boot-Vorgangs und das Verfolgen von Ausgaben, die nur ein Paar Zeichen oder Zeilen umfassen.

  • Minimalistisch

    Die Raspberry-Pi-Familie bekommt regelmäßig Zuwachs, doch einige Familienmitglieder fristen ein Schattendasein, wie das Compute Module. Das kompakte Board eignet sich bestens für Embedded-Lösungen.

  • Meisencam

    Mit einem RasPi, einer NoIR-Pi-Cam und etwas Elektronik bauen Sie für unter 100 Euro ein digitales Auge, mit dem Sie behutsam Singvögel in der Natur beim Brüten beobachten.

  • Mit einfachen Mitteln

    YunoHost bietet eine große Anzahl von Diensten auf einer bewährten Debian-Server-Plattform, die Sie selbst hosten können.

  • An einem Tisch

    Gemeinsames Arbeiten auf einer mobilen Plattform im lokalen Netzwerk – dazu brauchen Sie nicht mehr als einen SBC und die Software Etherpad Lite.

  • Netz aufspannen

    Ein WLAN-Access-Point bietet einen zusätzlichen Einstieg ins LAN und erlaubt im Zusammenhang mit dem RasPi vielfältige Einsatzszenarien.

  • Diätkost

    Für ältere Modelle des RasPi erweist sich Raspbian mittlerweile als zu schwergewichtig. Mit dem schlanken DietPi helfen Sie diesen Modellen wieder auf die Sprünge.