Library für EEPROM AT25C32?

Einen schönen Abend,
ich such' mir hier nen Wolf und finde nichts. Hat jemand eine Library für das EEPROM AT24C32. (2-Wire, 32K). Wird in einigen RTC DS 3231 mit dazuverbaut. Alle von mir gefundenen Libraries der RTC's sprechen diesen Speicher nicht an.

Gruß
Eberhard

Wire.h

Was denn nun, einen 24C32 oder einen 25C32?
Letzteren gibt es nämlich auch :smiley:
Ist ein EEPROM mit SPI Schnittstelle.

Gruß Gerald

25 ist ein Schreibfehler - richtig 24. Mit SPI-Bus.
Gruß
E.

? :astonished: ? der 25'er hat SPI, der 24'er, den du meinst, hat I2C

So, jetzt mal ganz langsam von vorne. Mea Culpa.

Das Ding heißt 24C32 und hat einen I2C-Bus mit den typischen Beinchen SDA und SCL. Default Adresse ist 0x57.

Sorry, dass ich für Verwirrung gesorgt habe.

Gruß
Eberhard

Da braucht man keine Lib.

Schreiben:
1.) Wire.beginTransmission(deviceAddress)
2.) Wire.write(startRegisterHigh)
Wire.write(startRegisterLow)
3.) Wire.write(daten)
4.) Wire.endTransmission()

Punkt 3 man man dann beliebig wiederholen, z.B. ein Array in das EEPROM schreiben

Lesen:
1.) Wire.beginTransmission(deviceAddress)
2.) Wire.write(startRegisterHigh)
Wire.write(startRegisterLow)
3.) Wire.endTransmission()
4.) Wire.requestFrom(deviceAddress, numberOfBytes)
5.) Wire.read()

Punkt 5 dann nach Bedarf wiederholen

Überprüfe die Sequenzen nochmal im Datenblatt, da ich es nur grob überflogen habe, aber das sind die Grundzüge. Ob es 100%ig so geht kann ich nicht sagen.

Die Datenblätter zu I2C Devices sehen immer so furchtbar aus mit den ganzen Start/Stop Conditions und ACK/NACK, aber das macht alles Wire.h. Generell ist Start = beginTransmission() und Stop = endTransmission()

EDIT:
Das hier sollte funktionieren:
http://playground.arduino.cc/Code/I2CEEPROM

Ich lag also richtig :slight_smile:

Serenifly:
Da braucht man keine Lib.

Schreiben:
1.) Wire.beginTransmission(controlByte)
2.) Wire.write(startRegisterHigh)
Wire.write(startRegisterLow)
3.) Wire.write(daten)
4.) Wire.endTransmission()

Punkt 3 man man dann beliebig wiederholen, z.B. ein Array in das EEPROM schreiben

Nicht ganz
Das EEprom ist in Pages zu 32 Byte unterteilt. Pages Write kann nur innerhalb dieser Pages erfolgen. Die Adresse wird nach dem ersten Schreibzugriff erhöht aber immer nur die untersten 5 Bit der am Angfang übertragenen Speicheradresse. Wenn man nicht am Pagesanfang anfängt zu schreiben werden die überzähligen Bytes (die die über die Pageadresse hinausgehen) an den Anfang der Page geschrieben.
Praktisches Beispiel:
Die Pages gehen: 0-31, 32-63, 64-95, 96-127 ecc
Wenn ich nun bei 48 beginne kann ich bis 63 schreiben also 16 Byte. Das 17. Byte kommt dann aber nicht auf 64 sondern in 32 ecc.
Bei einem Pagewrite wird nicht jedes Byte einzeln ins EEprom geschrieben sondern am Ende des Pagewrite. Somit kann man bis zu 32 Byte in einem Rutsch und mit nur einer Programmierwartezeit speichern.

http://www.atmel.com/images/doc0336.pdf:
PAGE WRITE:
The 32K/64K EEPROM is capable of 32-byte page writes.
A page write is initiated the same way as a byte write, but the microcontroller does not
send a stop condition after the first data word is clocked in. Instead, after the EEPROM
acknowledges receipt of the first data word, the microcontroller can transmit up to 31
more data words. The EEPROM will respond with a zero after each data word received.
The microcontroller must terminate the page write sequence with a stop condition (refer
to Figure 3).
The data word address lower 5 bits are internally incremented following the receipt of
each data word. The higher data word address bits are not incremented, retaining the
memory page row location. When the word address, internally generated, reaches the
page boundary, the following byte is placed at the beginning of the same page. If more
than 32 data words are transmitted to the EEPROM, the data word address will “roll
over” and previous data will be overwritten.

Grüße Uwe

Ich liebe dieses Forum. Ich erkenne immer wieder, frei nach Sokrates: "Ich weiß, dass ich nichts weiß!"

Das Geschriebene zu verdauen und umzusetzen, sprich auszuprobieren dauert jetzt. Auf jeden Fall allen Beteiligten meinen besten Dank!!

EDIT:
Das hier sollte funktionieren:
Arduino Playground - HomePage

Ich ärgere mich immer wieder über mich selbst und stelle mir die Frage:WARUM HAB' ICH DAS NICHT GEFUNDEN???? :astonished:

Schönen Abend
Eberhard

Du musst allerdings Wire.send() mit Wire.write() ersetzen. Aber die IDE spuckt das sogar aus :o

"sketch_nov07a:9: error: 'class TwoWire' has no member named 'send'

Seit Arduino 1.0 wurde die Funktion Wire.send() wegen der Übereinstimmung mit anderen Librarys zu Wire.write() umbenannt."

Das hatte ich schon bei der Library der RTC gemerkt. Da kamen erst einmal paar Seiten Fehlermeldungen. Dann musste nicht nur send() in write() sondern auch request() auch in read() geändert werden.

Trotzdem: Danke für den Hinweis. Wahrscheinlich wäre ich dennoch darüber gestolpert.
Gruß Eberhard