nikos chalikias
/
n-bed_24AA02E48
n-bed test program
Diff: main.cpp
- Revision:
- 0:875a9fb3e4cf
- Child:
- 1:627579b6dc90
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jan 23 11:09:32 2015 +0000 @@ -0,0 +1,123 @@ +#include "mbed.h" + +// 24AA02E48 datasheet: +// http://ww1.microchip.com/downloads/en/DeviceDoc/20002124E.pdf + +// the address of the EEPROM I2C device +#define EEPROM_24AA02E48_ADDR (0xA0) + +static I2C i2c(P0_27, P0_28); + +int main(void) { + + int i = 0; + char offset = 0; + bool verifiedOk = true; + char buf[7]; + + printf("Reading MAC address\n"); + + do { + + // the MAC address is stored at offset 0xFA in the EEPROM + // start by telling the EEPROM that we want to access this offset + offset = 0xFA; + + // write returns non-0 on failure + if (i2c.write(EEPROM_24AA02E48_ADDR, &offset, 1) != 0) { + printf("Failed to write to I2C device (%x) at offset 0xFA\n", + EEPROM_24AA02E48_ADDR); + break; + } + + // read the MAC address (48 bits = 6 bytes). The read function + // returns non-0 in case of failure + if (i2c.read(EEPROM_24AA02E48_ADDR, buf, 6) != 0) { + printf("Failed to read from I2C device (%x) at offset 0xFA\n", + EEPROM_24AA02E48_ADDR); + } + + printf(" - the MAC address is %02X:%02X:%02X:%02X:%02X:%02X\n", + buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); + + } while (0); + + printf("Writing data to EEPROM\n"); + + do { + + // initializing the buffer with values that will be + // written to the EEPROM. Note that index 0 is used as + // the offset and data are put in the remaining 6 bytes + // see "write data" section below + for (i = 0; i < 6; i++) { + buf[i+1] = i+3; + } + + // We write to the beginning of the EEPROM (offset = 0) in this + // example. + // + // Please note that there are limitations to how to write to the EEPROM + // - At most one page (8 bytes for this EEPROM) can be written at a time + // - A write request will wrap around if writing passed a page boundary + // - Example: If writing 4 bytes starting at offset 6, positions 6,7 + // 0, and 1 will actually be written since page boundaries + // are at even page sizes (0, 8, 16, ...) and a write + // request will wrap around if passing a page boundary. + // - the upper part (0x80-0xFF) are always write protected for this + // particular EEPROM + offset = 0; + + + // write data + // All data is written in one request (page write). The first byte must + // therefore contain the offset to where the data should be written. + // It is also possible to write one byte at a time. + buf[0] = offset; + if (i2c.write(EEPROM_24AA02E48_ADDR, buf, 7) != 0) { + printf("Failed to write to I2C device (%x) 2\n", + EEPROM_24AA02E48_ADDR); + break; + } + + + } while (0); + + printf("Reading back written data\n"); + + do { + // resetting the buffer + memset(buf, 0, 6); + + + // tell the EEPROM which offset to use + if (i2c.write(EEPROM_24AA02E48_ADDR, &offset, 1) != 0) { + printf("Failed to write to I2C device (%x) 3\n", + EEPROM_24AA02E48_ADDR); + break; + } + + // read data + if (i2c.read(EEPROM_24AA02E48_ADDR, buf, 6) != 0) { + printf("Failed to read from I2C device (%x) 3\n", + EEPROM_24AA02E48_ADDR); + } + + // verifying read data + for (i = 0; i < 6; i++) { + if (buf[i] != (i+3)) { + verifiedOk = false; + printf(" - Read data not equal to written buf[%d]=%d != %d\n", + i, buf[i], (i+3)); + break; + } + } + + if (verifiedOk) { + printf(" - Read data is equal to written data\n"); + } + + } while (0); + + return 0; +}