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