Daten Speichern und Lesen auf 24LC32

Hallo zusammen,

ich Versuche Daten in einem 24LC32 zu speichern, welcher auf einer Lawine von einem DS3231 sitzt. Der i2C Bus funktioniert und ich kann auch Daten schreiben und lesen.
ich muß 2x12 Buchstaben (z.B. ICEFILAMENTS) speichern. Ich denke mein Fehler ist in der Adressierung aber ich habe bisher noch keine Info darüber gefunden warum oder wo der Fehler liegt.
Ich schreibe mit der unten aufgeführten Routine. Die "Wörter" sollen direkt hintereinander geschrieben sein, da sie immer 12 Zeichen haben werden, kürzere Fülle ich mit Zeichen auf. Daher hatte ich einfach gedacht, ich rufe die Rroutine einfach 2x auf.
Für das erste Wort klapp das wunderbar, das zweite aber erhalte ich beim Rücklesen "ICEFIL????". Kann jemand einen Fehler sehen, Ober habe ich etwas nicht richtig verstanden, befürchte mal, wenn dann liegt das an der Writepage oder readpage Funktion die ich mir falsch übersetzt habe.

Vorgehen ist wie folgt:

void i2c_eeprom_write_page( unsigned int eeaddresspage, byte* data, byte length ) {
  Wire.beginTransmission(deviceaddress_24LC32);
  Wire.write((int)(eeaddresspage >> 8)); // MSB
  Wire.write((int)(eeaddresspage & 0xFF)); // LSB
  byte c;
  for ( c = 0; c < length; c++)
    Wire.write(data[c]);
  Wire.endTransmission();
}

void i2c_eeprom_write_page( unsigned int eeaddresspage, byte* data, byte length ) {
  Wire.beginTransmission(deviceaddress_24LC32);
  Wire.write((int)(eeaddresspage >> 8)); // MSB
  Wire.write((int)(eeaddresspage & 0xFF)); // LSB
  byte c;
  for ( c = 0; c < length; c++)
    Wire.write(data[c]);
  Wire.endTransmission();
}

Der Aufruf zum Schreiben erfolgt über:

char somedata[] = "ICEFILAMENTS";
i2c_eeprom_write_page (100, (byte *)somedata, sizeof(somedata));
delay(20);
i2c_eeprom_write_page (112, (byte *)somedata, sizeof(somedata));

Der Aufruf zum Lesen erfolgt über:

i2c_eeprom_read_buffer(100, RueckgabewertHersteller1,12);
delay(200);
i2c_eeprom_read_buffer(112, RueckgabewertHersteller2,12);

Wie gesagt beherbergt danach RueckgabewertHersteller1 den Korrekten Namen, RueckgabewertHersteller2 ISOFIL????

Da es funktioniert, wenn ich den zweiten Hersteller mit den obern aufgeführten Routinen bei 200 schreiben lasse, also erster bei 100 und der zweite dann bei 200, denke ich ich habe bei der Adressierung etwas nicht verstanden in den englischen Anleitungen / Beschreibungen.

Danke schon mal für alle Infos

Steve

< OT >

Das sieht sicher lustig aus. :grinning:

< /OT >

Mist blöde Autokorrektur Platine natürlich :man_facepalming:

Dachte ich mir schon, war aber dennoch lustig.

Mit dem EEPROM hab ich schon mal gespielt, kann mich aber an keine Schwierigkeiten erinnern.
Immerhin hab ich ein paar von den Dingern da.

Muss man bei write_page nicht immer eine ganze Seite schreiben?
Und danach pollen, ob man wieder schreiben darf, bevor man das tut?

Ist aber alles ein wenig diffus in meinem Gedächtnis.

Ok wenn das so wäre müsste ich ja mit Write_Byte theoretisch hintereinander schreiben können und es müsste alles zurück kommen richtig? Probier ich, soweit hatte ich nicht gedacht :sweat_smile:

Kann es evtl. sein, dass der EEPROM von deinem "Hersteller2" nicht beliebig über 16-byte Grenzen (Page) beschrieben werden kann?

Hersteller2 ist nur eine Dummy-Variable. ich schreibe auf dem gleichen EEPROM

Kann sein, dass man vor jedem Schreiben checken muss, ob der eventuelle vorangegangene
Schreibzugriff fertig ist, das müsste aber im Datenblatt klar beschrieben sein.

Das glaube ich nicht, weil wie gesagt wenn eich einmal auf Adresse 100 und einmal auf Adresse 200 schreibe dann geht es problemlos. Obwohl ich zwischendurch nicht lese, ob es wirklich geschrieben ist, sondern erst wenn beide "geschrieben" wurden

Die Adressen liegen auf unterschiedlichen Seiten, das kann schon den Unterschied machen.

Die Programmierung dauert etwas, das wird aber vom Chip intern gehandhabt.
Du müsstest doch der Spezialist des Datenblatts sein, wenn du da aktuell oft reingeschaut hast.

Sowas in der Richtung war auch meine Vermutung.
Dass die Kombi 100 / 112 unter gewissen Bedingungen ginge, habe ich durch flüchtiges Lesen falsch interpretiert, sorry.

Wie schon geschrieben habe ich die Anleitung nicht 100% verstanden, da ich sie leider nur auf English gefunden habe.
Ich hatte es so verstanden, dass eine Page vereinfacht nur eine Anweisung ist, um eine bestimmte Anzahl von Zeichen direkt schrieben zu können. Und zwar an jeder Stelle. Oder ist hier mein Denkfehler?

Da gibt es auch Wrap-Effekte, wenn man über die Seitengrenze hinauszuschreiben versucht.

Wenn ich mich recht erinnere, funktioniert das am besten, wenn man die ganze Seite,
beginnend mit ihrer ersten Adresse, beschreibt.

Google-translate geht auf deinem Handy nicht?

doch aber genau in diesem Bereich kommt da nur Kuddelmuddel Muddel raus

Die Interessante Zeile aus der Doku ist ja diese:

PAGE WRITE: The 32K/64K EEPROM is capable of 32-byte page writes

Das hatte ich mir so übersetzt, das wie geschrieben ich mit derm Command maximal 32 Byte auf einmal schreiben kann, aber nirgendwo finde ich etwas das es nur in bestimmten Bereich geht,

Für mich heißt das, dass

Also alle 32 Bytes am Stück, immer auf Adressen die mod 32 0 sind.

Ok also doch falsch Versstanden. Würd also bedeuten:

Wenn ich das verwende muß ich z.B. bei 32 anfangen und könnte die nächste bei 65 beginnen?

65 mod 32 = 1

0, 32, 64, 96, ...

64 richtig Zählung beginnt ja an der Stelle

aber wenn ich bytes schreibe und lese müsste das ja egal sein richtig?

Ja, dennoch kann man schneller schreiben (glaube ich), als der Chip das einprogrammieren kann.

Kann sein, dass die Seiten da unabhängig sind.