a simple wrapper above I2C to provider EEPROM access API

Dependents:   ou_mbed_oled ou_mbed_eeprom ou_mbed_tmp102

Committer:
poushen
Date:
Fri Jun 15 23:03:32 2018 +0000
Revision:
1:0c876c06b026
Parent:
0:3de36cc169a3
Child:
2:ce12a405cd3a
init() specify fast speed (400kHz), change current_read() to return read value.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
poushen 1:0c876c06b026 1 /** A class for eeprom accesss operation
poushen 1:0c876c06b026 2 *
poushen 1:0c876c06b026 3 * @author Poushen Ou
poushen 1:0c876c06b026 4 * @version 1.0
poushen 1:0c876c06b026 5 * @date 15-Jun-2018
poushen 1:0c876c06b026 6 *
poushen 1:0c876c06b026 7 * This code provide classic access operation for I2C EEPROM
poushen 1:0c876c06b026 8 *
poushen 1:0c876c06b026 9 * About I2C EEPROM 24FC256:
poushen 1:0c876c06b026 10 * http://ww1.microchip.com/downloads/en/DeviceDoc/21203M.pdf
poushen 1:0c876c06b026 11 */
poushen 0:3de36cc169a3 12
poushen 0:3de36cc169a3 13 #include "mbed.h"
poushen 0:3de36cc169a3 14
poushen 0:3de36cc169a3 15 #define EEPROM_ADDR 0xA0
poushen 0:3de36cc169a3 16
poushen 1:0c876c06b026 17 /** eeprom Class Library
poushen 1:0c876c06b026 18 * to provide very simple interface for mbed
poushen 1:0c876c06b026 19 *
poushen 1:0c876c06b026 20 * Example:
poushen 1:0c876c06b026 21 * @code
poushen 1:0c876c06b026 22 * #include "mbed.h"
poushen 1:0c876c06b026 23 * #include "eeprom.h"
poushen 1:0c876c06b026 24 *
poushen 1:0c876c06b026 25 * // make eeprom instance using I2C object.
poushen 1:0c876c06b026 26 * // with default slave address 0xA0 (0x50 in 7bit format)
poushen 1:0c876c06b026 27 * // test ok with 24FC256 EEPROM
poushen 1:0c876c06b026 28 * I2C i2c(dp5,dp27);
poushen 1:0c876c06b026 29 * eeprom epm(i2c);
poushen 1:0c876c06b026 30 *
poushen 1:0c876c06b026 31 * int main()
poushen 1:0c876c06b026 32 * {
poushen 1:0c876c06b026 33 * epm.write_address(12288, TWO_BYTES_ADDRESS);
poushen 1:0c876c06b026 34 *
poushen 1:0c876c06b026 35 * for (int i=0; i< 64; i++) {
poushen 1:0c876c06b026 36 * printf("%.2x ", epm.current_read());
poushen 1:0c876c06b026 37 * }
poushen 1:0c876c06b026 38 * printf("\n\r");
poushen 1:0c876c06b026 39 *
poushen 1:0c876c06b026 40 * while(1);
poushen 1:0c876c06b026 41 * }
poushen 1:0c876c06b026 42 * @endcode
poushen 1:0c876c06b026 43 */
poushen 0:3de36cc169a3 44 class eeprom
poushen 0:3de36cc169a3 45 {
poushen 0:3de36cc169a3 46 public:
poushen 0:3de36cc169a3 47 /** Create a eeprom instance connected to specified I2C pins with specified address
poushen 0:3de36cc169a3 48 *
poushen 0:3de36cc169a3 49 * @param i2c_obj I2C object (instance)
poushen 0:3de36cc169a3 50 * @param address (option) I2C-bus slave address (default: 0xA0)
poushen 0:3de36cc169a3 51 */
poushen 0:3de36cc169a3 52 eeprom(I2C &i2c_obj, char address = EEPROM_ADDR);
poushen 0:3de36cc169a3 53
poushen 0:3de36cc169a3 54 /** Initialization */
poushen 0:3de36cc169a3 55 void init(void);
poushen 0:3de36cc169a3 56
poushen 1:0c876c06b026 57 /** Write address with specify address size
poushen 0:3de36cc169a3 58 *
poushen 0:3de36cc169a3 59 * @param address eeprom memory address
poushen 1:0c876c06b026 60 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 61 */
poushen 0:3de36cc169a3 62 void write_address(int address, int address_size, bool repeated=false);
poushen 0:3de36cc169a3 63
poushen 1:0c876c06b026 64 /** Current read, read the current memory data
poushen 0:3de36cc169a3 65 *
poushen 1:0c876c06b026 66 * @return the current memory data
poushen 0:3de36cc169a3 67 */
poushen 1:0c876c06b026 68 uint8_t current_read(void);
poushen 0:3de36cc169a3 69
poushen 1:0c876c06b026 70 /** Sequential read, read one or many bytes from current memory address
poushen 0:3de36cc169a3 71 *
poushen 0:3de36cc169a3 72 * @param buffer the start address point to buffer
poushen 0:3de36cc169a3 73 * @param buffer_size the length of buffer
poushen 0:3de36cc169a3 74 */
poushen 0:3de36cc169a3 75 void sequential_read(uint8_t *buffer, int buffer_size);
poushen 0:3de36cc169a3 76
poushen 1:0c876c06b026 77 /** Random read, read one or more memory data from assign memory address
poushen 0:3de36cc169a3 78 *
poushen 0:3de36cc169a3 79 * @param address eeprom memory address
poushen 1:0c876c06b026 80 * @param address_size should be 1 - 3 (ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 81 * @param buffer the start address point to buffer
poushen 0:3de36cc169a3 82 * @param buffer_size the length of buffer
poushen 0:3de36cc169a3 83 */
poushen 0:3de36cc169a3 84 void random_read(int address, int address_size, uint8_t *buffer, int buffer_size);
poushen 0:3de36cc169a3 85
poushen 1:0c876c06b026 86 /** byte write, write one byte to assign memory address
poushen 0:3de36cc169a3 87 *
poushen 0:3de36cc169a3 88 * @param address eeprom memory address
poushen 1:0c876c06b026 89 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 90 * @param data the byte data to write
poushen 0:3de36cc169a3 91 */
poushen 0:3de36cc169a3 92 void byte_write(int address, int address_size, uint8_t data, bool repeated=false);
poushen 0:3de36cc169a3 93
poushen 1:0c876c06b026 94 /** page write, write many bytes to assign memory address
poushen 1:0c876c06b026 95 * , do not deal with page size and aligned problem, be careful to use!!!
poushen 0:3de36cc169a3 96 *
poushen 0:3de36cc169a3 97 * @param address eeprom memory address
poushen 1:0c876c06b026 98 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 99 * @param buffer the page data to write
poushen 0:3de36cc169a3 100 */
poushen 0:3de36cc169a3 101 void page_write(int address, int address_size, uint8_t *buffer, int buffer_size, bool repeated=false);
poushen 0:3de36cc169a3 102
poushen 1:0c876c06b026 103 /** ack polling, wait for EEPROM write completed */
poushen 0:3de36cc169a3 104 void ack_polling(void);
poushen 0:3de36cc169a3 105
poushen 0:3de36cc169a3 106 private:
poushen 0:3de36cc169a3 107 I2C &i2c;
poushen 0:3de36cc169a3 108 char adr;
poushen 1:0c876c06b026 109 };
poushen 1:0c876c06b026 110
poushen 1:0c876c06b026 111 enum {
poushen 1:0c876c06b026 112 ONE_BYTE_ADDRESS = 1,
poushen 1:0c876c06b026 113 TWO_BYTES_ADDRESS,
poushen 1:0c876c06b026 114 THREE_BYTES_ADDRESS
poushen 1:0c876c06b026 115 };