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:
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 |
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: | - |
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 |
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;
}
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