/* * This program performs single-byte and multiple-byte read/write * of EEPROM 24LC02B via I2C. * * This program uses Wire library. For details of libraries: * http://energia.nu/reference/libraries/ * * Energia 1.6.10E18 */ #include #define SLAVEADDR 0x53 #define MEMORYADDRESS 72 #define PAGESIZE 8 #define WRITETIME 6 const char msg1[] = "QUICK BROWN FOX JUMPS OVER THE LAZY DOG .........."; const char msg2[] = "quick brown fox jumps over the lazy dog 0123456789"; void setup() { Wire.begin(); // initialize I2C Serial.begin(9600); // initialize serial port Serial.println("I2C EEPROM 24LC02B"); } void loop() { char data; char buffer[64]; Serial.println("---BYTE WRITE BLOCK READ---"); for (int i = 0 ; i < sizeof(msg1); i++) i2c_byte_write(SLAVEADDR, MEMORYADDRESS + i, msg1[i] ); i2c_block_read(SLAVEADDR, MEMORYADDRESS, buffer, sizeof(msg1)); for (int i = 0; i < sizeof(msg1); i++) Serial.print((char)buffer[i]); Serial.println(); delay(1000); Serial.println("---block write byte read---"); i2c_block_write(SLAVEADDR, MEMORYADDRESS, (char *)msg2, sizeof(msg2)); for (int i = 0; i < sizeof(msg2); i++) { i2c_byte_read(SLAVEADDR, MEMORYADDRESS + i, &data); Serial.print((char)data); } Serial.println(); Serial.println(); delay(4000); } void i2c_byte_write(int slaveAddr, unsigned int memAddr, char data) { int rdata = data; Wire.beginTransmission(slaveAddr); Wire.write(memAddr); Wire.write(rdata); Wire.endTransmission(); delay(WRITETIME); // wait until write is complete } // memAddr should be page aligned otherwise the data will wrap around the page. void i2c_block_write(int slaveAddr, unsigned int memAddr, char* data, int length) { char* p = data; // write a page at a time for ( ; length > 0; memAddr += PAGESIZE, data += PAGESIZE, length -= PAGESIZE) { Wire.beginTransmission(slaveAddr); Wire.write(memAddr); for (int i = 0; i < (length > PAGESIZE ? PAGESIZE : length); i++) Wire.write(*p++); Wire.endTransmission(); delay(WRITETIME); // wait until write is complete } } void i2c_byte_read(int slaveAddr, unsigned int memAddr, char *data) { Wire.beginTransmission(slaveAddr); Wire.write(memAddr); Wire.endTransmission(); Wire.requestFrom(slaveAddr, 1); if (Wire.available()) *data = Wire.read(); } void i2c_block_read(int slaveAddr, unsigned int memAddr, char *buffer, int length) { Wire.beginTransmission(slaveAddr); Wire.write(memAddr); Wire.endTransmission(); Wire.requestFrom(slaveAddr, length); for (int c = 0; c < length; c++) if (Wire.available()) buffer[c] = Wire.read(); }