Raspberry Pico EEprom 24C - Home of Manuel Magninch

Direkt zum Seiteninhalt

Hauptmenü:

Raspberry Pico EEprom 24C

Controller
E P R O M - I 2 C - 2 4 L C 0 X - nicht flüchtiger Speicher, mit Raspberry PICO

Wer ein Python Programm auf dem Raspberry PICO schreibt möchte oft die Betriebszustände speichern, um diese nach einem Restart oder Stromunterbruch wieder bereit zu haben.  Der Raspberry PICO und der ESP32 haben zwar ein internes Flash, das jedoch nur für die Scripts vorgesehen ist. A bieten sich die EEProms der 24er Reihe mit I2C Schnittstelle gerade zu an. 

Ziel: EEPROM zum speichern von Daten die nach einem Geräteneustart noch verfügbar sein sollen Speichern von Zeichenketten, inkl. Binärdaten in Zeichenketten
Beschaltung:
# 24CXX-Pin-8 (VCC) **3.3V** <-> Raspberry-PICO-Pin-36
# 24CXX-Pin-4 (GND) **GND** <-> Raspberry-PICO-Pin-38
# 24CXX-Pin-5 (SDA) **I2C** <-> Raspberry-PICO-Pin-02 **GP01
# 24CXX-Pin-5 (SDA) **I2C** <-> Widerstand 4.7kR -> +3.3V
# 24CXX-Pin-6 (SCL) **I2C** <-> Raspberry-PICO-Pin-01 **GP00
# 24CXX-Pin-6 (SCL) **I2C** <-> Widerstand 4.7kR -> +3.3V
# 24CXX-Pin-1 (A-0) **A-0** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-2 (A-1) **A-1** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-3 (A-2) **A-2** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-7 (WP) **WP** <-> 24CXX-Pin-4 **GND**
# INFO: Die beiden Widerstände vom I2C sind bei kurzen Leitungen nicht zwingend

24C01  /  24LC01    - DIL08 - 1kBit - 128Bytes
24C02  /  24LC02    - DIL08 - 2kBit - 256Bytes
24C04  /  24LC04    - DIL08 - 4kBit - 512Bytes
24C08  /  24LC08    - DIL08 - 8kBit - 1024Bytes
Daten schreiben: 5mSek.  (lesen: 5mSek.)
Schreibzyklen: mid. 4 Mio. gesamthaft
I2C: 24XX Bus-Speed 100kHz oder 400kHz
#####################################################################
#
# E P R O M - I 2 C - 2 4 L C 0 X - nicht flüchtiger Speicher
#
# Hardware: EEPROM 24LC0X, 24C0X, 240X, usw...
#
# Betriebssp: RaspBerry PICO: +5.0V USB, IR Sensor +3.3V
# Version: V0.00 04.12.2022 /MM
# Change: 04.12.2022 Erstellung Grundprogramm
#
# Funktion: EEPROM zum speichern von Daten die nach einem
# Geräteneustart noch verfügbar sein sollen
# Speichern von Zeichenketten, inkl. Binärdaten in Zeichenketten
#
# Beschaltung: 24CXX-Pin-8 (VCC) **3.3V** <-> Raspberry-PICO-Pin-36 **3.3V**
# 24CXX-Pin-4 (GND) **GND** <-> Raspberry-PICO-Pin-38 **GND**
# 24CXX-Pin-5 (SDA) **I2C** <-> Raspberry-PICO-Pin-02 **GP01**
# 24CXX-Pin-5 (SDA) **I2C** <-> Widerstand 4.7kR -> +3.3V
# 24CXX-Pin-6 (SCL) **I2C** <-> Raspberry-PICO-Pin-01 **GP00**
# 24CXX-Pin-6 (SCL) **I2C** <-> Widerstand 4.7kR -> +3.3V
# 24CXX-Pin-1 (A-0) **A-0** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-2 (A-1) **A-1** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-3 (A-2) **A-2** <-> 24CXX-Pin-4 **GND**
# 24CXX-Pin-7 (WP) **WP** <-> 24CXX-Pin-4 **GND**
# INFO: Die beiden Widerstände vom I2C sind bei kurzen Leitungen nicht zwingend
#
# EEPROMs: 24C01 - DIL08 - 1kBit - 128Bytes
# 24C02 - DIL08 - 2kBit - 256Bytes
# 24C04 - DIL08 - 4kBit - 512Bytes
# 24C08 - DIL08 - 8kBit - 1024Bytes
# Schreiben: 5mSek.
# Lesen: 5mSek.
# Schreibzyklen: mid. 4 Mio.
#
# I2C: 24CXX Bus-Speed 100kHz / 400kHz,
#
#
#



from machine import Pin # importing classes
from time import sleep # Import sleep from time class
import time # importing classes
import utime

Version = "V0.00" # Software Version

OnBoardLED = machine.Pin(25, machine.Pin.OUT)
OnBoardLED.toggle() # LED OnBord Toggle - Init Blink
sleep(0.1) # Delay Init Blink
OnBoardLED.toggle() # LED OnBord Toggle - Init Blink
sleep(0.1)

def eepromstrwrite(adr,stwrite): # Write String to Eprom
    global I2C_EEPROM_Addr
    i=0
    bstwrite = bytearray(len(stwrite)) # Byte Array mit der String grösse erstellen
    #bstwrite = bytearray(stwrite) # in ByteArray umwandeln, keine Binärdaten
    while i<len(stwrite):
        bstwrite[i] = ord(stwrite[i:i+1])
        i=i+1
    i2c.writeto_mem(I2C_EEPROM_Addr, adr, bstwrite) # Write ByteArray to EEPROM
    sleep(0.005) # 5mSek, Pause nach Zugriff
#EndDef

def eepromstrread(adr,size): # Read String from Eprom
    global I2C_EEPROM_Addr
    i=0
    stread = ""
    bbytearray=i2c.readfrom_mem(I2C_EEPROM_Addr, adr, size ) # 8-Bit Data frame, Werte lesen
    # Konvertieren ByteArray zu String # Python konveriert keine Binär Daten x=str(bbytearray,'UTF-8')
    while i<len(bbytearray):
        stread = stread + chr(bbytearray[i]) # Zeichen an String anfügen
        i=i+1
    sleep(0.005) # 5mSek, Pause nach Zugriff
    return(stread)
#EndDef



# ****** MAIN PROGRAMM ******

print("EEprom 24C1X Demo zum schreiben und lesen von Daten")
print("")

# Initialize I2C with pins SDA=GP0 (Pico-Pin1), SDL=GP1 (Pico-Pin2) :: LCD VCC=+5V SDA/SDL 3.3V Logic
i2c=machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=100000)

# Scan I2C BUS to Display correct wired I2C devices
devices = i2c.scan()
print('I2C Device found at Address: ',end="")
for d in devices:
    print(hex(d)+" ",end="")
print("")
print("")
sleep(0.1) # Nach dem Scann brauchts eine Pause
I2C_EEPROM_Addr = 0x50 # Must bee one of the scanned I2C Adresses!
I2C_EEPROM_Addr = d # letzte gescanntes I2C Adresse verwenden

# Daten ins EEprom Schreiben
stwrite = "Hallo Welt" # Zeichenkette zum speichern
print("Zeichenkette schreiben !"+stwrite+"! plus Binär Wert=222 ein Byte")
stwrite = stwrite + chr(222) # Einen Binär Wert anhängen
eepromstrwrite(0,stwrite)

# Daten aus EEprom lesen
print("Zeichenkette lesen 10 Zeichen plus Binär Wert 1 Byte")
stread = eepromstrread(0,11)
print("**"+stread[0:10]+"** **"+str(ord(stread[10:11]))+"**")


 
Zurück zum Seiteninhalt | Zurück zum Hauptmenü