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:
2:ce12a405cd3a
make sample more complete.

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 2:ce12a405cd3a 12 #ifndef _EEPROM_H_
poushen 2:ce12a405cd3a 13 #define _EEPROM_H_
poushen 0:3de36cc169a3 14
poushen 0:3de36cc169a3 15 #include "mbed.h"
poushen 0:3de36cc169a3 16
poushen 0:3de36cc169a3 17 #define EEPROM_ADDR 0xA0
poushen 0:3de36cc169a3 18
poushen 1:0c876c06b026 19 /** eeprom Class Library
poushen 1:0c876c06b026 20 * to provide very simple interface for mbed
poushen 1:0c876c06b026 21 *
poushen 1:0c876c06b026 22 * Example:
poushen 1:0c876c06b026 23 * @code
poushen 1:0c876c06b026 24 * #include "mbed.h"
poushen 1:0c876c06b026 25 * #include "eeprom.h"
poushen 1:0c876c06b026 26 *
poushen 3:8ddab67b62c3 27 * #define BUFFER_SIZE 64
poushen 3:8ddab67b62c3 28 *
poushen 1:0c876c06b026 29 * // make eeprom instance using I2C object.
poushen 1:0c876c06b026 30 * // with default slave address 0xA0 (0x50 in 7bit format)
poushen 1:0c876c06b026 31 * // test ok with 24FC256 EEPROM
poushen 1:0c876c06b026 32 * I2C i2c(dp5,dp27);
poushen 1:0c876c06b026 33 * eeprom epm(i2c);
poushen 1:0c876c06b026 34 *
poushen 3:8ddab67b62c3 35 * // import!!! must prefix 3 bytes for memory address
poushen 3:8ddab67b62c3 36 * uint8_t buffer[BUFFER_SIZE + 3];
poushen 3:8ddab67b62c3 37 *
poushen 1:0c876c06b026 38 * int main()
poushen 1:0c876c06b026 39 * {
poushen 3:8ddab67b62c3 40 * printf("LPC1114 demo.\n\r");
poushen 3:8ddab67b62c3 41 *
poushen 3:8ddab67b62c3 42 * // -------- page write --------------------
poushen 3:8ddab67b62c3 43 * for (int i=0; i<BUFFER_SIZE; i++)
poushen 3:8ddab67b62c3 44 * buffer[i+3] = i; // for prefix 3 memory address
poushen 3:8ddab67b62c3 45 *
poushen 3:8ddab67b62c3 46 * epm.page_write(12288, TWO_BYTES_ADDRESS, buffer, BUFFER_SIZE);
poushen 3:8ddab67b62c3 47 * //wait(0.008);
poushen 3:8ddab67b62c3 48 * epm.ack_polling();
poushen 3:8ddab67b62c3 49 *
poushen 3:8ddab67b62c3 50 * // -------- current read ------------------
poushen 3:8ddab67b62c3 51 * printf("below shold be 00 01 ... 3f\n\r");
poushen 1:0c876c06b026 52 * epm.write_address(12288, TWO_BYTES_ADDRESS);
poushen 1:0c876c06b026 53 *
poushen 3:8ddab67b62c3 54 * for (int i=0; i<BUFFER_SIZE; i++) {
poushen 1:0c876c06b026 55 * printf("%.2x ", epm.current_read());
poushen 1:0c876c06b026 56 * }
poushen 1:0c876c06b026 57 * printf("\n\r");
poushen 3:8ddab67b62c3 58 *
poushen 3:8ddab67b62c3 59 * // -------- byte write --------------------
poushen 3:8ddab67b62c3 60 * epm.byte_write(12288, TWO_BYTES_ADDRESS, 0xAA);
poushen 3:8ddab67b62c3 61 * epm.ack_polling();
poushen 3:8ddab67b62c3 62 *
poushen 3:8ddab67b62c3 63 * // -------- sequential read ---------------
poushen 3:8ddab67b62c3 64 * printf("below shold be aa 01 02 ... 3f\n\r");
poushen 3:8ddab67b62c3 65 * epm.write_address(12288, TWO_BYTES_ADDRESS);
poushen 3:8ddab67b62c3 66 *
poushen 3:8ddab67b62c3 67 * uint8_t data[BUFFER_SIZE];
poushen 3:8ddab67b62c3 68 * epm.sequential_read(data, BUFFER_SIZE);
poushen 3:8ddab67b62c3 69 * for (int i=0; i<BUFFER_SIZE; i++) {
poushen 3:8ddab67b62c3 70 * printf("%.2x ", data[i]);
poushen 3:8ddab67b62c3 71 * }
poushen 3:8ddab67b62c3 72 * printf("\n\r");
poushen 3:8ddab67b62c3 73 *
poushen 3:8ddab67b62c3 74 * // -------- byte write --------------------
poushen 3:8ddab67b62c3 75 * epm.byte_write(12289, TWO_BYTES_ADDRESS, 0xBB);
poushen 3:8ddab67b62c3 76 * epm.ack_polling();
poushen 3:8ddab67b62c3 77 *
poushen 3:8ddab67b62c3 78 * // -------- random read -------------------
poushen 3:8ddab67b62c3 79 * printf("below shold be aa bb 02 03 ... 3f\n\r");
poushen 3:8ddab67b62c3 80 * epm.random_read(12288, TWO_BYTES_ADDRESS, buffer, 64);
poushen 3:8ddab67b62c3 81 * for (int i=0; i<64; i++) {
poushen 3:8ddab67b62c3 82 * printf("%.2x ", buffer[i]);
poushen 3:8ddab67b62c3 83 * }
poushen 3:8ddab67b62c3 84 * printf("\n\r");
poushen 1:0c876c06b026 85 *
poushen 1:0c876c06b026 86 * while(1);
poushen 1:0c876c06b026 87 * }
poushen 1:0c876c06b026 88 * @endcode
poushen 1:0c876c06b026 89 */
poushen 0:3de36cc169a3 90 class eeprom
poushen 0:3de36cc169a3 91 {
poushen 0:3de36cc169a3 92 public:
poushen 0:3de36cc169a3 93 /** Create a eeprom instance connected to specified I2C pins with specified address
poushen 0:3de36cc169a3 94 *
poushen 0:3de36cc169a3 95 * @param i2c_obj I2C object (instance)
poushen 0:3de36cc169a3 96 * @param address (option) I2C-bus slave address (default: 0xA0)
poushen 0:3de36cc169a3 97 */
poushen 0:3de36cc169a3 98 eeprom(I2C &i2c_obj, char address = EEPROM_ADDR);
poushen 0:3de36cc169a3 99
poushen 0:3de36cc169a3 100 /** Initialization */
poushen 0:3de36cc169a3 101 void init(void);
poushen 0:3de36cc169a3 102
poushen 1:0c876c06b026 103 /** Write address with specify address size
poushen 0:3de36cc169a3 104 *
poushen 0:3de36cc169a3 105 * @param address eeprom memory address
poushen 1:0c876c06b026 106 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 107 */
poushen 0:3de36cc169a3 108 void write_address(int address, int address_size, bool repeated=false);
poushen 0:3de36cc169a3 109
poushen 1:0c876c06b026 110 /** Current read, read the current memory data
poushen 0:3de36cc169a3 111 *
poushen 1:0c876c06b026 112 * @return the current memory data
poushen 0:3de36cc169a3 113 */
poushen 1:0c876c06b026 114 uint8_t current_read(void);
poushen 0:3de36cc169a3 115
poushen 1:0c876c06b026 116 /** Sequential read, read one or many bytes from current memory address
poushen 0:3de36cc169a3 117 *
poushen 0:3de36cc169a3 118 * @param buffer the start address point to buffer
poushen 0:3de36cc169a3 119 * @param buffer_size the length of buffer
poushen 0:3de36cc169a3 120 */
poushen 0:3de36cc169a3 121 void sequential_read(uint8_t *buffer, int buffer_size);
poushen 0:3de36cc169a3 122
poushen 1:0c876c06b026 123 /** Random read, read one or more memory data from assign memory address
poushen 0:3de36cc169a3 124 *
poushen 0:3de36cc169a3 125 * @param address eeprom memory address
poushen 1:0c876c06b026 126 * @param address_size should be 1 - 3 (ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 127 * @param buffer the start address point to buffer
poushen 0:3de36cc169a3 128 * @param buffer_size the length of buffer
poushen 0:3de36cc169a3 129 */
poushen 0:3de36cc169a3 130 void random_read(int address, int address_size, uint8_t *buffer, int buffer_size);
poushen 0:3de36cc169a3 131
poushen 1:0c876c06b026 132 /** byte write, write one byte to assign memory address
poushen 0:3de36cc169a3 133 *
poushen 0:3de36cc169a3 134 * @param address eeprom memory address
poushen 1:0c876c06b026 135 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 136 * @param data the byte data to write
poushen 0:3de36cc169a3 137 */
poushen 0:3de36cc169a3 138 void byte_write(int address, int address_size, uint8_t data, bool repeated=false);
poushen 0:3de36cc169a3 139
poushen 1:0c876c06b026 140 /** page write, write many bytes to assign memory address
poushen 1:0c876c06b026 141 * , do not deal with page size and aligned problem, be careful to use!!!
poushen 0:3de36cc169a3 142 *
poushen 0:3de36cc169a3 143 * @param address eeprom memory address
poushen 1:0c876c06b026 144 * @param address_size should be 1 - 3(ONE_BYTE_ADDRESS, TWO_BYTES_ADDRESS, THREE_BYTES_ADDRESS)
poushen 0:3de36cc169a3 145 * @param buffer the page data to write
poushen 0:3de36cc169a3 146 */
poushen 0:3de36cc169a3 147 void page_write(int address, int address_size, uint8_t *buffer, int buffer_size, bool repeated=false);
poushen 0:3de36cc169a3 148
poushen 1:0c876c06b026 149 /** ack polling, wait for EEPROM write completed */
poushen 0:3de36cc169a3 150 void ack_polling(void);
poushen 0:3de36cc169a3 151
poushen 0:3de36cc169a3 152 private:
poushen 0:3de36cc169a3 153 I2C &i2c;
poushen 0:3de36cc169a3 154 char adr;
poushen 1:0c876c06b026 155 };
poushen 1:0c876c06b026 156
poushen 1:0c876c06b026 157 enum {
poushen 1:0c876c06b026 158 ONE_BYTE_ADDRESS = 1,
poushen 1:0c876c06b026 159 TWO_BYTES_ADDRESS,
poushen 1:0c876c06b026 160 THREE_BYTES_ADDRESS
poushen 1:0c876c06b026 161 };
poushen 2:ce12a405cd3a 162
poushen 2:ce12a405cd3a 163 #endif