nikos chalikias
/
n-bed_24AA02E48
n-bed test program
main.cpp@1:627579b6dc90, 2015-01-23 (annotated)
- Committer:
- chalikias
- Date:
- Fri Jan 23 11:10:26 2015 +0000
- Revision:
- 1:627579b6dc90
- Parent:
- 0:875a9fb3e4cf
- Child:
- 2:4b53b097c16b
n-bed header comment
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chalikias | 1:627579b6dc90 | 1 | n-bed testing 24AA02E48 MAC address reading |
chalikias | 1:627579b6dc90 | 2 | |
chalikias | 1:627579b6dc90 | 3 | |
chalikias | 0:875a9fb3e4cf | 4 | #include "mbed.h" |
chalikias | 0:875a9fb3e4cf | 5 | |
chalikias | 0:875a9fb3e4cf | 6 | // 24AA02E48 datasheet: |
chalikias | 0:875a9fb3e4cf | 7 | // http://ww1.microchip.com/downloads/en/DeviceDoc/20002124E.pdf |
chalikias | 0:875a9fb3e4cf | 8 | |
chalikias | 0:875a9fb3e4cf | 9 | // the address of the EEPROM I2C device |
chalikias | 0:875a9fb3e4cf | 10 | #define EEPROM_24AA02E48_ADDR (0xA0) |
chalikias | 0:875a9fb3e4cf | 11 | |
chalikias | 0:875a9fb3e4cf | 12 | static I2C i2c(P0_27, P0_28); |
chalikias | 0:875a9fb3e4cf | 13 | |
chalikias | 0:875a9fb3e4cf | 14 | int main(void) { |
chalikias | 0:875a9fb3e4cf | 15 | |
chalikias | 0:875a9fb3e4cf | 16 | int i = 0; |
chalikias | 0:875a9fb3e4cf | 17 | char offset = 0; |
chalikias | 0:875a9fb3e4cf | 18 | bool verifiedOk = true; |
chalikias | 0:875a9fb3e4cf | 19 | char buf[7]; |
chalikias | 0:875a9fb3e4cf | 20 | |
chalikias | 0:875a9fb3e4cf | 21 | printf("Reading MAC address\n"); |
chalikias | 0:875a9fb3e4cf | 22 | |
chalikias | 0:875a9fb3e4cf | 23 | do { |
chalikias | 0:875a9fb3e4cf | 24 | |
chalikias | 0:875a9fb3e4cf | 25 | // the MAC address is stored at offset 0xFA in the EEPROM |
chalikias | 0:875a9fb3e4cf | 26 | // start by telling the EEPROM that we want to access this offset |
chalikias | 0:875a9fb3e4cf | 27 | offset = 0xFA; |
chalikias | 0:875a9fb3e4cf | 28 | |
chalikias | 0:875a9fb3e4cf | 29 | // write returns non-0 on failure |
chalikias | 0:875a9fb3e4cf | 30 | if (i2c.write(EEPROM_24AA02E48_ADDR, &offset, 1) != 0) { |
chalikias | 0:875a9fb3e4cf | 31 | printf("Failed to write to I2C device (%x) at offset 0xFA\n", |
chalikias | 0:875a9fb3e4cf | 32 | EEPROM_24AA02E48_ADDR); |
chalikias | 0:875a9fb3e4cf | 33 | break; |
chalikias | 0:875a9fb3e4cf | 34 | } |
chalikias | 0:875a9fb3e4cf | 35 | |
chalikias | 0:875a9fb3e4cf | 36 | // read the MAC address (48 bits = 6 bytes). The read function |
chalikias | 0:875a9fb3e4cf | 37 | // returns non-0 in case of failure |
chalikias | 0:875a9fb3e4cf | 38 | if (i2c.read(EEPROM_24AA02E48_ADDR, buf, 6) != 0) { |
chalikias | 0:875a9fb3e4cf | 39 | printf("Failed to read from I2C device (%x) at offset 0xFA\n", |
chalikias | 0:875a9fb3e4cf | 40 | EEPROM_24AA02E48_ADDR); |
chalikias | 0:875a9fb3e4cf | 41 | } |
chalikias | 0:875a9fb3e4cf | 42 | |
chalikias | 0:875a9fb3e4cf | 43 | printf(" - the MAC address is %02X:%02X:%02X:%02X:%02X:%02X\n", |
chalikias | 0:875a9fb3e4cf | 44 | buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); |
chalikias | 0:875a9fb3e4cf | 45 | |
chalikias | 0:875a9fb3e4cf | 46 | } while (0); |
chalikias | 0:875a9fb3e4cf | 47 | |
chalikias | 0:875a9fb3e4cf | 48 | printf("Writing data to EEPROM\n"); |
chalikias | 0:875a9fb3e4cf | 49 | |
chalikias | 0:875a9fb3e4cf | 50 | do { |
chalikias | 0:875a9fb3e4cf | 51 | |
chalikias | 0:875a9fb3e4cf | 52 | // initializing the buffer with values that will be |
chalikias | 0:875a9fb3e4cf | 53 | // written to the EEPROM. Note that index 0 is used as |
chalikias | 0:875a9fb3e4cf | 54 | // the offset and data are put in the remaining 6 bytes |
chalikias | 0:875a9fb3e4cf | 55 | // see "write data" section below |
chalikias | 0:875a9fb3e4cf | 56 | for (i = 0; i < 6; i++) { |
chalikias | 0:875a9fb3e4cf | 57 | buf[i+1] = i+3; |
chalikias | 0:875a9fb3e4cf | 58 | } |
chalikias | 0:875a9fb3e4cf | 59 | |
chalikias | 0:875a9fb3e4cf | 60 | // We write to the beginning of the EEPROM (offset = 0) in this |
chalikias | 0:875a9fb3e4cf | 61 | // example. |
chalikias | 0:875a9fb3e4cf | 62 | // |
chalikias | 0:875a9fb3e4cf | 63 | // Please note that there are limitations to how to write to the EEPROM |
chalikias | 0:875a9fb3e4cf | 64 | // - At most one page (8 bytes for this EEPROM) can be written at a time |
chalikias | 0:875a9fb3e4cf | 65 | // - A write request will wrap around if writing passed a page boundary |
chalikias | 0:875a9fb3e4cf | 66 | // - Example: If writing 4 bytes starting at offset 6, positions 6,7 |
chalikias | 0:875a9fb3e4cf | 67 | // 0, and 1 will actually be written since page boundaries |
chalikias | 0:875a9fb3e4cf | 68 | // are at even page sizes (0, 8, 16, ...) and a write |
chalikias | 0:875a9fb3e4cf | 69 | // request will wrap around if passing a page boundary. |
chalikias | 0:875a9fb3e4cf | 70 | // - the upper part (0x80-0xFF) are always write protected for this |
chalikias | 0:875a9fb3e4cf | 71 | // particular EEPROM |
chalikias | 0:875a9fb3e4cf | 72 | offset = 0; |
chalikias | 0:875a9fb3e4cf | 73 | |
chalikias | 0:875a9fb3e4cf | 74 | |
chalikias | 0:875a9fb3e4cf | 75 | // write data |
chalikias | 0:875a9fb3e4cf | 76 | // All data is written in one request (page write). The first byte must |
chalikias | 0:875a9fb3e4cf | 77 | // therefore contain the offset to where the data should be written. |
chalikias | 0:875a9fb3e4cf | 78 | // It is also possible to write one byte at a time. |
chalikias | 0:875a9fb3e4cf | 79 | buf[0] = offset; |
chalikias | 0:875a9fb3e4cf | 80 | if (i2c.write(EEPROM_24AA02E48_ADDR, buf, 7) != 0) { |
chalikias | 0:875a9fb3e4cf | 81 | printf("Failed to write to I2C device (%x) 2\n", |
chalikias | 0:875a9fb3e4cf | 82 | EEPROM_24AA02E48_ADDR); |
chalikias | 0:875a9fb3e4cf | 83 | break; |
chalikias | 0:875a9fb3e4cf | 84 | } |
chalikias | 0:875a9fb3e4cf | 85 | |
chalikias | 0:875a9fb3e4cf | 86 | |
chalikias | 0:875a9fb3e4cf | 87 | } while (0); |
chalikias | 0:875a9fb3e4cf | 88 | |
chalikias | 0:875a9fb3e4cf | 89 | printf("Reading back written data\n"); |
chalikias | 0:875a9fb3e4cf | 90 | |
chalikias | 0:875a9fb3e4cf | 91 | do { |
chalikias | 0:875a9fb3e4cf | 92 | // resetting the buffer |
chalikias | 0:875a9fb3e4cf | 93 | memset(buf, 0, 6); |
chalikias | 0:875a9fb3e4cf | 94 | |
chalikias | 0:875a9fb3e4cf | 95 | |
chalikias | 0:875a9fb3e4cf | 96 | // tell the EEPROM which offset to use |
chalikias | 0:875a9fb3e4cf | 97 | if (i2c.write(EEPROM_24AA02E48_ADDR, &offset, 1) != 0) { |
chalikias | 0:875a9fb3e4cf | 98 | printf("Failed to write to I2C device (%x) 3\n", |
chalikias | 0:875a9fb3e4cf | 99 | EEPROM_24AA02E48_ADDR); |
chalikias | 0:875a9fb3e4cf | 100 | break; |
chalikias | 0:875a9fb3e4cf | 101 | } |
chalikias | 0:875a9fb3e4cf | 102 | |
chalikias | 0:875a9fb3e4cf | 103 | // read data |
chalikias | 0:875a9fb3e4cf | 104 | if (i2c.read(EEPROM_24AA02E48_ADDR, buf, 6) != 0) { |
chalikias | 0:875a9fb3e4cf | 105 | printf("Failed to read from I2C device (%x) 3\n", |
chalikias | 0:875a9fb3e4cf | 106 | EEPROM_24AA02E48_ADDR); |
chalikias | 0:875a9fb3e4cf | 107 | } |
chalikias | 0:875a9fb3e4cf | 108 | |
chalikias | 0:875a9fb3e4cf | 109 | // verifying read data |
chalikias | 0:875a9fb3e4cf | 110 | for (i = 0; i < 6; i++) { |
chalikias | 0:875a9fb3e4cf | 111 | if (buf[i] != (i+3)) { |
chalikias | 0:875a9fb3e4cf | 112 | verifiedOk = false; |
chalikias | 0:875a9fb3e4cf | 113 | printf(" - Read data not equal to written buf[%d]=%d != %d\n", |
chalikias | 0:875a9fb3e4cf | 114 | i, buf[i], (i+3)); |
chalikias | 0:875a9fb3e4cf | 115 | break; |
chalikias | 0:875a9fb3e4cf | 116 | } |
chalikias | 0:875a9fb3e4cf | 117 | } |
chalikias | 0:875a9fb3e4cf | 118 | |
chalikias | 0:875a9fb3e4cf | 119 | if (verifiedOk) { |
chalikias | 0:875a9fb3e4cf | 120 | printf(" - Read data is equal to written data\n"); |
chalikias | 0:875a9fb3e4cf | 121 | } |
chalikias | 0:875a9fb3e4cf | 122 | |
chalikias | 0:875a9fb3e4cf | 123 | } while (0); |
chalikias | 0:875a9fb3e4cf | 124 | |
chalikias | 0:875a9fb3e4cf | 125 | return 0; |
chalikias | 0:875a9fb3e4cf | 126 | } |