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

Dependents:   EERAM_example

Committer:
vargham
Date:
Thu Apr 27 17:33:49 2017 +0000
Revision:
3:a869096d7a5d
Parent:
2:bdbf9de0e985
Child:
4:fd84e2f0d1de
Added array handling.

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 3:a869096d7a5d 5 * @version 1.2.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 2:bdbf9de0e985 57 EERAM eeram(PC_9, PA_8, 2048); //SDA, SCL
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 2:bdbf9de0e985 76 float floatToWrite = -1.976f;
vargham 2:bdbf9de0e985 77 const uint16_t address = 0x200;
vargham 2:bdbf9de0e985 78 eeram.writeValue(address, &floatToWrite);
vargham 2:bdbf9de0e985 79 wait(2.0);
vargham 2:bdbf9de0e985 80 float floatToRead = 0;
vargham 2:bdbf9de0e985 81 eeram.readValue(address, &floatToWrite);
vargham 2:bdbf9de0e985 82 wait(2.0);
vargham 0:19f9af07424a 83 }
vargham 0:19f9af07424a 84 }
vargham 0:19f9af07424a 85
vargham 0:19f9af07424a 86 * @endcode
vargham 0:19f9af07424a 87 */
vargham 0:19f9af07424a 88 class EERAM
vargham 0:19f9af07424a 89 {
vargham 0:19f9af07424a 90
vargham 0:19f9af07424a 91 public:
vargham 0:19f9af07424a 92
vargham 0:19f9af07424a 93 /** Create an I2C EERAM interface, connected to the specified pins, with specified size and with the specified address pins
vargham 0:19f9af07424a 94 * @param SDA I2C data line pin
vargham 0:19f9af07424a 95 * @param SCL I2C clock line pin
vargham 0:19f9af07424a 96 * @param memorySize Size of EERAM, 512 for 47x04 and 2048 for 47x16
vargham 0:19f9af07424a 97 * @param A1 EERAM A1 pin state (true = high, false = low)
vargham 0:19f9af07424a 98 * @param A2 EERAM A2 pin state (true = high, false = low)
vargham 0:19f9af07424a 99 */
vargham 0:19f9af07424a 100 EERAM(PinName SDA, PinName SCL, uint16_t memorySize, bool A1 = false, bool A2 = false) :
vargham 0:19f9af07424a 101 _i2c(SDA, SCL),
vargham 0:19f9af07424a 102 _memorySize(memorySize)
vargham 0:19f9af07424a 103 {
vargham 0:19f9af07424a 104 initialize(A1, A2);
vargham 0:19f9af07424a 105 };
vargham 0:19f9af07424a 106
vargham 2:bdbf9de0e985 107 /** Create an I2C EERAM interface, connected to the I2C, with specified size and with the specified address pins.
vargham 0:19f9af07424a 108 * @param 12c I2C
vargham 0:19f9af07424a 109 * @param memorySize Size of EERAM, 512 for 47x04 and 2048 for 47x16
vargham 0:19f9af07424a 110 * @param A1 EERAM A1 pin state (true = high, false = low)
vargham 0:19f9af07424a 111 * @param A2 EERAM A2 pin state (true = high, false = low)
vargham 0:19f9af07424a 112 */
vargham 0:19f9af07424a 113 EERAM(I2C &i2c, uint16_t memorySize, bool A1 = false, bool A2 = false) :
vargham 0:19f9af07424a 114 _i2c(i2c),
vargham 0:19f9af07424a 115 _memorySize(memorySize)
vargham 0:19f9af07424a 116 {
vargham 0:19f9af07424a 117 initialize(A1, A2);
vargham 0:19f9af07424a 118 };
vargham 0:19f9af07424a 119
vargham 3:a869096d7a5d 120 /** Puts the given 16 bit SRAM address into the first two bytes of the given buffer. The buffer size shall be minimum two bytes. No length check.
vargham 2:bdbf9de0e985 121 */
vargham 2:bdbf9de0e985 122 static void putAddressIntoBuffer(uint16_t address, char *data);
vargham 2:bdbf9de0e985 123
vargham 3:a869096d7a5d 124 /** Copies the bytes from the given memory area to the given buffer. Uses the size of T to determine write length.
vargham 2:bdbf9de0e985 125 * @param buffer Buffer to put bytes into
vargham 2:bdbf9de0e985 126 * @param param Pointer to the memory location
vargham 2:bdbf9de0e985 127 *
vargham 2:bdbf9de0e985 128 * @return Number of written bytes.
vargham 2:bdbf9de0e985 129 */
vargham 2:bdbf9de0e985 130 template <typename T>
vargham 3:a869096d7a5d 131 static int putValueIntoBuffer(char *buffer, const int bufferSize, T *param)
vargham 2:bdbf9de0e985 132 {
vargham 2:bdbf9de0e985 133 const int length = sizeof(T);
vargham 3:a869096d7a5d 134 if (length <= bufferSize)
vargham 3:a869096d7a5d 135 {
vargham 3:a869096d7a5d 136 char *bytes = static_cast<char*>(static_cast<void*>(param));
vargham 3:a869096d7a5d 137 memcpy(buffer, bytes, length);
vargham 3:a869096d7a5d 138 return length;
vargham 3:a869096d7a5d 139 }
vargham 3:a869096d7a5d 140 else
vargham 3:a869096d7a5d 141 {
vargham 3:a869096d7a5d 142 return 0;
vargham 3:a869096d7a5d 143 }
vargham 2:bdbf9de0e985 144 }
vargham 2:bdbf9de0e985 145
vargham 3:a869096d7a5d 146 /** Copies the bytes from the given buffer to the given memory area. Uses the size of T to determine read length.
vargham 2:bdbf9de0e985 147 * @param buffer Buffer to get bytes from
vargham 2:bdbf9de0e985 148 * @param param Pointer to the memory location
vargham 2:bdbf9de0e985 149 *
vargham 2:bdbf9de0e985 150 * @return Number of read bytes.
vargham 2:bdbf9de0e985 151 */
vargham 2:bdbf9de0e985 152 template <typename T>
vargham 3:a869096d7a5d 153 static int getValueFromBuffer(char *buffer, const int bufferSize, T *param)
vargham 2:bdbf9de0e985 154 {
vargham 2:bdbf9de0e985 155 const int length = sizeof(T);
vargham 3:a869096d7a5d 156 if (length <= bufferSize)
vargham 3:a869096d7a5d 157 {
vargham 3:a869096d7a5d 158 char *bytes = static_cast<char*>(static_cast<void*>(param));
vargham 3:a869096d7a5d 159 memcpy(bytes, buffer, length);
vargham 3:a869096d7a5d 160 return length;
vargham 3:a869096d7a5d 161 }
vargham 3:a869096d7a5d 162 else
vargham 3:a869096d7a5d 163 {
vargham 3:a869096d7a5d 164 return 0;
vargham 3:a869096d7a5d 165 }
vargham 2:bdbf9de0e985 166 }
vargham 2:bdbf9de0e985 167
vargham 2:bdbf9de0e985 168 /** Copies the bytes from the given memory area to the given address of the EERAM. Uses the size of T to determine write length.
vargham 3:a869096d7a5d 169 * @param source Pointer to the memory location where copy from
vargham 3:a869096d7a5d 170 *
vargham 3:a869096d7a5d 171 * @return Number of written bytes.
vargham 3:a869096d7a5d 172 */
vargham 3:a869096d7a5d 173 template <typename T>
vargham 3:a869096d7a5d 174 int writeValue(uint16_t address, T *source)
vargham 3:a869096d7a5d 175 {
vargham 3:a869096d7a5d 176 bool success = false;
vargham 3:a869096d7a5d 177 const int bufferSize = sizeof(T) + 2;
vargham 3:a869096d7a5d 178 char buffer[bufferSize];
vargham 3:a869096d7a5d 179 putAddressIntoBuffer(address, buffer);
vargham 3:a869096d7a5d 180 putValueIntoBuffer(buffer + 2, bufferSize - 2, source);
vargham 3:a869096d7a5d 181 success = write(buffer, bufferSize);
vargham 3:a869096d7a5d 182 return success ? bufferSize - 2 : 0;
vargham 3:a869096d7a5d 183 }
vargham 3:a869096d7a5d 184
vargham 3:a869096d7a5d 185 /** Copies the bytes from the given memory area to the given address of the EERAM. Uses the size of T and the array length to determine write length.
vargham 3:a869096d7a5d 186 * @param sourceArray Pointer to the array where copy from
vargham 3:a869096d7a5d 187 * @param length Length of the array
vargham 2:bdbf9de0e985 188 *
vargham 2:bdbf9de0e985 189 * @return Number of written bytes.
vargham 2:bdbf9de0e985 190 */
vargham 2:bdbf9de0e985 191 template <typename T>
vargham 3:a869096d7a5d 192 int writeArray(uint16_t address, T *sourceArray, const int length)
vargham 2:bdbf9de0e985 193 {
vargham 3:a869096d7a5d 194 uint16_t addressPtr = address;
vargham 3:a869096d7a5d 195 for (int i = 0; i < length; i++)
vargham 3:a869096d7a5d 196 {
vargham 3:a869096d7a5d 197 int writtenBytes = writeValue(addressPtr, &sourceArray[i]);
vargham 3:a869096d7a5d 198 if (writtenBytes == 0) break;
vargham 3:a869096d7a5d 199 addressPtr += writtenBytes;
vargham 3:a869096d7a5d 200 }
vargham 3:a869096d7a5d 201 return addressPtr - address;
vargham 2:bdbf9de0e985 202 }
vargham 2:bdbf9de0e985 203
vargham 2:bdbf9de0e985 204 /** Copies the bytes from the given EERAM address to the given memory area. Uses the size of T to determine read length.
vargham 3:a869096d7a5d 205 * @param destination Pointer to the memory location where copy to
vargham 2:bdbf9de0e985 206 *
vargham 2:bdbf9de0e985 207 * @return Number of read bytes.
vargham 2:bdbf9de0e985 208 */
vargham 2:bdbf9de0e985 209 template <typename T>
vargham 3:a869096d7a5d 210 int readValue(uint16_t address, T *destination)
vargham 2:bdbf9de0e985 211 {
vargham 2:bdbf9de0e985 212 bool success = false;
vargham 3:a869096d7a5d 213 const int bufferSize = sizeof(T);
vargham 3:a869096d7a5d 214 char buffer[bufferSize];
vargham 3:a869096d7a5d 215 success = read(address, buffer, bufferSize);
vargham 2:bdbf9de0e985 216 if (success)
vargham 2:bdbf9de0e985 217 {
vargham 3:a869096d7a5d 218 getValueFromBuffer(buffer, bufferSize, destination);
vargham 2:bdbf9de0e985 219 }
vargham 3:a869096d7a5d 220 return success ? bufferSize : 0;
vargham 3:a869096d7a5d 221 }
vargham 3:a869096d7a5d 222
vargham 3:a869096d7a5d 223 /** Copies the bytes from the given EERAM address to the given memory area. Uses the size of T and the array length to determine read length.
vargham 3:a869096d7a5d 224 * @param destinationArray Pointer to the array where copy to
vargham 3:a869096d7a5d 225 * @param length Length of the array
vargham 3:a869096d7a5d 226 *
vargham 3:a869096d7a5d 227 * @return Number of read bytes.
vargham 3:a869096d7a5d 228 */
vargham 3:a869096d7a5d 229 template <typename T>
vargham 3:a869096d7a5d 230 int readArray(uint16_t address, T *destinationArray, const int length)
vargham 3:a869096d7a5d 231 {
vargham 3:a869096d7a5d 232 uint16_t addressPtr = address;
vargham 3:a869096d7a5d 233 for (int i = 0; i < length; i++)
vargham 3:a869096d7a5d 234 {
vargham 3:a869096d7a5d 235 int readBytes = readValue(addressPtr, &destinationArray[i]);
vargham 3:a869096d7a5d 236 if (readBytes == 0) break;
vargham 3:a869096d7a5d 237 addressPtr += readBytes;
vargham 3:a869096d7a5d 238 }
vargham 3:a869096d7a5d 239 return addressPtr - address;
vargham 2:bdbf9de0e985 240 }
vargham 2:bdbf9de0e985 241
vargham 2:bdbf9de0e985 242 /** Writes data to the specified address.
vargham 0:19f9af07424a 243 * @param address The 16 bit destination address
vargham 0:19f9af07424a 244 * @param data Pointer to the data buffer to read from
vargham 0:19f9af07424a 245 * @param length Data length
vargham 0:19f9af07424a 246 *
vargham 0:19f9af07424a 247 * @return
vargham 0:19f9af07424a 248 * true on success
vargham 0:19f9af07424a 249 * false on fail
vargham 0:19f9af07424a 250 */
vargham 0:19f9af07424a 251 bool write(uint16_t address, char *data, int length);
vargham 0:19f9af07424a 252
vargham 2:bdbf9de0e985 253 /** Writes data to the SRAM. The first two bytes shall be the address.
vargham 2:bdbf9de0e985 254 * @param data Pointer to the data buffer to read from
vargham 2:bdbf9de0e985 255 * @param length Data length
vargham 2:bdbf9de0e985 256 *
vargham 2:bdbf9de0e985 257 * @return
vargham 2:bdbf9de0e985 258 * true on success
vargham 2:bdbf9de0e985 259 * false on fail
vargham 2:bdbf9de0e985 260 */
vargham 2:bdbf9de0e985 261 bool write(char *data, int length);
vargham 2:bdbf9de0e985 262
vargham 2:bdbf9de0e985 263 /** Reads data from the specified address.
vargham 0:19f9af07424a 264 * @param address The 16 bit source address
vargham 0:19f9af07424a 265 * @param data Pointer to the data buffer to read to
vargham 0:19f9af07424a 266 * @param length Data length
vargham 0:19f9af07424a 267 *
vargham 0:19f9af07424a 268 * @return
vargham 0:19f9af07424a 269 * true on success
vargham 0:19f9af07424a 270 * false on fail
vargham 0:19f9af07424a 271 */
vargham 0:19f9af07424a 272 bool read(uint16_t address, char *data, int length);
vargham 0:19f9af07424a 273
vargham 2:bdbf9de0e985 274 /** Reads data to the specified buffer. The first two bytes shall be the address. These bytes will be unchanged.
vargham 2:bdbf9de0e985 275 * @param data Pointer to the data buffer to read to
vargham 2:bdbf9de0e985 276 * @param length Data length
vargham 2:bdbf9de0e985 277 *
vargham 2:bdbf9de0e985 278 * @return
vargham 2:bdbf9de0e985 279 * true on success
vargham 2:bdbf9de0e985 280 * false on fail
vargham 2:bdbf9de0e985 281 */
vargham 2:bdbf9de0e985 282 bool read(char *data, int length);
vargham 2:bdbf9de0e985 283
vargham 0:19f9af07424a 284 /** Fills memory with the specified byte from the specified address
vargham 0:19f9af07424a 285 * @param address The 16 bit destination address
vargham 0:19f9af07424a 286 * @param data The byte to write
vargham 0:19f9af07424a 287 * @param length Memory are to fill with the data byte
vargham 0:19f9af07424a 288 *
vargham 0:19f9af07424a 289 * @return
vargham 0:19f9af07424a 290 * true on success
vargham 0:19f9af07424a 291 * false on fail
vargham 0:19f9af07424a 292 */
vargham 0:19f9af07424a 293 bool fillMemory(uint16_t address, char data, int length);
vargham 0:19f9af07424a 294
vargham 0:19f9af07424a 295 /** Fills the whole memory with the specified byte
vargham 0:19f9af07424a 296 * @param data The byte to write
vargham 0:19f9af07424a 297 *
vargham 0:19f9af07424a 298 * @return
vargham 0:19f9af07424a 299 * true on success
vargham 0:19f9af07424a 300 * false on fail
vargham 0:19f9af07424a 301 */
vargham 0:19f9af07424a 302 bool fillMemory(char data);
vargham 0:19f9af07424a 303
vargham 0:19f9af07424a 304 /** Continuously checks I2C EERAM device till ready or reaches timeout
vargham 0:19f9af07424a 305 * @param timeout_ms Timeout for busy-wait I2C device polling
vargham 0:19f9af07424a 306 *
vargham 0:19f9af07424a 307 * @return
vargham 0:19f9af07424a 308 * true on ready
vargham 0:19f9af07424a 309 * false on timeout
vargham 0:19f9af07424a 310 */
vargham 0:19f9af07424a 311 bool isReady(int timeout_ms);
vargham 0:19f9af07424a 312
vargham 0:19f9af07424a 313 /** Checks I2C EERAM device one time
vargham 0:19f9af07424a 314 *
vargham 0:19f9af07424a 315 * @return
vargham 0:19f9af07424a 316 * true on ready
vargham 0:19f9af07424a 317 * false on not ready
vargham 0:19f9af07424a 318 */
vargham 0:19f9af07424a 319 bool isReady();
vargham 0:19f9af07424a 320
vargham 0:19f9af07424a 321 /** Store SRAM in EEPROM
vargham 0:19f9af07424a 322 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 323 *
vargham 0:19f9af07424a 324 * @return
vargham 0:19f9af07424a 325 * true on success
vargham 0:19f9af07424a 326 * false on fail
vargham 0:19f9af07424a 327 */
vargham 0:19f9af07424a 328 bool store(bool block);
vargham 0:19f9af07424a 329
vargham 0:19f9af07424a 330 /** Recall SRAM from EEPROM
vargham 0:19f9af07424a 331 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 332 *
vargham 0:19f9af07424a 333 * @return
vargham 0:19f9af07424a 334 * true on success
vargham 0:19f9af07424a 335 * false on fail
vargham 0:19f9af07424a 336 */
vargham 0:19f9af07424a 337 bool recall(bool block);
vargham 0:19f9af07424a 338
vargham 0:19f9af07424a 339 /** Reads status register
vargham 0:19f9af07424a 340 *
vargham 0:19f9af07424a 341 * @return
vargham 0:19f9af07424a 342 * true on success
vargham 0:19f9af07424a 343 * false on fail
vargham 0:19f9af07424a 344 */
vargham 0:19f9af07424a 345 bool readStatus();
vargham 0:19f9af07424a 346
vargham 0:19f9af07424a 347 /** Gets status register
vargham 0:19f9af07424a 348 *
vargham 0:19f9af07424a 349 * @return The content of the 8 bit status register
vargham 0:19f9af07424a 350 */
vargham 0:19f9af07424a 351 inline uint8_t getStatus() const
vargham 0:19f9af07424a 352 {
vargham 0:19f9af07424a 353 return _status;
vargham 0:19f9af07424a 354 }
vargham 0:19f9af07424a 355
vargham 0:19f9af07424a 356 /** Writes the 8 bit status register to the I2C device
vargham 0:19f9af07424a 357 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 358 *
vargham 0:19f9af07424a 359 * @return
vargham 0:19f9af07424a 360 * true on success
vargham 0:19f9af07424a 361 * false on fail
vargham 0:19f9af07424a 362 */
vargham 0:19f9af07424a 363 bool writeStatus(bool block);
vargham 0:19f9af07424a 364
vargham 0:19f9af07424a 365 /** Writes the 8 bit status register to the I2C device if changed
vargham 0:19f9af07424a 366 * @param block If true, busy waits for operation end.
vargham 0:19f9af07424a 367 */
vargham 0:19f9af07424a 368 void writeStatusIfChanged(bool block);
vargham 0:19f9af07424a 369
vargham 0:19f9af07424a 370 /** Sets protected memory area. The selected area will be write protected.
vargham 0:19f9af07424a 371 * @param protectedMemoryArea The enum represents the area from NONE through upper 64, 32, 16, 8, 4, 2 to ALL
vargham 0:19f9af07424a 372 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 373 */
vargham 0:19f9af07424a 374 void setProtectedMemoryArea(ProtectedMemoryArea protectedMemoryArea, bool store = false);
vargham 0:19f9af07424a 375
vargham 0:19f9af07424a 376 /** Gets protected memory area
vargham 0:19f9af07424a 377 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 378 */
vargham 0:19f9af07424a 379 ProtectedMemoryArea getProtectedMemoryArea();
vargham 0:19f9af07424a 380
vargham 0:19f9af07424a 381 /** Gets Memory Modified
vargham 0:19f9af07424a 382 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 383 * @return
vargham 0:19f9af07424a 384 * true The SRAM memory have been modified since the last store or recall operation
vargham 0:19f9af07424a 385 * false The SRAM memory have not been modified since the last store or recall operation
vargham 0:19f9af07424a 386 */
vargham 0:19f9af07424a 387 bool isMemoryModified();
vargham 0:19f9af07424a 388
vargham 0:19f9af07424a 389 /** Sets Auto Store Enabled
vargham 0:19f9af07424a 390 * @param enabled Auto store SRAM to EEPROM on power down enabled
vargham 0:19f9af07424a 391 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 392 */
vargham 0:19f9af07424a 393 void setAutoStoreEnabled(bool enabled, bool store = false);
vargham 0:19f9af07424a 394
vargham 0:19f9af07424a 395 /** Gets Auto Store Enabled
vargham 0:19f9af07424a 396 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 397 * @return
vargham 0:19f9af07424a 398 * true Auto Store is Enabled
vargham 0:19f9af07424a 399 * false Auto Store is not Enabled
vargham 0:19f9af07424a 400 */
vargham 0:19f9af07424a 401 bool isAutoStoreEnabled();
vargham 0:19f9af07424a 402
vargham 0:19f9af07424a 403 /** Sets event detected
vargham 0:19f9af07424a 404 * @param detected The value of the detected bit
vargham 0:19f9af07424a 405 * @param store If true, calls writeStatusIfChanged()
vargham 0:19f9af07424a 406 */
vargham 0:19f9af07424a 407 void setEventDetected(bool detected, bool store);
vargham 0:19f9af07424a 408
vargham 0:19f9af07424a 409 /** Gets event detected
vargham 0:19f9af07424a 410 * Have to call readStatus() to read register's fresh value.
vargham 0:19f9af07424a 411 * @return
vargham 0:19f9af07424a 412 * true External store event detected (The HS pin pulled up)
vargham 0:19f9af07424a 413 * false External event not detected
vargham 0:19f9af07424a 414 */
vargham 0:19f9af07424a 415 bool isEventDetected();
vargham 0:19f9af07424a 416
vargham 0:19f9af07424a 417 /** 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 418 * @param serial The port to print to
vargham 0:19f9af07424a 419 */
vargham 0:19f9af07424a 420 void dump(Serial &serial, uint16_t start, uint16_t length, int lineSize = 16);
vargham 0:19f9af07424a 421
vargham 0:19f9af07424a 422 /** Prints the whole SRAM content to the given serial port in human readable format in 16 byte long lines
vargham 0:19f9af07424a 423 * @param serial The port to print to
vargham 0:19f9af07424a 424 */
vargham 0:19f9af07424a 425 void dump(Serial &serial);
vargham 0:19f9af07424a 426
vargham 0:19f9af07424a 427 /** Prints the 8 bit status register's contents to the given serial port in human readable format
vargham 0:19f9af07424a 428 * @param serial The port to print to
vargham 0:19f9af07424a 429 */
vargham 0:19f9af07424a 430 void dumpRegisters(Serial &serial);
vargham 0:19f9af07424a 431
vargham 0:19f9af07424a 432 private:
vargham 0:19f9af07424a 433 static const uint8_t RW_BIT = 0;
vargham 0:19f9af07424a 434 static const uint8_t A1_BIT = 2;
vargham 0:19f9af07424a 435 static const uint8_t A2_BIT = 3;
vargham 0:19f9af07424a 436 static const uint8_t STATUS_AM_BIT = 7;
vargham 0:19f9af07424a 437 static const uint8_t STATUS_ASE_BIT = 1;
vargham 0:19f9af07424a 438 static const uint8_t STATUS_EVENT_BIT = 0;
vargham 0:19f9af07424a 439 static const uint8_t OPCODE_SRAM = 0b10100000;
vargham 0:19f9af07424a 440 static const uint8_t OPCODE_CONTROL = 0b00110000;
vargham 0:19f9af07424a 441 static const uint8_t REGISTER_STATUS = 0x0;
vargham 0:19f9af07424a 442 static const uint8_t REGISTER_COMMAND = 0x55;
vargham 0:19f9af07424a 443 static const uint8_t COMMAND_STORE = 0b00110011;
vargham 0:19f9af07424a 444 static const uint8_t COMMAND_RECALL = 0b11011101;
vargham 0:19f9af07424a 445 static const int TIME_RECALL_16_MS = 5;
vargham 0:19f9af07424a 446 static const int TIME_RECALL_04_MS = 2;
vargham 0:19f9af07424a 447 static const int TIME_STORE_16_MS = 25;
vargham 0:19f9af07424a 448 static const int TIME_STORE_04_MS = 8;
vargham 0:19f9af07424a 449 static const int TIME_STORE_STATUS_MS = 1;
vargham 0:19f9af07424a 450 I2C _i2c;
vargham 0:19f9af07424a 451 uint16_t _memorySize;
vargham 0:19f9af07424a 452 uint8_t _sramAddressWrite;
vargham 0:19f9af07424a 453 uint8_t _sramAddressRead;
vargham 0:19f9af07424a 454 uint8_t _controlAddressWrite;
vargham 0:19f9af07424a 455 uint8_t _controlAddressRead;
vargham 0:19f9af07424a 456 uint8_t _status;
vargham 0:19f9af07424a 457 uint8_t _statusToWrite;
vargham 0:19f9af07424a 458 void initialize(bool A1 = false, bool A2 = false);
vargham 0:19f9af07424a 459 bool checkAddressRange(uint16_t start, uint16_t length);
vargham 0:19f9af07424a 460 bool writeRegister(uint8_t registerAddress, uint8_t data);
vargham 0:19f9af07424a 461 bool setMemoryPointer(uint16_t address, bool stop = true);
vargham 2:bdbf9de0e985 462 bool setMemoryPointer(uint8_t address_0, uint8_t address_1, bool stop = true);
vargham 0:19f9af07424a 463 };
vargham 0:19f9af07424a 464
vargham 0:19f9af07424a 465 #endif //EERAM_h