I2C EEPROM's mit dem Raspberry am Beispiel Atmel AT24C32

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)

  • Dieser Thread war jetzt mal Anlaß, ein kurzes How-To zu schreiben zu i2c-EEPROM's. Da der dortige TO ja keine Antworten wünscht, hab ich mal hier meine Basteleien zusammengefasst.

    Für verschiedene Typen von i2c-EEPROM's gibt es bei Linux den Kernel-Treiber at24. Im Folgenden ein Beispiel mit einem AT24C32, wie man i2c-EEPROM's auf dem Raspberry Pi verwenden kann.

    Getestet mit folgendem System:
    Raspberry Pi 2 Model B Rev 1.1 mit aktuellem Archlinuxarm und einem EEPROM Atmel AT24C32, der als Beigabe auf einem RTC-Uhrenmodul verbaut ist. Anschluß des Moduls an i2c1 (Pin3, GPIO8, SDA und Pin5, GPIO9, SCL). Der EEPROM hat die i2c Adresse 0x50.

    Zuerst ein DT-Overlay erstellen:

    In eine .dtbo-Datei umwandeln mit:

    $dtc -@ -Hepapr -I dts -O dtb -o at24c32.dtbo at24c32-overlay.dts

    und ins Overlay-Verzeichnis kopieren:

    #cp at24c32.dtbo /boot/overlays/at24c32.dtbo

    Eintrag in die /boot/config.txt

    dtoverlay=at24c32

    und den RasPi neu starten.
    Danach kann man prüfen, ob der Treiber geladen, sieht bei mir so aus:

    Code
    # lsmod | grep at24
    at24                   16384  0
    regmap_i2c             12288  1 at24

    Der Speicher liegt dann unter /sys/bus/i2c/devices/1-0050/eeprom für die von mir verwendeten Einstellung Bus i2c1 und Adresse 0x50.

    Jetzt man kann den EEPROM löschen z.B.
    #dd if=/dev/zero of=/sys/bus/i2c/devices/1-0050/eeprom bs=4
    oder mit Zufallszahlen beschreiben
    #dd if=/dev/random of=/sys/bus/i2c/devices/1-0050/eeprom bs=4
    und sich anzeigen lassen z.B. mit:
    hexdump -C eeprom | more

    kurzes Demo-Programm in C zur Verwendung des EEPROM für eigene Projekte:

    Das Programm ist sicherlich nicht schön ;), ohne jegliche Fehlerbehandlung etc., und soll nur das Prinzip verdeutlichen.

    Wer mag, kann das auch mit Python versuchen, lt. Internet gibt es für Python unter Linux z.B. auch die Funktionen os.preadv() und os.pwritev(). Mit Python kenne ich mich aber überhaupt nicht aus.:(

    :!:Wichtig:!:: bitte alles euren örtlichen Gegebenheiten anpassen, insbesondere den Typ des verwendeten EEPROM's, die i2c-Adresse, den verwendeten i2c-Bus und alle Pfade (u.a. /boot/config.txt  und /boot/overlays/ vs. /boot/firmware/config.txt und /boot/firmware/overlays

    einige Links zum Weiterlesen:

    Quelltext at24.c: https://github.com/raspberrypi/li…c/eeprom/at24.c

    DT Bindings für Linux z.B. hier: https://elixir.bootlin.com/linux/latest/s…eprom/at24.yaml

    Offizielle RasPi Dokumentation zu Overlays: https://www.raspberrypi.com/documentation/…tion.html#part2

    anderes Projekt mit dem AT24C256: https://lektiondestages.art.blog/2020/03/20/usi…evice-overlays/, ist aber evtl. nicht mehr top-aktuell.

    Fehlerkorrekturen und Ergänzungen zum How-To sind willkommen, allgemeine Anfragen bei Problemen bitte besser in einem eigenen Thema in einen entsprechende Unterforum stellen.

    Allen Foristen viel Spaß bei euren Projekten.

    Gruß Martin

  • I2C EEPROM's mit dem Raspberry am Beispiel Atmel AT24C32? Schau mal ob du hier fündig wirst!

  • Martin28 Motivation für Python war ja ursprünglich etwas zwischen C und Shell-Skript zu haben, und die Standardbibliothek hat deshalb viele ganz dünne Wrapper für eine Menge Posix-Funktionen, zum Beispiel im os-Modul. Aber auch im time-Modul. Jeweils mit den gleichen Namen wie die C-Funktion und so nahe wie möglich was die Argumente angeht. pwrite() muss man die Anzahl der Bytes nicht mitgeben, weil bytes-Objekte in Python ihre Länge kennen, pread() füllt keinen übergebenen Puffer und gibt die Anzahl der tatsächlich gelesenen Bytes zurück, sondern gibt ein bytes-Objekt zurück. Und ctime() kann man auch ohne Argument aufrufen, dann wird intern time() aufgerufen.

    Ungetestet:

    Sieht ja letztlich dem C-Programm ziemlich ähnlich. Es hat sogar Fehlerbehandlung ohne das man da viel für schreiben muss. Jeder Aufruf der C-Funktionen wird auf Fehler geprüft und falls einer Auftritt wird das Programm mit einer Ausnahme abgebrochen, die sagt wo der Fehler im Code auftrat und welcher das war. Durch das finally wird sogar vorher noch die Datei geschlossen.

    “Since, in the long run, every planetary society will be endangered by impacts from space, every surviving civilization is obliged to become spacefaring — not because of exploratory or romantic zeal, but for the most practical reason imaginable: staying alive.” — Carl Sagan, Pale Blue Dot

  • Hallo __blackjack__ ,

    hab dein Script mal getestet - funtioniert :)

    Die Ausgabe ist etwas anders (den unterschiedlichen Text hab ich gemacht). Aber egal. Jeder, der EEPROM's für sein Projekt nutzen möchte, muß das sowieso den entsprechenden Wünschen anpassen.

    Die Intention zur Erstellung dieses How-To's war ja eigentlich nur zu zeigen, daß ein Zugriff auf I2C EEPROM's unter Linux auf dem RasPi relativ einfach sein kann, wenn man die Möglichkeiten des Systems kennt und richtig nutzt.

    Gruß Martin

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!