Martyn Gilbertson / M24512
Committer:
martyn gilbertson
Date:
Wed Oct 16 13:30:15 2019 +0100
Revision:
4:336ef5db5e78
Parent:
3:b6d7714cd171
Child:
5:431b0b0c00d3
v1.0.2

[*] Decreased retry limit as to not WDT
[+] Allow ready routine from public

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Martyn Gilbertson 0:11e6262c2981 1 /** ISL MBED Libraries
Martyn Gilbertson 0:11e6262c2981 2 * Copyright (C) 2019 - Invisible Systems Ltd. All Rights Reserved.
Martyn Gilbertson 0:11e6262c2981 3 *
Martyn Gilbertson 0:11e6262c2981 4 * <b> M24512.h</b>
Martyn Gilbertson 0:11e6262c2981 5 * <p> M24512 EEPROM Driver </p>
Martyn Gilbertson 3:b6d7714cd171 6 * @version 1.0.1
Martyn Gilbertson 0:11e6262c2981 7 * @since 06 June 2019
Martyn Gilbertson 0:11e6262c2981 8 * @author Martyn Gilbertson
Martyn Gilbertson 0:11e6262c2981 9 * <p>
Martyn Gilbertson 0:11e6262c2981 10 * v1.0.0 - 06 June 2019
Martyn Gilbertson 0:11e6262c2981 11 * [+] Initial release
Martyn Gilbertson 3:b6d7714cd171 12 * v1.0.1 - 16 September 2019
Martyn Gilbertson 3:b6d7714cd171 13 * [+] Add retry to Write()
martyn gilbertson 4:336ef5db5e78 14 * v1.0.2 - 16 October 2019
martyn gilbertson 4:336ef5db5e78 15 * [*] Decreased retry limit as to not WDT
martyn gilbertson 4:336ef5db5e78 16 * [+] Allow ready routine from public
Martyn Gilbertson 0:11e6262c2981 17 * </p>
Martyn Gilbertson 0:11e6262c2981 18 */
Martyn Gilbertson 0:11e6262c2981 19 #ifndef _M24512_H_
Martyn Gilbertson 0:11e6262c2981 20 #define _M24512_H_
Martyn Gilbertson 0:11e6262c2981 21
Martyn Gilbertson 2:1457e305e2b4 22 #include <stdint.h>
Martyn Gilbertson 2:1457e305e2b4 23 #include <i2c.h>
Martyn Gilbertson 0:11e6262c2981 24
Martyn Gilbertson 0:11e6262c2981 25 /** Driver for reading and writing to M24512 eeprom
Martyn Gilbertson 0:11e6262c2981 26 *
Martyn Gilbertson 0:11e6262c2981 27 * Example:
Martyn Gilbertson 0:11e6262c2981 28 * @code
Martyn Gilbertson 0:11e6262c2981 29 * // Write "test" to page 0 and read back
Martyn Gilbertson 0:11e6262c2981 30 * #include "M24512.h"
Martyn Gilbertson 0:11e6262c2981 31 *
Martyn Gilbertson 0:11e6262c2981 32 * M24512 eeprom(I2C_SDA, I2C_SCL);
Martyn Gilbertson 0:11e6262c2981 33 *
Martyn Gilbertson 0:11e6262c2981 34 * int main() {
Martyn Gilbertson 0:11e6262c2981 35 * M24512::status_t ret;
Martyn Gilbertson 0:11e6262c2981 36 * char data[32] = {'t','e','s','t'};
Martyn Gilbertson 0:11e6262c2981 37 *
Martyn Gilbertson 0:11e6262c2981 38 * ret = eeprom.write(0, (char*)data, 4);
Martyn Gilbertson 0:11e6262c2981 39 * if ( ret != M24512::M24512_SUCCESS )
Martyn Gilbertson 0:11e6262c2981 40 * {
Martyn Gilbertson 0:11e6262c2981 41 * printf("Error writing this! %2.2X\n", ret );
Martyn Gilbertson 0:11e6262c2981 42 * }
Martyn Gilbertson 0:11e6262c2981 43 *
Martyn Gilbertson 0:11e6262c2981 44 * memset( data, 0, sizeof(data) );
Martyn Gilbertson 0:11e6262c2981 45 * ret = eeprom.read(0, (char*)&data, 4);
Martyn Gilbertson 0:11e6262c2981 46 * if ( ret != M24512::M24512_SUCCESS )
Martyn Gilbertson 0:11e6262c2981 47 * {
Martyn Gilbertson 0:11e6262c2981 48 * printf("Error reading %2.2X!\n", ret );
Martyn Gilbertson 0:11e6262c2981 49 * }
Martyn Gilbertson 0:11e6262c2981 50 * printf("Read: %s\n", data );
Martyn Gilbertson 0:11e6262c2981 51 * return 0;
Martyn Gilbertson 0:11e6262c2981 52 * }
Martyn Gilbertson 0:11e6262c2981 53 * @endcode
Martyn Gilbertson 0:11e6262c2981 54 */
Martyn Gilbertson 2:1457e305e2b4 55 class M24512
Martyn Gilbertson 0:11e6262c2981 56 {
Martyn Gilbertson 0:11e6262c2981 57
Martyn Gilbertson 0:11e6262c2981 58 public:
Martyn Gilbertson 0:11e6262c2981 59
Martyn Gilbertson 0:11e6262c2981 60 /** MBED uses 8 bit addressing so shift to 7bit
Martyn Gilbertson 0:11e6262c2981 61 * Default value 0x50 is with address pins hi-z
Martyn Gilbertson 0:11e6262c2981 62 */
Martyn Gilbertson 0:11e6262c2981 63 #define M24512_DEFAULT_ADDRESS (uint8_t)(0x50 << 1)
Martyn Gilbertson 0:11e6262c2981 64
Martyn Gilbertson 0:11e6262c2981 65
Martyn Gilbertson 0:11e6262c2981 66 /** Return values for each function
Martyn Gilbertson 0:11e6262c2981 67 */
Martyn Gilbertson 0:11e6262c2981 68 typedef enum {
Martyn Gilbertson 1:23935352bb22 69 /*! Succes */
Martyn Gilbertson 0:11e6262c2981 70 M24512_SUCCESS = 0,
Martyn Gilbertson 1:23935352bb22 71 /*! I2C Ack error */
Martyn Gilbertson 0:11e6262c2981 72 M24512_I2C_ERROR = 1,
Martyn Gilbertson 1:23935352bb22 73 /*! Device Ready timed out */
Martyn Gilbertson 0:11e6262c2981 74 M24512_RDY_TIMEOUT = 2,
Martyn Gilbertson 1:23935352bb22 75 /*! Memory overflow */
Martyn Gilbertson 0:11e6262c2981 76 M24512_MEM_OVERFLOW = 3
Martyn Gilbertson 0:11e6262c2981 77 } status_t;
Martyn Gilbertson 0:11e6262c2981 78
Martyn Gilbertson 0:11e6262c2981 79
Martyn Gilbertson 0:11e6262c2981 80 /** Initialise M24512 Interface
Martyn Gilbertson 0:11e6262c2981 81 *
Martyn Gilbertson 0:11e6262c2981 82 * @param sda - I2C Data pin
Martyn Gilbertson 0:11e6262c2981 83 * @param scl - I2C Clock pin
Martyn Gilbertson 0:11e6262c2981 84 * @param addr - Hardware address of device (defaults to 0x50)
Martyn Gilbertson 0:11e6262c2981 85 */
Martyn Gilbertson 0:11e6262c2981 86 M24512(PinName sda, PinName scl, uint8_t address = M24512_DEFAULT_ADDRESS);
Martyn Gilbertson 0:11e6262c2981 87
Martyn Gilbertson 0:11e6262c2981 88
Martyn Gilbertson 0:11e6262c2981 89 /** Destructor
Martyn Gilbertson 0:11e6262c2981 90 */
Martyn Gilbertson 0:11e6262c2981 91 ~M24512(void);
Martyn Gilbertson 0:11e6262c2981 92
Martyn Gilbertson 0:11e6262c2981 93
Martyn Gilbertson 0:11e6262c2981 94 /** Read continuous from address
Martyn Gilbertson 0:11e6262c2981 95 *
Martyn Gilbertson 0:11e6262c2981 96 * @param addr - address to start reading from
Martyn Gilbertson 0:11e6262c2981 97 * @param data - pointer to data buffer (must be allocated)
Martyn Gilbertson 0:11e6262c2981 98 * @param size - size of data to read back into data pointer
Martyn Gilbertson 0:11e6262c2981 99 */
Martyn Gilbertson 0:11e6262c2981 100 status_t read(uint16_t addr, char* data, uint16_t size);
Martyn Gilbertson 0:11e6262c2981 101
Martyn Gilbertson 0:11e6262c2981 102
Martyn Gilbertson 0:11e6262c2981 103 /** Write continuous to address
Martyn Gilbertson 0:11e6262c2981 104 *
Martyn Gilbertson 0:11e6262c2981 105 * @param addr - address to start writing at
Martyn Gilbertson 0:11e6262c2981 106 * @param data - pointer to data buffer must be allocated
Martyn Gilbertson 0:11e6262c2981 107 * @param size - size of data to write
Martyn Gilbertson 0:11e6262c2981 108 */
Martyn Gilbertson 0:11e6262c2981 109 status_t write(uint16_t addr, const char* data, uint16_t size);
Martyn Gilbertson 0:11e6262c2981 110
Martyn Gilbertson 0:11e6262c2981 111 /** Set the i2c frequency
Martyn Gilbertson 0:11e6262c2981 112 *
Martyn Gilbertson 0:11e6262c2981 113 * @param hz - frequency in hertz
Martyn Gilbertson 0:11e6262c2981 114 */
Martyn Gilbertson 0:11e6262c2981 115 void frequency(uint32_t hz);
Martyn Gilbertson 0:11e6262c2981 116
Martyn Gilbertson 0:11e6262c2981 117
Martyn Gilbertson 0:11e6262c2981 118 /** Get page size
Martyn Gilbertson 0:11e6262c2981 119 */
Martyn Gilbertson 0:11e6262c2981 120 uint16_t get_page_size() const;
Martyn Gilbertson 0:11e6262c2981 121
Martyn Gilbertson 0:11e6262c2981 122
Martyn Gilbertson 0:11e6262c2981 123 /** Get page count
Martyn Gilbertson 0:11e6262c2981 124 */
Martyn Gilbertson 0:11e6262c2981 125 uint16_t get_page_count() const;
Martyn Gilbertson 0:11e6262c2981 126
Martyn Gilbertson 0:11e6262c2981 127
Martyn Gilbertson 0:11e6262c2981 128 /** Get memory size in KiB
Martyn Gilbertson 0:11e6262c2981 129 */
Martyn Gilbertson 0:11e6262c2981 130 uint32_t get_total_memory() const;
Martyn Gilbertson 0:11e6262c2981 131
martyn gilbertson 4:336ef5db5e78 132
martyn gilbertson 4:336ef5db5e78 133 /** Check status of Memory chip after writing data
martyn gilbertson 4:336ef5db5e78 134 *
martyn gilbertson 4:336ef5db5e78 135 * @returns - @see status_t enum typedef
martyn gilbertson 4:336ef5db5e78 136 */
martyn gilbertson 4:336ef5db5e78 137 status_t ready(void);
martyn gilbertson 4:336ef5db5e78 138
Martyn Gilbertson 0:11e6262c2981 139 private:
Martyn Gilbertson 0:11e6262c2981 140
Martyn Gilbertson 0:11e6262c2981 141 /*! i2c driver class */
Martyn Gilbertson 2:1457e305e2b4 142 mbed::I2C _i2c;
Martyn Gilbertson 0:11e6262c2981 143
Martyn Gilbertson 0:11e6262c2981 144 /*! memory address */
Martyn Gilbertson 0:11e6262c2981 145 uint8_t _addr;
Martyn Gilbertson 0:11e6262c2981 146
Martyn Gilbertson 0:11e6262c2981 147 /** Write to single page
Martyn Gilbertson 0:11e6262c2981 148 * @note this will only write a maximum of %page_size%
Martyn Gilbertson 0:11e6262c2981 149 *
Martyn Gilbertson 0:11e6262c2981 150 * @param addr - address to start writing at
Martyn Gilbertson 0:11e6262c2981 151 * @param data - pointer to data buffer must be allocated
Martyn Gilbertson 0:11e6262c2981 152 * @param size - size of data to write maximum %page_size%
Martyn Gilbertson 0:11e6262c2981 153 */
Martyn Gilbertson 0:11e6262c2981 154 status_t write_page(uint16_t addr, const char* data, uint16_t size);
Martyn Gilbertson 0:11e6262c2981 155
martyn gilbertson 4:336ef5db5e78 156
Martyn Gilbertson 0:11e6262c2981 157 };
Martyn Gilbertson 0:11e6262c2981 158
Martyn Gilbertson 0:11e6262c2981 159 #endif /* _M24512_H_ */
Martyn Gilbertson 0:11e6262c2981 160