Driver library for Microchip I2C EERAM (47x04 and 47x16) 4 kbit or 16 kbit EEPROM backed SRAM.
EERAM.h@3:a869096d7a5d, 2017-04-27 (annotated)
- 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?
User | Revision | Line number | New 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 |