I can't remember if I found this or wrote it - but it is a sketch that demonstrates how to use the functions documented in that playground link.
// i2CEPROM.pde
#include <Wire.h>
#define CHIP_SELECT_BITS 0b000
#define ADR_24LC128 0b1010000
#define chipAddress (ADR_24LC128 | CHIP_SELECT_BITS)
void setup(){
Serial.begin(19200);
Wire.begin();
}
int count = 0;
int eeaddress = 0 ; // the starting address in memory, not the chip select address
char buffer[32];
void loop(){
Serial.println("starting loop ");
Serial.print("reading ");
for(int i=0; i < 8; i++){
char c = i2c_eeprom_read_byte(chipAddress,eeaddress + i );
Serial.print(c);
}
Serial.println();
for(int i=0; i < 8; i++){
byte data = 'M' + i;
i2c_eeprom_write_byte(chipAddress, eeaddress + i, data );
}
Serial.print("reading ");
for(int i=0; i < 8; i++){
char c = i2c_eeprom_read_byte(chipAddress,eeaddress + i );
Serial.print(c);
}
Serial.println();
Serial.print("reading block: ");
memset(buffer,0, sizeof(buffer));
i2c_eeprom_read_buffer( chipAddress, eeaddress, (byte*)buffer, 8 );
Serial.println((char*)buffer);
strcpy(buffer,"World -");
i2c_eeprom_write_block( chipAddress,eeaddress, (byte*)buffer, 8 ) ;
Serial.println();
Serial.print("reading block: ");
memset(buffer,0, sizeof(buffer));
i2c_eeprom_read_buffer( chipAddress, eeaddress, (byte*)buffer, 8 );
Serial.println((char*)buffer);
Serial.println("done - waiting ten minutes");
delay(600000);
// Serial.print("writing block ");
// i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length )
}
void i2c_eeprom_write_block( int deviceaddress, unsigned int eeaddress, byte* data, byte length ) {
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
while(length--){
Wire.send(*data++);
}
// Wire.endTransmission();
int ret = Wire.endTransmission();
Serial.print(" End returned ");
Serial.print(ret,DEC);
}
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.send(data);
//Wire.send(data);
//Serial.print("sending ");
//Serial.println(data);
int ret = Wire.endTransmission();
Serial.print("End returned ");
Serial.print(ret,DEC);
}
// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddresspage >> 8)); // MSB
Wire.send((int)(eeaddresspage & 0xFF)); // LSB
byte c;
for ( c = 0; c < length; c++)
Wire.send(data[c]);
int ret = Wire.endTransmission();
Serial.print("End returned ");
Serial.print(ret,DEC);
}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.receive();
return rdata;
}
// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,length);
int c = 0;
for ( c = 0; c < length; c++ )
if (Wire.available()) buffer[c] = Wire.receive();
}