AT24C256 serielles EEPROM mit dem Raspberry Pico lesen und schreiben

Ich war schon lange auf der Suche einer Möglichkeit, Daten zu sammeln und platzsparend speichern zu können, wollte jedoch auf den Einsatz von SD-Karten verzichten.

Serielles EEPROM

Im Rahmen eines anderen Projektes, bin ich auf serielle EEPROMS gestoßen für die ich aktuell mein Herz erwärmen kann - im speziellen das AT24C256.

Der Speicher ist zwar nicht sehr groß, eher lachhaft klein, bietet mir aber die Möglichkeit, den Speicher auf dem PCB mit zu verlöten und endlich mal mein Wissen im Bereich I2C aufzubauen, denn das EEPROM benötigt einen I2C Zugriff.

Demo-Code zum lesen und Schreiben mit dem Raspberry Pico

Der Code weist eine kleine Besonderheit auf, der Zugriff auf die 16Bit-Adresse muss in ein MSB und LSB aufgeteilt werden, da das Vollwort nicht funktioniert.

#--------------------------------------------------------------------
# Das Programm schreibt einen Wert in das AT24C256 EEPROM und liest
# ihn zur Kontrolle zurück.
#
# Autor: Oliver Lohse
# Datum: 06.06.2026
#--------------------------------------------------------------------
from machine import Pin, I2C
import time

i2c            = I2C(0, sda=Pin(0), scl=Pin(1), freq=100000)  # 100 kHz für Stabilität
EEPROM_ADDR    = 0x50  # I2C-Adresse des AT24C256
MEM_ADDR       = 0x0010   # Speicheradresse (16 Bit)
value_to_write = 33

#--------------------------------------------------------------------
# 16-Bit-Adresse in MSB und LSB aufteilen
# Schreibvorgang: [Device Address, MSB, LSB, Data]
#--------------------------------------------------------------------
def write_to_eeprom(i2c, addr, mem_addr, data):
    mem_addr_msb = (mem_addr >> 8) & 0xFF
    mem_addr_lsb = mem_addr & 0xFF
    i2c.writeto(addr, bytes([mem_addr_msb, mem_addr_lsb, data]))
    time.sleep_ms(50)  # Wartezeit für Schreibvorgang

#--------------------------------------------------------------------
# 16-Bit-Adresse in MSB und LSB aufteilen
# Lesevorgang: Zuerst Adresse senden, dann 1 Byte lesen
#--------------------------------------------------------------------
def read_from_eeprom(i2c, addr, mem_addr):
    mem_addr_msb = (mem_addr >> 8) & 0xFF
    mem_addr_lsb = mem_addr & 0xFF
    i2c.writeto(addr, bytes([mem_addr_msb, mem_addr_lsb]))
    return i2c.readfrom(addr, 1)[0]

# --- Test: Wert schreiben ---
write_to_eeprom(i2c, EEPROM_ADDR, MEM_ADDR, value_to_write)
print(f"Wert {value_to_write} an {hex(MEM_ADDR)} geschrieben.")

# --- Test: Wert aus Speicher lesen ---
read_value = read_from_eeprom(i2c, EEPROM_ADDR, MEM_ADDR)
print(f"Gelesener Wert (Dezimal): {read_value}")
print(f"Gelesener Wert (Binär)..: {read_value:08b}")
print(f"Gelesener Wert (Hex)....: {read_value:02x}")