EEPROM 24C32A

Statt den internen EEPROM beim Arduino zu verwenden, können auch externe EEPROM-Module angeschlossen werden, wenn mehr Speicherkapazität notwendig ist. Einer Möglichkeit ist der 24C32A EEPROM von Atmel:

Atmel 24C32A EEPROM

Spezifikationen laut Hersteller

Dieser Chip bietet 32768 Bits (=4096 Bytes) EEPROM-Speicher (engl. Abk. für electrically erasable programmable read-only memory). Es können bis zu 8 dieser ICs hintereinander denselben I²C-Bus teilen.

Spannungsversorgung: 1,8V bis 5,5V
Max. Stromaufnahme: 2mA
Speichergröße: 32 kBit (8×4k)
Schnittstelle Serial, 2-Wire, I²C
Max. Taktfrequenz: 400 kHz
Betriebstemperatur: -55°C bis +125°C

Verwendete Bauteile

Anschlüsse

Anschlüsse/Pinout des Atmel 24C32A EEPROM
24C32A Funktion Arduino Uno
A0 - A2 Adressen-Konfiguration: Über diese Eingänge kann die I²C-Adresse des Chip ausgewählt werden. Wird nur ein Chip benutzt, so bleiben die Pins unbelegt oder können auch zu GND angeschlossen werden. Werden mehrere Chips über denselben I²C-Bus betrieben, so kann die Adresse anhand der Pin-Belegung der Bits ausgewählt werden, wie das folgende Bild zeigt:
Auswahl der I²C-Adresse beim 24C32A EEPROM
-
GND Ground/Masse GND
VCC Spannungsversorgung 5V
WP "Write Protect":
Schreibschutz aktiv: HIGH (VCC)
Schreibschutz inaktiv: LOW (GND)
GND
SCL Serial Clock Input A5
SDA Serial Data A4

Lese- & Schreibtest I.

Für diesen Test wird nur die Wire-Library verwendet, die vermutlich schon in der Arduino-IDE vorinstalliert ist.
In dem Test-Sketch wird eine Speicherstelle des EEPROMs zunächst mit Daten beschrieben, dann wieder ausgelesen und auf der seriellen Konsole ausgegeben.
Hinweis: Die I²C-Kommunikation benötigt an manchen Stellen ein kurzes Delay, damit sie richtig funktioniert.

#include <Wire.h>

#define EEPROM_ADDRESS B1010000

void setup()
{
   Serial.begin(9600);
   Wire.begin();

   uint16_t curReg  =  0;
   uint8_t  memData = 56;

   Serial.print("Writing to EEPROM...");
   writeEeprom(curReg, memData);
   Serial.println("[ok]");

   delay(5);

   Serial.print("Reading data from reg:");
   Serial.print(curReg);
   Serial.print(" data:");
   Serial.println(readEeprom(curReg));
}

void loop() {}

void dumpEeprom()
{
   for (int i = 0; i < 4096; i++) {
      Serial.println(String(i) + ": " + String(readEeprom(i)));
   }
}

void clearEeprom()
{
   for (int i = 0; i < 4096; i++) {
      writeEeprom(i, 0);
      delay(5);
   }
}

void writeEeprom(uint16_t memReg, uint8_t memData)
{
   Wire.beginTransmission(EEPROM_ADDRESS);
   // need to send the MSB(Most significant bits) first, so shift address to the right eight bits.
   Wire.write(memReg >> 8);
   Wire.write(memReg & 0xFF);
   Wire.write(memData);
   Wire.endTransmission();
}

uint8_t readEeprom(uint16_t memReg)
{
   Wire.beginTransmission(EEPROM_ADDRESS);
   Wire.write(memReg >> 8);
   Wire.write(memReg & 0xFF);
   Wire.endTransmission();

   delay(5);

   Wire.requestFrom(EEPROM_ADDRESS, 1);
   uint8_t inData = 0;
   while (Wire.available()) {
      inData = Wire.read();
   }

   return inData;
}

Lese- & Schreibtest II.

Für den zweiten Test wir die Library LinnesLab/EEPROM_24C64A verwendet.

#include <EEPROM_24C64A.h>

const uint8_t eepromAddress = B1010000;
EEPROM_24C64A myMem = EEPROM_24C64A(eepromAddress);

void setup()
{
   Wire.begin();
   Serial.begin(9600);

   myMem.write(0, 56);
   Serial.println(myMem.read(0));

   delay(5);

   myMem.write(1, 23);
   Serial.println(myMem.read(1));
}

void loop() {}
zurück