I2C EEPROM (Bsp. 74LC01B)
Auf das EEPROM kann über eine I2C Schnittstelle zugegriffen werden. Der IC kann 128 Bytes speichern (128 x 8-bit memory = 1024 bit = 1k). Auch nach dem Spannungsversorgung unterbrochen wurde.
Die I2C Adresse mit 0x50 ist fest vorgegeben. Die Datenübertragung per I2C erfolgt mit 400 kHz.
Die 128 Speicherplätze werden mit 0-127 adressiert. Die Speicherung kann Byteweise (word), oder je 8 Bytes hintereinander (page) erfolgen.
Info: SDA Leitung benötigt lt. Datenblatt einen 2k Pull-up Widerstand.
Pinbelegung
| Pin | Funktion |
|---|---|
| VCC | Spannungsversorgung +5V |
| VSS | GND bzw. Masse - |
| WP | Write Protect (GND für read/write, VCC nur read) |
| SDA, SCL | I2C Interface |
| A0, A1, A2 | not connected |
Programmcode
Das nachfolgende Programm zeigt je ein Beispiel für das "wordweise" (byteweise) speichern, als auch für das "pageweise" (8 nachfolgende Byte). Auch für das Auslesen des EEPROM findet sich je ein Beispiel.
Programm
#include
void setup() {
Wire.begin();
Wire.setClock(400000); // I2C Übertragungsrate auf 400kHz stellen
Serial.begin(115200);
}
void loop() {
// Schreiben von einem Byte in eine beliebige Adresse (einem Word)
Wire.beginTransmission(0x50); // sendet das Control Byte mit der I2C EEPROM Adresse und einem Write Bit als LSB
Wire.write(0); // (Word-)Adresse die in den Adresspointer des EEPROM geschrieben wird (0-127)
Wire.write(125); // Datenbyte welches in die 'word adress' geschrieben wird
Wire.endTransmission(); // beendet die Übertragung mit dem Stop-Bit
delay(5); // maximale Dauer für das interne Verarbeiten lt. Datenblatt
// Beliebige Adresse auslesen
Wire.beginTransmission(0x50); // sendet das Control Byte mit der I2C EEPROM Adresse und einem Write Bit als LSB
Wire.write(0); // (Word-)Adresse die in den Adresspointer des EEPROM geschrieben wird (0-127)
Wire.endTransmission(); // beendet die Übertragung mit dem Stop-Bit
Wire.requestFrom(0x50, 1); // 1 Byte wird von der Slave Adresse 0x50 angefordert danach Stop-Bit
Serial.println("Inhalt einer Adresszelle: " + String(Wire.read()));
// Schreiben von bis zu 8 Bytes gleichzeitig (einer Page)
/* Das EEPROM hat intern 8 Buffer die zusammen als Page bezeichnet werden. In diese Buffer können bis zu 8 Bytes hintereinander geschrieben werden. Am Ende werden alle Buffer gleichzeitig ins EEPROM geladen. Beim schreiben von mehr als 8 Bytes in die Buffer werden diese überrollt. Es ist nicht möglich über Page-Grenzen hinaus zu schreiben. Die Startadressen für das Pageweise einlesen sind immer die höherwertigen 5 Adressbits. A2-A0 sind dann die 8 Page Bytes.*/
Wire.beginTransmission(0x50); // sendet das Control Byte mit der I2C EEPROM Adresse und einem Write Bit als LSB
Wire.write(0b011111000); // (Page-)Adresse n*8 bis max 120 (16 Pages a 8 Byte = 128)
Wire.write(5); // Datenbyte welches in Buffer 0 geschrieben wird
Wire.write(10); // Datenbyte welches in Buffer 1 geschrieben wird
Wire.write(15); // Datenbyte welches in Buffer 2 geschrieben wird
Wire.write(20); // Datenbyte welches in Buffer 3 geschrieben wird
Wire.write(25); // Datenbyte welches in Buffer 4 geschrieben wird
Wire.write(30); // Datenbyte welches in Buffer 5 geschrieben wird
Wire.write(35); // Datenbyte welches in Buffer 6 geschrieben wird
Wire.write(40); // Datenbyte welches in Buffer 7 geschrieben wird
Wire.endTransmission(); // beendet die Übertragung mit dem Stop-Bit
delay(5);
// Auslesen von hintereinanderliegenden Zellen beliebiger Anzahl
/* Der Eingangs-Buffer der I2C Schnittstelle des Arduino kann nur max 32 Bytes buffern. Daher kann nicht ohne weiteres der ganze EEPROM ausgelesen werden. Die Auto-Inkrementierung des Adresspointer erfolgt im EEPROM automatisch.*/
Wire.beginTransmission(0x50); // sendet das Control Byte mit der I2C EEPROM Adresse und einem Write Bit als LSB
Wire.write(96); // Erste Adresse wird in den Pointer geschrieben.
Wire.endTransmission(); // beendet die Übertragung mit dem Stop-Bit
Wire.requestFrom(0x50, 32); // Alle Speicherzellen (128 Bytes) werden von der Slave Adresse 0x50 angefordert
Serial.println("Hintereinander ausgelesener Speicherzellen ...");
while (Wire.available()) {
byte b = Wire.read();
Serial.println(b);
}
while (1); // Loop Schleife soll in diesem Beispiel nur einmal ausgeführt werden
}