Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Nucleo F030R8 24LC256 EEPROM I2C by
main.cpp@0:34c4fa6b49ac, 2016-07-20 (annotated)
- Committer:
- adamumpsimus
- Date:
- Wed Jul 20 10:43:06 2016 +0000
- Revision:
- 0:34c4fa6b49ac
- Child:
- 1:0aa405151a74
first release
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| adamumpsimus | 0:34c4fa6b49ac | 1 | // NOTES: |
| adamumpsimus | 0:34c4fa6b49ac | 2 | // 1. mbed.h MUST BE the revision from 30 Mar 2016, otherwise it will behave strange and unexpected! Older or newer versions won't work. |
| adamumpsimus | 0:34c4fa6b49ac | 3 | // For example, with the latest version of mbed.h from 25 May 2016, the "wait" function does not work at all, it's the same as if it's not there. |
| adamumpsimus | 0:34c4fa6b49ac | 4 | // 2. writeEEPROM has 64 bytes limitation. If you want to write more at once, read http://www.hobbytronics.co.uk/eeprom-page-write how this guy made it work. |
| adamumpsimus | 0:34c4fa6b49ac | 5 | // Im not interested in storing data above 64 bytes (1 page). The 24LC256 chip has 4096 pages. |
| adamumpsimus | 0:34c4fa6b49ac | 6 | // 3. reading the entire eeprom does its job until the 512 byte, then it will cycle from zero. I don't know why... |
| adamumpsimus | 0:34c4fa6b49ac | 7 | #include "mbed.h" |
| adamumpsimus | 0:34c4fa6b49ac | 8 | |
| adamumpsimus | 0:34c4fa6b49ac | 9 | // function declaration |
| adamumpsimus | 0:34c4fa6b49ac | 10 | void writeEEPROM(int address, unsigned int eeaddress, char *data, int size); |
| adamumpsimus | 0:34c4fa6b49ac | 11 | void readEEPROM(int address, unsigned int eeaddress, char *data, int size); |
| adamumpsimus | 0:34c4fa6b49ac | 12 | |
| adamumpsimus | 0:34c4fa6b49ac | 13 | // classes and functions instantiation |
| adamumpsimus | 0:34c4fa6b49ac | 14 | I2C i2c(I2C_SDA, I2C_SCL); |
| adamumpsimus | 0:34c4fa6b49ac | 15 | Serial pc(SERIAL_TX, SERIAL_RX); |
| adamumpsimus | 0:34c4fa6b49ac | 16 | |
| adamumpsimus | 0:34c4fa6b49ac | 17 | // settings |
| adamumpsimus | 0:34c4fa6b49ac | 18 | int address = 0xA8; // in my case A2 = high, A1 = low, A0 = low, so the address is 1010 1000 = A8 (format 1 0 1 0 A3 A2 A1 R/W) |
| adamumpsimus | 0:34c4fa6b49ac | 19 | |
| adamumpsimus | 0:34c4fa6b49ac | 20 | int main() |
| adamumpsimus | 0:34c4fa6b49ac | 21 | { |
| adamumpsimus | 0:34c4fa6b49ac | 22 | pc.printf("24LC256 I2C EEPROM started...\n"); |
| adamumpsimus | 0:34c4fa6b49ac | 23 | |
| adamumpsimus | 0:34c4fa6b49ac | 24 | int pointerAdddress = 0; |
| adamumpsimus | 0:34c4fa6b49ac | 25 | |
| adamumpsimus | 0:34c4fa6b49ac | 26 | // write some data on eeprom |
| adamumpsimus | 0:34c4fa6b49ac | 27 | char writeData[] = {"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec f"}; // the text length must be below 64 bytes |
| adamumpsimus | 0:34c4fa6b49ac | 28 | char writeDataLen = 0; |
| adamumpsimus | 0:34c4fa6b49ac | 29 | do {writeDataLen++;} while (writeData[writeDataLen]); // calculate the text length |
| adamumpsimus | 0:34c4fa6b49ac | 30 | /* |
| adamumpsimus | 0:34c4fa6b49ac | 31 | writeEEPROM(address, pointerAdddress, writeData, writeDataLen); |
| adamumpsimus | 0:34c4fa6b49ac | 32 | |
| adamumpsimus | 0:34c4fa6b49ac | 33 | pc.printf("Data written: %s\n", writeData); |
| adamumpsimus | 0:34c4fa6b49ac | 34 | */ |
| adamumpsimus | 0:34c4fa6b49ac | 35 | |
| adamumpsimus | 0:34c4fa6b49ac | 36 | // read the data back |
| adamumpsimus | 0:34c4fa6b49ac | 37 | char data_read[writeDataLen]; |
| adamumpsimus | 0:34c4fa6b49ac | 38 | readEEPROM(address, pointerAdddress, data_read, writeDataLen); |
| adamumpsimus | 0:34c4fa6b49ac | 39 | |
| adamumpsimus | 0:34c4fa6b49ac | 40 | pc.printf("Data read: %s\n", data_read); |
| adamumpsimus | 0:34c4fa6b49ac | 41 | |
| adamumpsimus | 0:34c4fa6b49ac | 42 | // read the entire eeprom |
| adamumpsimus | 0:34c4fa6b49ac | 43 | /* |
| adamumpsimus | 0:34c4fa6b49ac | 44 | pc.printf("Printing the entire EEPROM array (64 columns, 4096 rows):\n"); |
| adamumpsimus | 0:34c4fa6b49ac | 45 | int i; |
| adamumpsimus | 0:34c4fa6b49ac | 46 | char data_chunk[64]; |
| adamumpsimus | 0:34c4fa6b49ac | 47 | int pointer; |
| adamumpsimus | 0:34c4fa6b49ac | 48 | for (i = 0; i < 4096; i++) |
| adamumpsimus | 0:34c4fa6b49ac | 49 | { |
| adamumpsimus | 0:34c4fa6b49ac | 50 | pointer = 64 * i; |
| adamumpsimus | 0:34c4fa6b49ac | 51 | readEEPROM(address, pointer, data_chunk, 64); |
| adamumpsimus | 0:34c4fa6b49ac | 52 | pc.printf("row: %4d, data: %s\n", i, data_chunk); |
| adamumpsimus | 0:34c4fa6b49ac | 53 | } |
| adamumpsimus | 0:34c4fa6b49ac | 54 | */ |
| adamumpsimus | 0:34c4fa6b49ac | 55 | |
| adamumpsimus | 0:34c4fa6b49ac | 56 | // delete the entire eeprom |
| adamumpsimus | 0:34c4fa6b49ac | 57 | /* |
| adamumpsimus | 0:34c4fa6b49ac | 58 | pc.printf("Deleting the entire EEPROM array (64 columns, 4096 rows):\n"); |
| adamumpsimus | 0:34c4fa6b49ac | 59 | int i; |
| adamumpsimus | 0:34c4fa6b49ac | 60 | int pointer; |
| adamumpsimus | 0:34c4fa6b49ac | 61 | char deleteData[] = {"0000000000000000000000000000000000000000000000000000000000000000"}; // 64 bytes data length of zeros |
| adamumpsimus | 0:34c4fa6b49ac | 62 | for (i = 0; i < 4096; i++) |
| adamumpsimus | 0:34c4fa6b49ac | 63 | { |
| adamumpsimus | 0:34c4fa6b49ac | 64 | pointer = 64 * i; |
| adamumpsimus | 0:34c4fa6b49ac | 65 | writeEEPROM(address, pointer, deleteData, 64); |
| adamumpsimus | 0:34c4fa6b49ac | 66 | } |
| adamumpsimus | 0:34c4fa6b49ac | 67 | pc.printf("Erasing complete\n"); |
| adamumpsimus | 0:34c4fa6b49ac | 68 | */ |
| adamumpsimus | 0:34c4fa6b49ac | 69 | } |
| adamumpsimus | 0:34c4fa6b49ac | 70 | |
| adamumpsimus | 0:34c4fa6b49ac | 71 | // this function has 63 bytes write limit |
| adamumpsimus | 0:34c4fa6b49ac | 72 | void writeEEPROM(int address, unsigned int eeaddress, char *data, int size) |
| adamumpsimus | 0:34c4fa6b49ac | 73 | { |
| adamumpsimus | 0:34c4fa6b49ac | 74 | char i2cBuffer[size + 2]; |
| adamumpsimus | 0:34c4fa6b49ac | 75 | i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
| adamumpsimus | 0:34c4fa6b49ac | 76 | i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
| adamumpsimus | 0:34c4fa6b49ac | 77 | |
| adamumpsimus | 0:34c4fa6b49ac | 78 | for (int i = 0; i < size; i++) { |
| adamumpsimus | 0:34c4fa6b49ac | 79 | i2cBuffer[i + 2] = data[i]; |
| adamumpsimus | 0:34c4fa6b49ac | 80 | } |
| adamumpsimus | 0:34c4fa6b49ac | 81 | |
| adamumpsimus | 0:34c4fa6b49ac | 82 | int result = i2c.write(address, i2cBuffer, size + 2, false); |
| adamumpsimus | 0:34c4fa6b49ac | 83 | wait_ms(6); |
| adamumpsimus | 0:34c4fa6b49ac | 84 | } |
| adamumpsimus | 0:34c4fa6b49ac | 85 | |
| adamumpsimus | 0:34c4fa6b49ac | 86 | // this function has no read limit |
| adamumpsimus | 0:34c4fa6b49ac | 87 | void readEEPROM(int address, unsigned int eeaddress, char *data, int size) |
| adamumpsimus | 0:34c4fa6b49ac | 88 | { |
| adamumpsimus | 0:34c4fa6b49ac | 89 | char i2cBuffer[2]; |
| adamumpsimus | 0:34c4fa6b49ac | 90 | i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
| adamumpsimus | 0:34c4fa6b49ac | 91 | i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
| adamumpsimus | 0:34c4fa6b49ac | 92 | |
| adamumpsimus | 0:34c4fa6b49ac | 93 | // Reset eeprom pointer address |
| adamumpsimus | 0:34c4fa6b49ac | 94 | int result = i2c.write(address, i2cBuffer, 2, false); |
| adamumpsimus | 0:34c4fa6b49ac | 95 | wait_ms(6); |
| adamumpsimus | 0:34c4fa6b49ac | 96 | |
| adamumpsimus | 0:34c4fa6b49ac | 97 | // Read eeprom |
| adamumpsimus | 0:34c4fa6b49ac | 98 | i2c.read(address, data, size); |
| adamumpsimus | 0:34c4fa6b49ac | 99 | wait_ms(6); |
| adamumpsimus | 0:34c4fa6b49ac | 100 | } |
