/I2C_EEPROM

Supports a wide range I2C eeproms

Primary LanguageC++

<title>I2C EEProm </title>

Eine recht universelle I2C EEProm Library

Version 0.3 vom 06.01.2016 12:52:30

Einsetzbar mit der Arduino IDE. Die Lib basiert auf Wire.


Download

I2C EEProm Library für Arduino, evtl. in einer neueren Fassung
Dieses Dokument, evtl. in einer neueren Fassung

Features

  1. Größtenteils aufrufkompatibel mit der Arduino EEPROM Lib
  2. Unterstützung vieler I2C EEProms
  3. Relativ einfache Erstellung von User definierten EEProms
  4. Geringer RAM Verbrauch

Unterstützte EEProms

Hinzufügen weiterer EEProms ist jederzeit möglich.
Atmel
Classname Size Page Size Adressmode
AT24C01 128 8 1
AT24C02 256 8 1
AT24C04 512 16 1
AT24C08 1024 16 1
AT24C16 2048 16 1
AT24C32 4096 32 2
AT24C64 8192 64 2
AT24C128 16384 64 2
AT24C256 32768 64 2
AT24C512 65536 128 2

STMicroelectronics
Classname Size Page Size Adressmode
M24C01 128 16 1
ST24C01 128 8 1
M24C02 256 16 1
ST24C02 256 8 1
M24C04 512 16 1
ST24C04 512 8 1
M24C08 1024 16 1
ST24C08 1024 16 1
M24C16 2048 16 1
M24C32 4096 32 2
M24C64 8192 32 2
M24128 16384 64 2
M24256 32768 64 2
M24512 65536 64 2

Microchip
Classname Size Page Size Adressmode
MC24C01C 128 16 1
MC24AA02E48 256 8 1
MC24AA025E48 256 16 1

Grund zur Erstellung

Für eine Menueführung wollten viele Strings verwaltet werden. Selbst das F() Macro war nur bedingt hilfreich, es wurde knapp mit dem Flash Speicher. Das im AVR eingebaute EEPROM hat am Anfang Linderung gebracht, aber mit zunehmender Größe des Projektes reichte es auch nicht mehr. Und sowieso sind die EEProms des AVR eher klein.

Abhilfe versprach das sowieso schon auf der verwendeten RTC verbaute Atmel AT24C32 I2C EEProm. Bei der Suche nach brauchbaren Libs ist mir einiges Gutes unter gekommen. Aber auch viele gruselige Dinge. Was aber allen gemeinsam war, sie decken nur wenige Typen ab. Und jede Lib hat ihre eigenen Methoden, welche wenig Ähnlichkeiten mit den Methoden der original Arduino EEProm Lib haben.

Installation

Diese Library liegt als Zip Datei vor. Im Library Manager der Arduino IDE, die Zip Datei auswählen und installieren.
Hauptmenu -> Sketch -> Include Library -> Add .ZIP Library

Abhängigkeiten

Diese Lib basiert auf Wire. In der setup() Funktion muss ein Wire.begin() gemacht werden. Die verwendeten EEProms müssen das "ACKNOWLEDGE POLLING" beherrschen.

Hier die status.ino aus den examples/Beispielen der Library

#include <Wire.h>
#include <I2C_EEPROM.h>

AT24C32<> eep; // Das EEProm auf der china üblichen RTC, default Adresse 0x50 (80)

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

  // die Speichergröße des EEProm wird in der Klasse gespeichert   // kann also ausgelesen werden, ohne dass das EEProm wirlich   // bereit ist   Serial.print("EE Prom lenth: ");   Serial.println(eep.length());

  if(eep.ready()) // eeprom bereit ?   {      // eeprom wurde gefunden, und ist bereit      Serial.println ("EEProm ist bereit!");   }else   {      // eeprom hat nicht geantwortet      // Auch direkt nach dem schreiben blockiert das eeprom ein paar ms      Serial.println("EEProm ist nicht bereit, Verkabelung prüfen ");   } }

void loop() {

}

Kompatibilität zu EEPROM

void begin()

Eine Methode begin() gibt es nicht. Es besteht hier keine Notwendigkeit für eine solche Methode.


uint16_t length()

Length gibt die größe des EEProms zurück.


uint8_t read(unit16_t address)

Read liest 1 Byte von der angegebenen Adresse


void write(unit16_t address,uint8_t value)

Write schreibt 1 Byte an die angegebenen Adresse


void update(unit16_t address,uint8_t value)

Update nutzt intern read() und write(). Es wird nur geschrieben wenn sich die Daten unterscheiden.


void put(unit16_t address, customvar)

Put schreibt einen beliebigen Variableninhalt an gegebenen Adresse. Die notwendige Länge wird selbst berechnet. put() ruft intern update() auf.


void get(unit16_t address, customvar)

Get liest einen beliebigen Variableninhalt von der gegebenen Adresse. Die notwendige Länge wird selbst berechnet.

Array Access Interface

Nicht implementiert.

Eigene, zusätzliche Methoden

bool ready()

Ready liefert true, wenn der Baustein bereit ist.


void fastBlockWrite(uint16_t address,void * start, uint16_t length)

fastBlockWrite schreibt einen beliebigen Datenblock an die angegebene EEProm Addresse. Das Paging wird intern abgehandelt.


void fastBlockRead(uint16_t address,void * start, uint16_t length)

fastBlockRead liest einen beliebigen Datenblock von der angegebenen EEProm Addresse. Das Paging wird intern abgehandelt.


fastBlockRead() und fastBlockWrite() sind deutlich fixer (ca 6 mal), als put() und get(). Der Geschwindigkeitsvorteil wird erkauft durch den Verzicht auf das vorherige prüfen, ob sich die Daten unterscheiden. Desweiteren wird das Page schreiben/lesen der Bausteine unterstützt.


void onWaiting( void (*callback)())

Nach Schreibvorgängen braucht das EEProm etwas Zeit um den Vorgang abzuschließen. Hier kann eine Callback Funktion aufgerufen werden um diese Zeit zu nutzen. Es ist nicht ratsam, in der Callback Funktion, weitere EEProm Aufrufe zu tätigen.