Driver library for Microchip I2C EERAM (47x04 and 47x16) 4 kbit or 16 kbit EEPROM backed SRAM.

Dependents:   EERAM_example

Committer:
vargham
Date:
Tue Apr 25 15:05:37 2017 +0000
Revision:
0:19f9af07424a
Child:
2:bdbf9de0e985
EERAM initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vargham 0:19f9af07424a 1 /**
vargham 0:19f9af07424a 2 * @file EERAM.h
vargham 0:19f9af07424a 3 * @brief mbed driver for Microchip I2C EERAM devices (47x04 and 47x16)
vargham 0:19f9af07424a 4 * @author Mark Peter Vargha, vmp@varghamarkpeter.hu
vargham 0:19f9af07424a 5 * @version 1.0.0
vargham 0:19f9af07424a 6 *
vargham 0:19f9af07424a 7 * Copyright (c) 2017
vargham 0:19f9af07424a 8 *
vargham 0:19f9af07424a 9 * Licensed under the Apache License, Version 2.0 (the "License");
vargham 0:19f9af07424a 10 * you may not use this file except in compliance with the License.
vargham 0:19f9af07424a 11 * You may obtain a copy of the License at
vargham 0:19f9af07424a 12 *
vargham 0:19f9af07424a 13 * http://www.apache.org/licenses/LICENSE-2.0
vargham 0:19f9af07424a 14 *
vargham 0:19f9af07424a 15 * Unless required by applicable law or agreed to in writing, software
vargham 0:19f9af07424a 16 * distributed under the License is distributed on an "AS IS" BASIS,
vargham 0:19f9af07424a 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vargham 0:19f9af07424a 18 * See the License for the specific language governing permissions and
vargham 0:19f9af07424a 19 * limitations under the License.
vargham 0:19f9af07424a 20 */
vargham 0:19f9af07424a 21
vargham 0:19f9af07424a 22 #ifndef EERAM_h
vargham 0:19f9af07424a 23 #define EERAM_h
vargham 0:19f9af07424a 24
vargham 0:19f9af07424a 25 #include "mbed.h"
vargham 0:19f9af07424a 26
vargham 0:19f9af07424a 27 //#define DEBUG_EERAM
vargham 0:19f9af07424a 28
vargham 0:19f9af07424a 29 #ifdef DEBUG_EERAM
vargham 0:19f9af07424a 30 extern Serial serial;
vargham 0:19f9af07424a 31 #endif
vargham 0:19f9af07424a 32
vargham 0:19f9af07424a 33 union MemoryAddress
vargham 0:19f9af07424a 34 {
vargham 0:19f9af07424a 35 uint16_t address;
vargham 0:19f9af07424a 36 char bytes[2];
vargham 0:19f9af07424a 37 };
vargham 0:19f9af07424a 38
vargham 0:19f9af07424a 39 enum ProtectedMemoryArea
vargham 0:19f9af07424a 40 {
vargham 0:19f9af07424a 41 NONE = 0, U64, U32, U16, U8, U4, U2, ALL
vargham 0:19f9af07424a 42 };
vargham 0:19f9af07424a 43
vargham 0:19f9af07424a 44 /** An I2C EERAM interface to communicate with Microchip 47x04 and 47x16 devices
vargham 0:19f9af07424a 45 * 4 kbit (512 byte) or 16 kbit (2048 byte) EEPROM backed I2C SRAM
vargham 0:19f9af07424a 46 * The device could detect power down and stores SRAM contents in EEPROM. The SRAM is recalled from EEPROM on power up.
vargham 0:19f9af07424a 47 *
vargham 0:19f9af07424a 48 * <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/20005371C.pdf">47x04 and 47x16 datasheet</a>
vargham 0:19f9af07424a 49 * <a href="http://ww1.microchip.com/downloads/cn/AppNotes/cn588417.pdf">Recommended Usage of Microchip I2C EERAM Devices</a>
vargham 0:19f9af07424a 50 * <a href="http://ww1.microchip.com/downloads/en/AppNotes/00002257A.pdf">Choosing the Right EERAM VCAP Capacitor</a>
vargham 0:19f9af07424a 51 *
vargham 0:19f9af07424a 52 * Example:
vargham 0:19f9af07424a 53 * @code
vargham 0:19f9af07424a 54 #include "mbed.h"
vargham 0:19f9af07424a 55 #include "EERAM.h"
vargham 0:19f9af07424a 56
vargham 0:19f9af07424a 57 EERAM eeram(I2C_SDA, I2C_SCL, 2048);
vargham 0:19f9af07424a 58
vargham 0:19f9af07424a 59 int main()
vargham 0:19f9af07424a 60 {
vargham 0:19f9af07424a 61 if (!eeram.isReady(100)) //Checks device with 100 ms timeout
vargham 0:19f9af07424a 62 {
vargham 0:19f9af07424a 63 printf("Device is not present.");
vargham 0:19f9af07424a 64 while (1);
vargham 0:19f9af07424a 65 }
vargham 0:19f9af07424a 66 eeram.readStatus(); //Reads status register
vargham 0:19f9af07424a 67 eeram.setAutoStoreEnabled(true, true); //Set auto store on power down to true and stores if not stored before
vargham 0:19f9af07424a 68 while (1)
vargham 0:19f9af07424a 69 {
vargham 0:19f9af07424a 70 char dataStore[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
vargham 0:19f9af07424a 71 eeram.write(0x100, dataStore, 16); //We can not wear EEPROM out, so it is ok to write data to the device frequently.
vargham 0:19f9af07424a 72 wait(2.0);
vargham 0:19f9af07424a 73 char dataRead[16];
vargham 0:19f9af07424a 74 eeram.read(0x100, dataRead, 16);
vargham 0:19f9af07424a 75 wait(2.0);
vargham 0:19f9af07424a 76 }
vargham 0:19f9af07424a 77 }
vargham 0:19f9af07424a 78
vargham 0:19f9af07424a 79 * @endcode
vargham 0:19f9af07424a 80 */
vargham 0:19f9af07424a 81 class EERAM
vargham 0:19f9af07424a 82 {
vargham 0:19f9af07424a 83
vargham 0:19f9af07424a 84 public:
vargham 0:19f9af07424a 85
vargham 0:19f9af07424a 86 /** Create an I2C EERAM interface, connected to the specified pins, with specified size and with the specified address pins
vargham 0:19f9af07424a 87 * @param SDA I2C data line pin
vargham 0:19f9af07424a 88 * @param SCL I2C clock line pin
vargham 0:19f9af07424a 89 * @param memorySize Size of EERAM, 512 for 47x04 and 2048 for 47x16
vargham 0:19f9af07424a 90 * @param A1 EERAM A1 pin state (true = high, false = low)
vargham 0:19f9af07424a 91 * @param A2 EERAM A2 pin state (true = high, false = low)
vargham 0:19f9af07424a 92 */
vargham 0:19f9af07424a 93 EERAM(PinName SDA, PinName SCL, uint16_t memorySize, bool A1 = false, bool A2 = false) :
vargham 0:19f9af07424a 94 _i2c(SDA, SCL),
vargham 0:19f9af07424a 95 _memorySize(memorySize)
vargham 0:19f9af07424a 96 {
vargham 0:19f9af07424a 97 initialize(A1, A2);
vargham 0:19f9af07424a 98 };
vargham 0:19f9af07424a 99
vargham 0:19f9af07424a 100 /** Create an I2C EERAM interface, connected to the I2C, with specified size and with the specified address pins
vargham 0:19f9af07424a 101 * @param 12c I2C
vargham 0:19f9af07424a 102 * @param memorySize Size of EERAM, 512 for 47x04 and 2048 for 47x16
vargham 0:19f9af07424a 103 * @param A1 EERAM A1 pin state (true = high, false = low)
vargham 0:19f9af07424a 104 * @param A2 EERAM A2 pin state (true = high, false = low)
vargham 0:19f9af07424a 105 */
vargham 0:19f9af07424a 106 EERAM(I2C &i2c, uint16_t memorySize, bool A1 = false, bool A2 = false) :
vargham 0:19f9af07424a 107 _i2c(i2c),
vargham 0:19f9af07424a 108 _memorySize(memorySize)
vargham 0:19f9af07424a 109 {
vargham 0:19f9af07424a 110 initialize(A1, A2);
vargham 0:19f9af07424a 111 };
vargham 0:19f9af07424a 112
vargham 0:19f9af07424a 113 /** Writes data to the specified address
vargham 0:19f9af07424a 114 * @param address The 16 bit destination address
vargham 0:19f9af07424a 115 * @param data Pointer to the data buffer to read from
vargham 0:19f9af07424a 116 * @param length Data length
vargham 0:19f9af07424a 117 *
vargham 0:19f9af07424a 118 * @return
vargham 0:19f9af07424a 119 * true on success
vargham 0:19f9af07424a 120 * false on fail
vargham 0:19f9af07424a 121 */
vargham 0:19f9af07424a 122 bool write(uint16_t address, char *data, int length);
vargham 0:19f9af07424a 123
vargham 0:19f9af07424a 124 /** Reads data from the specified address
vargham 0:19f9af07424a 125 * @param address The 16 bit source address
vargham 0:19f9af07424a 126 * @param data Pointer to the data buffer to read to
vargham 0:19f9af07424a 127 * @param length Data length
vargham 0:19f9af07424a 128 *
vargham 0:19f9af07424a 129 * @return
vargham 0:19f9af07424a 130 * true on success
vargham 0:19f9af07424a 131 * false on fail
vargham 0:19f9af07424a 132 */
vargham 0:19f9af07424a 133 bool read(uint16_t address, char *data, int length);
vargham 0:19f9af07424a 134
vargham 0:19f9af07424a 135 /** Fills memory with the specified byte from the specified address
vargham 0:19f9af07424a 136 * @param address The 16 bit destination address
vargham 0:19f9af07424a 137 * @param data The byte to write
vargham 0:19f9af07424a 138 * @param length Memory are to fill with the data byte
vargham 0:19f9af07424a 139 *
vargham 0:19f9af07424a 140 * @return
vargham 0:19f9af07424a 141 * true on success
vargham 0:19f9af07424a 142 * false on fail
vargham 0:19f9af07424a 143 */
vargham 0:19f9af07424a 144 bool fillMemory(uint16_t address, char data, int length);
vargham 0:19f9af07424a 145
vargham 0:19f9af07424a 146 /** Fills the whole memory with the specified byte
vargham 0:19f9af07424a 147 * @param data The byte to write
vargham 0:19f9af07424a 148 *
vargham 0:19f9af07424a 149 * @return
vargham 0:19f9af07424a 150 * true on success
vargham 0:19f9af07424a 151 * false on fail
vargham 0:19f9af07424a 152 */
vargham 0:19f9af07424a 153 bool fillMemory(char data);
vargham 0:19f9af07424a 154
vargham 0:19f9af07424a 155 /** Continuously checks I2C EERAM device till ready or reaches timeout
vargham 0:19f9af07424a 156 * @param timeout_ms Timeout for busy-wait I2C device polling
vargham 0:19f9af07424a 157 *
vargham 0:19f9af07424a 158 * @return
vargham 0:19f9af07424a 159 * true on ready
vargham 0:19f9af07424a 160 * false on timeout
vargham 0:19f9af07424a 161 */
vargham 0:19f9af07424a 162 bool isReady(int timeout_ms);
vargham 0:19f9af07424a 163
vargham 0:19f9af07424a 164 /** Checks I2C EERAM device one time
vargham 0:19f9af07424a 165 *
vargham 0:19f9af07424a 166 * @return
vargham 0:19f9af07424a 167 * true on ready
vargham 0:19f9af07424a 168 * false on not ready
vargham 0:19f9af07424a 169 */
vargham 0:19f9af07424a 170 bool isReady();
vargham 0:19f9af07424a 171
vargham 0:19f9af07424a 172 /** Store SRAM in EEPROM
vargham 0:19f9af07424a 173 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 174 *
vargham 0:19f9af07424a 175 * @return
vargham 0:19f9af07424a 176 * true on success
vargham 0:19f9af07424a 177 * false on fail
vargham 0:19f9af07424a 178 */
vargham 0:19f9af07424a 179 bool store(bool block);
vargham 0:19f9af07424a 180
vargham 0:19f9af07424a 181 /** Recall SRAM from EEPROM
vargham 0:19f9af07424a 182 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 183 *
vargham 0:19f9af07424a 184 * @return
vargham 0:19f9af07424a 185 * true on success
vargham 0:19f9af07424a 186 * false on fail
vargham 0:19f9af07424a 187 */
vargham 0:19f9af07424a 188 bool recall(bool block);
vargham 0:19f9af07424a 189
vargham 0:19f9af07424a 190 /** Reads status register
vargham 0:19f9af07424a 191 *
vargham 0:19f9af07424a 192 * @return
vargham 0:19f9af07424a 193 * true on success
vargham 0:19f9af07424a 194 * false on fail
vargham 0:19f9af07424a 195 */
vargham 0:19f9af07424a 196 bool readStatus();
vargham 0:19f9af07424a 197
vargham 0:19f9af07424a 198 /** Gets status register
vargham 0:19f9af07424a 199 *
vargham 0:19f9af07424a 200 * @return The content of the 8 bit status register
vargham 0:19f9af07424a 201 */
vargham 0:19f9af07424a 202 inline uint8_t getStatus() const
vargham 0:19f9af07424a 203 {
vargham 0:19f9af07424a 204 return _status;
vargham 0:19f9af07424a 205 }
vargham 0:19f9af07424a 206
vargham 0:19f9af07424a 207 /** Writes the 8 bit status register to the I2C device
vargham 0:19f9af07424a 208 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 209 *
vargham 0:19f9af07424a 210 * @return
vargham 0:19f9af07424a 211 * true on success
vargham 0:19f9af07424a 212 * false on fail
vargham 0:19f9af07424a 213 */
vargham 0:19f9af07424a 214 bool writeStatus(bool block);
vargham 0:19f9af07424a 215
vargham 0:19f9af07424a 216 /** Writes the 8 bit status register to the I2C device if changed
vargham 0:19f9af07424a 217 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 218 */
vargham 0:19f9af07424a 219 void writeStatusIfChanged(bool block);
vargham 0:19f9af07424a 220
vargham 0:19f9af07424a 221 /** Sets protected memory area. The selected area will be write protected.
vargham 0:19f9af07424a 222 * @param protectedMemoryArea The enum represents the area from NONE through upper 64, 32, 16, 8, 4, 2 to ALL
vargham 0:19f9af07424a 223 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 224 */
vargham 0:19f9af07424a 225 void setProtectedMemoryArea(ProtectedMemoryArea protectedMemoryArea, bool store = false);
vargham 0:19f9af07424a 226
vargham 0:19f9af07424a 227 /** Gets protected memory area
vargham 0:19f9af07424a 228 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 229 */
vargham 0:19f9af07424a 230 ProtectedMemoryArea getProtectedMemoryArea();
vargham 0:19f9af07424a 231
vargham 0:19f9af07424a 232 /** Gets Memory Modified
vargham 0:19f9af07424a 233 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 234 * @return
vargham 0:19f9af07424a 235 * true The SRAM memory have been modified since the last store or recall operation
vargham 0:19f9af07424a 236 * false The SRAM memory have not been modified since the last store or recall operation
vargham 0:19f9af07424a 237 */
vargham 0:19f9af07424a 238 bool isMemoryModified();
vargham 0:19f9af07424a 239
vargham 0:19f9af07424a 240 /** Sets Auto Store Enabled
vargham 0:19f9af07424a 241 * @param enabled Auto store SRAM to EEPROM on power down enabled
vargham 0:19f9af07424a 242 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 243 */
vargham 0:19f9af07424a 244 void setAutoStoreEnabled(bool enabled, bool store = false);
vargham 0:19f9af07424a 245
vargham 0:19f9af07424a 246 /** Gets Auto Store Enabled
vargham 0:19f9af07424a 247 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 248 * @return
vargham 0:19f9af07424a 249 * true Auto Store is Enabled
vargham 0:19f9af07424a 250 * false Auto Store is not Enabled
vargham 0:19f9af07424a 251 */
vargham 0:19f9af07424a 252 bool isAutoStoreEnabled();
vargham 0:19f9af07424a 253
vargham 0:19f9af07424a 254 /** Sets event detected
vargham 0:19f9af07424a 255 * @param detected The value of the detected bit
vargham 0:19f9af07424a 256 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 257 */
vargham 0:19f9af07424a 258 void setEventDetected(bool detected, bool store);
vargham 0:19f9af07424a 259
vargham 0:19f9af07424a 260 /** Gets event detected
vargham 0:19f9af07424a 261 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 262 * @return
vargham 0:19f9af07424a 263 * true External store event detected (The HS pin pulled up)
vargham 0:19f9af07424a 264 * false External event not detected
vargham 0:19f9af07424a 265 */
vargham 0:19f9af07424a 266 bool isEventDetected();
vargham 0:19f9af07424a 267
vargham 0:19f9af07424a 268 /** Prints the SRAM content from the given address to the given serial port in human readable format in 1-32 byte long lines
vargham 0:19f9af07424a 269 * @param serial The port to print to
vargham 0:19f9af07424a 270 */
vargham 0:19f9af07424a 271 void dump(Serial &serial, uint16_t start, uint16_t length, int lineSize = 16);
vargham 0:19f9af07424a 272
vargham 0:19f9af07424a 273 /** Prints the whole SRAM content to the given serial port in human readable format in 16 byte long lines
vargham 0:19f9af07424a 274 * @param serial The port to print to
vargham 0:19f9af07424a 275 */
vargham 0:19f9af07424a 276 void dump(Serial &serial);
vargham 0:19f9af07424a 277
vargham 0:19f9af07424a 278 /** Prints the 8 bit status register's contents to the given serial port in human readable format
vargham 0:19f9af07424a 279 * @param serial The port to print to
vargham 0:19f9af07424a 280 */
vargham 0:19f9af07424a 281 void dumpRegisters(Serial &serial);
vargham 0:19f9af07424a 282
vargham 0:19f9af07424a 283 private:
vargham 0:19f9af07424a 284 static const uint8_t RW_BIT = 0;
vargham 0:19f9af07424a 285 static const uint8_t A1_BIT = 2;
vargham 0:19f9af07424a 286 static const uint8_t A2_BIT = 3;
vargham 0:19f9af07424a 287 static const uint8_t STATUS_AM_BIT = 7;
vargham 0:19f9af07424a 288 static const uint8_t STATUS_ASE_BIT = 1;
vargham 0:19f9af07424a 289 static const uint8_t STATUS_EVENT_BIT = 0;
vargham 0:19f9af07424a 290 static const uint8_t OPCODE_SRAM = 0b10100000;
vargham 0:19f9af07424a 291 static const uint8_t OPCODE_CONTROL = 0b00110000;
vargham 0:19f9af07424a 292 static const uint8_t REGISTER_STATUS = 0x0;
vargham 0:19f9af07424a 293 static const uint8_t REGISTER_COMMAND = 0x55;
vargham 0:19f9af07424a 294 static const uint8_t COMMAND_STORE = 0b00110011;
vargham 0:19f9af07424a 295 static const uint8_t COMMAND_RECALL = 0b11011101;
vargham 0:19f9af07424a 296 static const int TIME_RECALL_16_MS = 5;
vargham 0:19f9af07424a 297 static const int TIME_RECALL_04_MS = 2;
vargham 0:19f9af07424a 298 static const int TIME_STORE_16_MS = 25;
vargham 0:19f9af07424a 299 static const int TIME_STORE_04_MS = 8;
vargham 0:19f9af07424a 300 static const int TIME_STORE_STATUS_MS = 1;
vargham 0:19f9af07424a 301 I2C _i2c;
vargham 0:19f9af07424a 302 uint16_t _memorySize;
vargham 0:19f9af07424a 303 uint8_t _sramAddressWrite;
vargham 0:19f9af07424a 304 uint8_t _sramAddressRead;
vargham 0:19f9af07424a 305 uint8_t _controlAddressWrite;
vargham 0:19f9af07424a 306 uint8_t _controlAddressRead;
vargham 0:19f9af07424a 307 uint8_t _status;
vargham 0:19f9af07424a 308 uint8_t _statusToWrite;
vargham 0:19f9af07424a 309 void initialize(bool A1 = false, bool A2 = false);
vargham 0:19f9af07424a 310 bool checkAddressRange(uint16_t start, uint16_t length);
vargham 0:19f9af07424a 311 bool writeRegister(uint8_t registerAddress, uint8_t data);
vargham 0:19f9af07424a 312 bool setMemoryPointer(uint16_t address, bool stop = true);
vargham 0:19f9af07424a 313 };
vargham 0:19f9af07424a 314
vargham 0:19f9af07424a 315 #endif //EERAM_h