Andrea Corrado / Mbed OS 24LC256-EEPROM-I2C

Fork of Nucleo F030R8 24LC256 EEPROM I2C by adamump simus

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?

UserRevisionLine numberNew 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 }