Raspberry Pi – EEPROM programmieren
In diesem Beitrag zeige ich euch, wie ihr mit einem Raspberry Pi einen EEPROM Baustein programmiert. Diesen habe ich im Zuge eines bereits im Sommer angekündigten Projekts erstellt, das ich leider bis heute weder fertiggestellt noch darüber berichtet habe. Dafür gibts jetzt zumindest einmal einen kleinen Vorgeschmack.
Raspberry Pi – EEPROM programmieren
Ein EEPROM ist ein elektronisches Bauteil, das Daten abspeichern kann. Ein ROM ist ein klassischer – nicht änderbarer Speicher in dem Anweisungen für eine elektronische Schaltung gespeichert werden. Ihr kennt das vielleicht vom BIOS Betriebssystem eures Computers. Ein EEPROM (Electrically Erasable Programmable Read-Only-Memory) beinhaltet zwar fixe Daten, kann aber unter bestimmten Voraussetzungen elektronisch gelöscht und neu beschrieben werden. Der hier verwendete Atmel AT28C16 hat 16K Speicher, das bedeutet man kann 2048 8bit Wörter speichern. Um diesen nun mit Daten zu füllen benötigen wir ein Lese-/Schreibgerät. Der Artikel basiert auf einer Youtube Serie über einen 8-bit Computer den man im Eigenbau zusammenstellt. Dabei wird ein solches Lese-/Schreibgerät mit einem Arduino Nano selbst gebastelt – ich habe das zusätzlich auch für den Raspberry Pi umgesetzt.
Voraussetzung
Die ganze Theorie dahinter und die Funktionsweise mit dem Arduino Nano wird in dem Video sehr gut erklärt. Ich kann diese Youtube Serie jedem empfehlen. Man benötigt einige Materialien wie Kabel und elektronische Bauteile, diese kann man teilweise extrem günstig aus dem Internet (eBay, Reichelt, usw.) beziehen.
Software
Der Chip kann über ein einfaches Python Skript von der Raspberry Pi Kommandozeile gelesen und neu bespielt werden. Dafür verwende ich WiringPi, eine Bibliothek, die bekannte Arduino Kommandos für Python anbietet. Wir installieren also zuerst einmal die WiringPi Bibliothek. Das geht wie folgt:
sudo apt-get install python-dev python-pip sudo pip install wiringpi2
In der interaktiven Python Shell können wir auch bereits diese neue Bibliothek testen:
sudo python import wiringpi wiringpi.piBoardRev()
Bei einem Raspberry Pi 3 gibt es beispielsweise die Ausgabe 2:
Damit haben wir alle Anforderungen erfüllt und können mit einem Python Skript die Software vom Arduino für unseren Raspberry Pi nachbauen.
Python Script
Das vollständige Skript findet ihr auf meiner EEPROM GitHub Seite, dort werdet ihr auch laufend neue Projekte finden. Am besten ihr folgt den Anweisungen des Youtube Videos um mehr über dessen Funktionsweise herauszufinden. Relevante Änderungen gibt es eigentlich nur bei allen Unterschieden von Python zu C, das sind insbesondere die Funktionen und Schleifen. Besonders interessant ist, dass die WiringPi Funktionen jenen des Arduino sehr ähnlich sind, dennoch muss man Konstanten beispielsweise selber setzen und vor allem selber herausfinden welchen Wert man benötigt.
Pinbelegung
Die Belegung der Pins der GPIO Schnittstelle erscheint etwas willkürlich. Das hat den Grund, dass ich relativ viele Probleme hatte das Script zu testen. Schlussendlich stellte sich heraus, das die Verkabelung am Board nicht perfekt war und ich aber bei der GPIO Schnittstelle den Fehler suchte. Tatsächlich könnt ihr diese beliebig ändern, aber Achtung: WiringPi hat eine eigene und sehr spezielle Nummerierung der GPIO Pins, was ziemlich zur Verwirrung beiträgt und fast die meiste Zeit bei der Fehlersuche einnimmt.
Ein paar wichtige Informationen zu den Kabel:
- rot: Stromversorgung für das Breadboard. Auf dem Foto wird der 5V Ausgang der Schnittstelle verwendet. Bitte das auf den 3.3V Ausgang ändern, weil die 5V würden dann auch gelesen werden und das ist zu viel Spannung – obwohl der Pi 3 schon ganz gut damit zurecht kommt.
- schwarz: Erdung einfach auf Masse
- gelb/weiß: das sind die drei Kabel für die Festlegung der Adresse mit dem SHIFT Register. Weiß ist das clock Signal, das gelbe dahinter das Datenkabel und links davon das LATCH. Siehe dazu die Pin Nummerierung im Script.
- orange/grau/grün: die Farben sind willkürlich, die 8 Kabel sind die Pins für die 8bit Daten pro Adresse. wobei die Bits von rechts nach links durchnummeriert sind. Im Script findet ihr dazu das EEPROM_DATA Array mit der obskuren WiringPi Nummerierung
- blau: das ist das Write Enable für den EEPROM Chip. Das ist immer unter Strom, außer kurz unter 1000 Mikrosekunden ein Impuls auf 0, damit die Daten gespeichert werden. Wie im Video erklärt ist es wichtig, dass dieses so kurz wie möglich ist, ansonsten würde man die maximale Schreibanzahl vom Chip vermutlich stark herabsetzen.
Testlauf
Der Testlauf löscht den gesamten Speicher des Chips (setzt alle Werte auf 0xff) und speichert danach das definierte Array mit Daten ab. Zuletzt erfolgt noch die Ausgabe des Speichers – diese ist auf 256 Adressen verkürzt, man könnte natürlich auch alle 2048 Adressen ausgeben.
Fazit
Es ist recht einfach mit dem Raspberry Pi EEPROM programmieren zu lassen. Da in diesem Fall nur die digitalen Pins vom Arduino Nano verwendet werden ist es gar kein Problem genau die selbe Funktionsweise auch mit einem Raspberry Pi und Python nach zu bauen. Das Python Script hat wegen der Sprache zwar einige Eigenheiten, unterscheidet sich aber vom originalen C Script kaum. Im direkten Vergleich mit Arduino ist kein Unterschied festzustellen. Mit beiden kann man nun den EEPROM Chip beschreiben und den Inhalt ausgeben.
tolles projekt, ich würde das gerne ausprobieren, bin mir aber nicht sicher, ob ich 27c322 chips programmieren kann. wäre das möglich
Entschuldigung, wenn die Grammatik falsch ist, musste ich Google Translate verwenden, da die Muttersprache Englisch ist 🙂
Programming 27C322 EEPROM chips shouldn’t be a problem. How do you program them today? First I used my Arduino Nano (as you can see in my linked youtube video). I wanted to know if it is also possible with my Raspberry Pi so I used it first to read data from that chip. That was really easy, so next step was to also write (details on how to are found in datasheet from EEPROM chip). This worked well so I uploaded my code to GitHub. Feel free to use and modify it.
Hallo Werner,
kann das überhaupt mit einem Raspberry Pi funktionieren? Dieser arbeitet mit 3,3V an den GPIOs, ein 28Cxx benötigt aber 5V ± 10%. Wenn ich den 28Cxx mit 5V betreibe, besteht die Gefahr, die GPIO-Eingänge des Raspis zu zerstören. Ein Output High Voltage max ist im Datenblatt des 28Cxx nicht angegeben und dürfte deshalb in etwa bei 5V liegen.
Gruß Thorsten
Es hat funktioniert. Den so programmierten EEPROM Chip habe ich auch so in einem Projekt verwendet.