Arduino Mikrocontroller Tutorials - Module

I2C EEPROM (Bsp. 74LC01B)

I2C EEPROM

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 }