a simple wrapper above I2C to provider EEPROM access API

Dependents:   ou_mbed_oled ou_mbed_eeprom ou_mbed_tmp102

Committer:
poushen
Date:
Tue Jun 19 01:26:31 2018 +0000
Revision:
3:8ddab67b62c3
Parent:
1:0c876c06b026
make sample more complete.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
poushen 0:3de36cc169a3 1 #include "eeprom.h"
poushen 0:3de36cc169a3 2
poushen 0:3de36cc169a3 3 eeprom::eeprom(I2C &i2c_obj, char address)
poushen 0:3de36cc169a3 4 : i2c(i2c_obj), adr(address)
poushen 0:3de36cc169a3 5 {
poushen 0:3de36cc169a3 6 init();
poushen 0:3de36cc169a3 7 }
poushen 0:3de36cc169a3 8
poushen 0:3de36cc169a3 9 void eeprom::init(void)
poushen 0:3de36cc169a3 10 {
poushen 1:0c876c06b026 11 i2c.frequency(400*1000);
poushen 0:3de36cc169a3 12 }
poushen 0:3de36cc169a3 13
poushen 0:3de36cc169a3 14 void eeprom::write_address(int address, int address_size, bool repeated)
poushen 1:0c876c06b026 15 {
poushen 0:3de36cc169a3 16 uint8_t buffer[4] = { 0, 0, 0, 0 };
poushen 0:3de36cc169a3 17 page_write(address, address_size, buffer, 0);
poushen 0:3de36cc169a3 18 }
poushen 0:3de36cc169a3 19
poushen 1:0c876c06b026 20 uint8_t eeprom::current_read(void)
poushen 0:3de36cc169a3 21 {
poushen 1:0c876c06b026 22 uint8_t data;
poushen 1:0c876c06b026 23 i2c.read((int)adr,(char *)&data,1);
poushen 1:0c876c06b026 24 return data;
poushen 0:3de36cc169a3 25 }
poushen 0:3de36cc169a3 26
poushen 0:3de36cc169a3 27 void eeprom::sequential_read(uint8_t *buffer, int buffer_size)
poushen 0:3de36cc169a3 28 {
poushen 0:3de36cc169a3 29 i2c.read((int)adr, (char *)buffer, buffer_size);
poushen 0:3de36cc169a3 30 }
poushen 0:3de36cc169a3 31
poushen 0:3de36cc169a3 32 void eeprom::random_read(int address, int address_size, uint8_t *buffer, int buffer_size)
poushen 0:3de36cc169a3 33 {
poushen 0:3de36cc169a3 34 write_address(address, address_size, true);
poushen 0:3de36cc169a3 35 i2c.read((int)adr, (char *)buffer, buffer_size);
poushen 0:3de36cc169a3 36 }
poushen 0:3de36cc169a3 37
poushen 0:3de36cc169a3 38 void eeprom::byte_write(int address, int address_size, uint8_t data, bool repeated)
poushen 1:0c876c06b026 39 {
poushen 0:3de36cc169a3 40 uint8_t buffer[4] = { 0, 0, 0, 0 };
poushen 0:3de36cc169a3 41 buffer[3] = data;
poushen 0:3de36cc169a3 42 page_write(address, address_size, buffer, 1);
poushen 0:3de36cc169a3 43 }
poushen 0:3de36cc169a3 44
poushen 0:3de36cc169a3 45 void eeprom::page_write(int address, int address_size, uint8_t *buffer, int buffer_size, bool repeated)
poushen 0:3de36cc169a3 46 {
poushen 0:3de36cc169a3 47 // for simplify, buffer must prefix 3 bytes for memory address
poushen 0:3de36cc169a3 48 switch (address_size) {
poushen 0:3de36cc169a3 49 case ONE_BYTE_ADDRESS:
poushen 0:3de36cc169a3 50 buffer[2] = address & 0xFF;
poushen 0:3de36cc169a3 51 break;
poushen 0:3de36cc169a3 52 case TWO_BYTES_ADDRESS:
poushen 0:3de36cc169a3 53 buffer[1] = (address >> 8) & 0xFF;
poushen 0:3de36cc169a3 54 buffer[2] = address & 0xFF;
poushen 0:3de36cc169a3 55 break;
poushen 0:3de36cc169a3 56 case THREE_BYTES_ADDRESS:
poushen 0:3de36cc169a3 57 buffer[0] = (address >> 16) & 0xFF;
poushen 0:3de36cc169a3 58 buffer[1] = (address >> 8) & 0xFF;
poushen 0:3de36cc169a3 59 buffer[2] = address & 0xFF;
poushen 0:3de36cc169a3 60 break;
poushen 0:3de36cc169a3 61 }
poushen 0:3de36cc169a3 62 i2c.write((int)adr,(char *)(buffer + (3 - address_size)),address_size + buffer_size,repeated);
poushen 0:3de36cc169a3 63 }
poushen 0:3de36cc169a3 64
poushen 0:3de36cc169a3 65 void eeprom::ack_polling(void)
poushen 0:3de36cc169a3 66 {
poushen 0:3de36cc169a3 67 uint8_t buffer[] = { 0 };
poushen 0:3de36cc169a3 68 int ack;
poushen 0:3de36cc169a3 69
poushen 0:3de36cc169a3 70 do {
poushen 1:0c876c06b026 71 ack = i2c.write((int)adr, (char *)buffer, 1, true);
poushen 0:3de36cc169a3 72 } while(ack == 1);
poushen 1:0c876c06b026 73 i2c.stop();
poushen 0:3de36cc169a3 74 }