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