EEProm des UNO über iic an Raspberry

Hallo,
ich möchte das gesamte EEPROM des UNO über iic durch einen
Rapberry als Master auslesen.
Kann mir da jemand weiterhelfen?

Schaue Dir mal die EEPROM Library und die Wire Library an.

Achtung: Der Puffer für I2C beträgt 32 Byte in der Voreinstellung. Du kannst also nur 32 Byte am Stück übertragen. Das wird gern übersehen.

Gruß Tommy

agmue:
Schaue Dir mal die EEPROM Library und die Wire Library an.

Also,
die Kommunikation kann ich schon.
Aber wir bekomme ich 1024 Bytes zum Raspberry?
Ich schaffe max 32 Byte in einen Rutsch.

In Pakete/Frames aufteilen. Das ist doch kein Problem. 32 * 32 = 1024. Der Master kann dann das nächste Paket anfordern wenn eines eingelesen wurde.

Merken, wie weit Du gekommen bist und dann die nächsten 32 Byte.

Andere Variante: Du gibst bei der Anforderung die Anfangsadresse des 32 Byte-Blocks, den Du haben willst, mit zum UNO und er sendet Dir ab dort 32 Byte.
Das wäre noch flexibler.

Gruß Tommy

Edit: Das kannst Du dann noch mit Resultatbyte (ok oder Error) und Prüfsumme nach belieben ausbauen.

Hat es einen bestimmten Grund, warum Du den EEPROM des UNO nehmen willst (begrenzte Schreibanzahl) und keinen FRAM benutzt?

OK Danke

Hallo hier die Lösung.

Python am Raspberry

# -*- coding: utf-8 -*-
import time
from smbus2 import SMBusWrapper

address = 0x04
with SMBusWrapper(1) as bus:
    try:
        vEEProm = [0]
        X = 0xA0
        while X < 0xC0:
            block1 = bus.read_i2c_block_data(address, X, 32)
            print("EEPROM von Arduino ", X, "-", block1)
            X += 1
            vEEProm.extend(block1)
    except:
        print("Lesefehler EEProm")
    X=vEEProm.pop(0)
    print("Alles", vEEProm)

Sketchausschnitt:

void receiveData(int howMany) {
  int vCnd = 0;  
  uint8_t c = 0;  
  uint8_t vTem[7] = {0,0,0,0,0,0,0};      //Empfangspuffer für Befehl F2
  boolean vF2 = false;                    //Flage für (Slave auf Datenempfang) löschen
  while (Wire.available()) {              //Schleife bis Empfangspuffer leer ist
    c = Wire.read();                      //Wert aus Empfangspuffer lesen
    if(vF2 == true){                      //wurde der Befehl F2 (Slave auf Datenempfang) empfangen
      uint8_t vXOR=0; 
      switch(vCnd){                       //verteilt die empfangenen Werte
        case 0:
          vTem[0]=c;                      //Jahr
          break;
        case 1:
          vTem[1]=c;                      //Monat
          break;
        case 2:
          vTem[2]=c;                      //Tag
          break;
        case 3:
          vTem[3]=c;                      //Stunde
          break;
        case 4:
          vTem[4]=c;                      //Minute
          break;
        case 5:
          vTem[5]=c;                      //Sekunde
          break;
        case 6:
          vTem[6]=c;                      //Prüfziffer
          for(byte x=0;x<=5;x++){         //Prüfzahl berechnen
            vXOR = vXOR^vTem[x];
          }
          if(vXOR==vTem[6]){              //Prüfzahlen vergleichen
            for(byte x=0;x<=5;x++){       //wenn OK - übertragen
              vZeit[x]=vTem[x];
            }
          }
          else{
            Serial.println("Prüfzahlfehler");
          }
          vF2 = false;
          break;
      }
      vCnd++;                             //Empfangszähler
    }
    if(c == 0xF2){                        //prüft auf Befehle F2
      vF2 = true;                         //Befehlsflage setzen
    }
  }
  switch(c) {
    case 0xF1:                              //prüft auf Befehle F1 = Befehl für "Slave sendet Daten"  
      vData[0] = vTempByte0;                //Daten zum senden vorbetreiten    
      vData[1] = vTempByte1;
      vData[2] = vIRAbstandByte;
      vData[4] = vFehler;
      break;
    case 0xF3:                              //EEPROM löschen
      vEEPromInit=true;
      Serial.println("Befehl F3");
      break;
    case 0xA0 ... 0xBF:
      vEEPromRead = (c-0xA0)*32;
      break;
    default:
    break;
  }
}

void sendData(){ 
  if(vEEPromRead != 1024){
    for(int i = 0;i <= 31;i++){
      vEEPart[i] = vEEPROM[vEEPromRead + i];
    }
    Wire.write(vEEPart,32);
    vEEPromRead=1024;
  }
  else{
    Wire.write(vData,8);
  }
}

Danke für die Rückmeldung, finde ich nett :slight_smile: