Martyn Gilbertson / M24512
Committer:
Martyn Gilbertson
Date:
Mon Sep 16 16:30:00 2019 +0100
Revision:
3:b6d7714cd171
Parent:
2:1457e305e2b4
Child:
4:336ef5db5e78
v1.0.1

[+] retries on i2c write command

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