a simple wrapper above I2C to provider EEPROM access API
Dependents: ou_mbed_oled ou_mbed_eeprom ou_mbed_tmp102
eeprom.h@1:0c876c06b026, 2018-06-15 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |