Felícito Manzano
/
DTK_Guaria2_ABInBev
Proyecto ABInBev para la tarjeta Guaria 1/2.
eeprom/eeprom.cpp@17:c53ea16f75c0, 2022-07-07 (annotated)
- Committer:
- fmanzano_dtk
- Date:
- Thu Jul 07 08:55:42 2022 -0600
- Revision:
- 17:c53ea16f75c0
- Parent:
- 1:9e821e640117
hg
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fmanzano_dtk | 1:9e821e640117 | 1 | /*********************************************************** |
fmanzano_dtk | 1:9e821e640117 | 2 | Author: Bernard Borredon |
fmanzano_dtk | 1:9e821e640117 | 3 | Version: 1.3 |
fmanzano_dtk | 1:9e821e640117 | 4 | - Correct write(uint32_t address, int8_t data[], uint32_t length) for eeprom >= T24C32. |
fmanzano_dtk | 1:9e821e640117 | 5 | Tested with 24C02, 24C08, 24C16, 24C64, 24C256, 24C512, 24C1025 on LPC1768 (mbed online and µVision V5.16a). |
fmanzano_dtk | 1:9e821e640117 | 6 | - Correct main test. |
fmanzano_dtk | 1:9e821e640117 | 7 | |
fmanzano_dtk | 1:9e821e640117 | 8 | Date : 12 decembre 2013 |
fmanzano_dtk | 1:9e821e640117 | 9 | Version: 1.2 |
fmanzano_dtk | 1:9e821e640117 | 10 | - Update api documentation |
fmanzano_dtk | 1:9e821e640117 | 11 | |
fmanzano_dtk | 1:9e821e640117 | 12 | Date: 11 december 2013 |
fmanzano_dtk | 1:9e821e640117 | 13 | Version: 1.1 |
fmanzano_dtk | 1:9e821e640117 | 14 | - Change address parameter size form uint16_t to uint32_t (error for eeprom > 24C256). |
fmanzano_dtk | 1:9e821e640117 | 15 | - Change size parameter size from uint16_t to uint32_t (error for eeprom > 24C256). |
fmanzano_dtk | 1:9e821e640117 | 16 | - Correct a bug in function write(uint32_t address, int8_t data[], uint32_t length) : |
fmanzano_dtk | 1:9e821e640117 | 17 | last step must be done only if it remain datas to send. |
fmanzano_dtk | 1:9e821e640117 | 18 | - Add function getName. |
fmanzano_dtk | 1:9e821e640117 | 19 | - Add function clear. |
fmanzano_dtk | 1:9e821e640117 | 20 | - Initialize _name array. |
fmanzano_dtk | 1:9e821e640117 | 21 | |
fmanzano_dtk | 1:9e821e640117 | 22 | Date: 27 december 2011 |
fmanzano_dtk | 1:9e821e640117 | 23 | Version: 1.0 |
fmanzano_dtk | 1:9e821e640117 | 24 | |
fmanzano_dtk | 1:9e821e640117 | 25 | ************************************************************/ |
fmanzano_dtk | 1:9e821e640117 | 26 | #include "eeprom.h" |
fmanzano_dtk | 17:c53ea16f75c0 | 27 | #include <string> |
fmanzano_dtk | 1:9e821e640117 | 28 | |
fmanzano_dtk | 1:9e821e640117 | 29 | #define BIT_SET(x,n) (x=x | (0x01<<n)) |
fmanzano_dtk | 1:9e821e640117 | 30 | #define BIT_TEST(x,n) (x & (0x01<<n)) |
fmanzano_dtk | 1:9e821e640117 | 31 | #define BIT_CLEAR(x,n) (x=x & ~(0x01<<n)) |
fmanzano_dtk | 1:9e821e640117 | 32 | |
fmanzano_dtk | 1:9e821e640117 | 33 | const char * const EEPROM::_name[] = {"24C01","24C02","24C04","24C08","24C16","24C32", |
fmanzano_dtk | 1:9e821e640117 | 34 | "24C64","24C128","24C256","24C512","24C1024","24C1025"}; |
fmanzano_dtk | 1:9e821e640117 | 35 | |
fmanzano_dtk | 1:9e821e640117 | 36 | /** |
fmanzano_dtk | 1:9e821e640117 | 37 | * EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl) |
fmanzano_dtk | 1:9e821e640117 | 38 | * |
fmanzano_dtk | 1:9e821e640117 | 39 | * Constructor, initialize the eeprom on i2c interface. |
fmanzano_dtk | 1:9e821e640117 | 40 | * @param sda sda i2c pin (PinName) |
fmanzano_dtk | 1:9e821e640117 | 41 | * @param scl scl i2c pin (PinName) |
fmanzano_dtk | 1:9e821e640117 | 42 | * @param address eeprom address, according to eeprom type (uint8_t) |
fmanzano_dtk | 1:9e821e640117 | 43 | * @param type eeprom type (TypeEeprom) |
fmanzano_dtk | 1:9e821e640117 | 44 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 45 | */ |
fmanzano_dtk | 1:9e821e640117 | 46 | EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl) |
fmanzano_dtk | 1:9e821e640117 | 47 | { |
fmanzano_dtk | 1:9e821e640117 | 48 | |
fmanzano_dtk | 1:9e821e640117 | 49 | _errnum = EEPROM_NoError; |
fmanzano_dtk | 1:9e821e640117 | 50 | _type = type; |
fmanzano_dtk | 1:9e821e640117 | 51 | |
fmanzano_dtk | 1:9e821e640117 | 52 | // Check address range |
fmanzano_dtk | 1:9e821e640117 | 53 | _address = address; |
fmanzano_dtk | 1:9e821e640117 | 54 | switch(type) { |
fmanzano_dtk | 1:9e821e640117 | 55 | case T24C01 : |
fmanzano_dtk | 1:9e821e640117 | 56 | case T24C02 : |
fmanzano_dtk | 1:9e821e640117 | 57 | if(address > 7) { |
fmanzano_dtk | 1:9e821e640117 | 58 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 59 | } |
fmanzano_dtk | 1:9e821e640117 | 60 | _address = _address << 1; |
fmanzano_dtk | 1:9e821e640117 | 61 | _page_write = 8; |
fmanzano_dtk | 1:9e821e640117 | 62 | _page_number = 1; |
fmanzano_dtk | 1:9e821e640117 | 63 | break; |
fmanzano_dtk | 1:9e821e640117 | 64 | case T24C04 : |
fmanzano_dtk | 1:9e821e640117 | 65 | if(address > 7) { |
fmanzano_dtk | 1:9e821e640117 | 66 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 67 | } |
fmanzano_dtk | 1:9e821e640117 | 68 | _address = (_address & 0xFE) << 1; |
fmanzano_dtk | 1:9e821e640117 | 69 | _page_write = 16; |
fmanzano_dtk | 1:9e821e640117 | 70 | _page_number = 2; |
fmanzano_dtk | 1:9e821e640117 | 71 | break; |
fmanzano_dtk | 1:9e821e640117 | 72 | case T24C08 : |
fmanzano_dtk | 1:9e821e640117 | 73 | if(address > 7) { |
fmanzano_dtk | 1:9e821e640117 | 74 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 75 | } |
fmanzano_dtk | 1:9e821e640117 | 76 | _address = (_address & 0xFC) << 1; |
fmanzano_dtk | 1:9e821e640117 | 77 | _page_write = 16; |
fmanzano_dtk | 1:9e821e640117 | 78 | _page_number = 4; |
fmanzano_dtk | 1:9e821e640117 | 79 | break; |
fmanzano_dtk | 1:9e821e640117 | 80 | case T24C16 : |
fmanzano_dtk | 1:9e821e640117 | 81 | _address = 0; |
fmanzano_dtk | 1:9e821e640117 | 82 | _page_write = 16; |
fmanzano_dtk | 1:9e821e640117 | 83 | _page_number = 8; |
fmanzano_dtk | 1:9e821e640117 | 84 | break; |
fmanzano_dtk | 1:9e821e640117 | 85 | case T24C32 : |
fmanzano_dtk | 1:9e821e640117 | 86 | case T24C64 : |
fmanzano_dtk | 1:9e821e640117 | 87 | if(address > 7) { |
fmanzano_dtk | 1:9e821e640117 | 88 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 89 | } |
fmanzano_dtk | 1:9e821e640117 | 90 | _address = _address << 1; |
fmanzano_dtk | 1:9e821e640117 | 91 | _page_write = 32; |
fmanzano_dtk | 1:9e821e640117 | 92 | _page_number = 1; |
fmanzano_dtk | 1:9e821e640117 | 93 | break; |
fmanzano_dtk | 1:9e821e640117 | 94 | case T24C128 : |
fmanzano_dtk | 1:9e821e640117 | 95 | case T24C256 : |
fmanzano_dtk | 1:9e821e640117 | 96 | if(address > 3) { |
fmanzano_dtk | 1:9e821e640117 | 97 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 98 | } |
fmanzano_dtk | 1:9e821e640117 | 99 | _address = _address << 1; |
fmanzano_dtk | 1:9e821e640117 | 100 | _page_write = 64; |
fmanzano_dtk | 1:9e821e640117 | 101 | _page_number = 1; |
fmanzano_dtk | 1:9e821e640117 | 102 | break; |
fmanzano_dtk | 1:9e821e640117 | 103 | case T24C512 : |
fmanzano_dtk | 1:9e821e640117 | 104 | if(address > 3) { |
fmanzano_dtk | 1:9e821e640117 | 105 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 106 | } |
fmanzano_dtk | 1:9e821e640117 | 107 | _address = _address << 1; |
fmanzano_dtk | 1:9e821e640117 | 108 | _page_write = 128; |
fmanzano_dtk | 1:9e821e640117 | 109 | _page_number = 1; |
fmanzano_dtk | 1:9e821e640117 | 110 | break; |
fmanzano_dtk | 1:9e821e640117 | 111 | case T24C1024 : |
fmanzano_dtk | 1:9e821e640117 | 112 | if(address > 7) { |
fmanzano_dtk | 1:9e821e640117 | 113 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 114 | } |
fmanzano_dtk | 1:9e821e640117 | 115 | _address = (_address & 0xFE) << 1; |
fmanzano_dtk | 1:9e821e640117 | 116 | _page_write = 128; |
fmanzano_dtk | 1:9e821e640117 | 117 | _page_number = 2; |
fmanzano_dtk | 1:9e821e640117 | 118 | break; |
fmanzano_dtk | 1:9e821e640117 | 119 | case T24C1025 : |
fmanzano_dtk | 1:9e821e640117 | 120 | if(address > 3) { |
fmanzano_dtk | 1:9e821e640117 | 121 | _errnum = EEPROM_BadAddress; |
fmanzano_dtk | 1:9e821e640117 | 122 | } |
fmanzano_dtk | 1:9e821e640117 | 123 | _address = _address << 1; |
fmanzano_dtk | 1:9e821e640117 | 124 | _page_write = 128; |
fmanzano_dtk | 1:9e821e640117 | 125 | _page_number = 2; |
fmanzano_dtk | 1:9e821e640117 | 126 | break; |
fmanzano_dtk | 1:9e821e640117 | 127 | } |
fmanzano_dtk | 1:9e821e640117 | 128 | |
fmanzano_dtk | 1:9e821e640117 | 129 | // Size in bytes |
fmanzano_dtk | 1:9e821e640117 | 130 | _size = _type; |
fmanzano_dtk | 1:9e821e640117 | 131 | if(_type == T24C1025) |
fmanzano_dtk | 1:9e821e640117 | 132 | _size = T24C1024; |
fmanzano_dtk | 1:9e821e640117 | 133 | |
fmanzano_dtk | 1:9e821e640117 | 134 | // Set I2C frequency |
fmanzano_dtk | 1:9e821e640117 | 135 | _i2c.frequency(400000); |
fmanzano_dtk | 1:9e821e640117 | 136 | |
fmanzano_dtk | 1:9e821e640117 | 137 | } |
fmanzano_dtk | 1:9e821e640117 | 138 | |
fmanzano_dtk | 1:9e821e640117 | 139 | /** |
fmanzano_dtk | 1:9e821e640117 | 140 | * void write(uint32_t address, int8_t data) |
fmanzano_dtk | 1:9e821e640117 | 141 | * |
fmanzano_dtk | 1:9e821e640117 | 142 | * Write byte |
fmanzano_dtk | 1:9e821e640117 | 143 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 144 | * @param data byte to write (int8_t) |
fmanzano_dtk | 1:9e821e640117 | 145 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 146 | */ |
fmanzano_dtk | 1:9e821e640117 | 147 | void EEPROM::write(uint32_t address, int8_t data) |
fmanzano_dtk | 1:9e821e640117 | 148 | { |
fmanzano_dtk | 1:9e821e640117 | 149 | uint8_t page; |
fmanzano_dtk | 1:9e821e640117 | 150 | uint8_t addr; |
fmanzano_dtk | 1:9e821e640117 | 151 | uint8_t cmd[3]; |
fmanzano_dtk | 1:9e821e640117 | 152 | int len; |
fmanzano_dtk | 1:9e821e640117 | 153 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 154 | |
fmanzano_dtk | 1:9e821e640117 | 155 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 156 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 157 | return; |
fmanzano_dtk | 1:9e821e640117 | 158 | |
fmanzano_dtk | 1:9e821e640117 | 159 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 160 | if(!checkAddress(address)) { |
fmanzano_dtk | 1:9e821e640117 | 161 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 162 | return; |
fmanzano_dtk | 1:9e821e640117 | 163 | } |
fmanzano_dtk | 1:9e821e640117 | 164 | |
fmanzano_dtk | 1:9e821e640117 | 165 | // Compute page number |
fmanzano_dtk | 1:9e821e640117 | 166 | page = 0; |
fmanzano_dtk | 1:9e821e640117 | 167 | if(_type < T24C32) |
fmanzano_dtk | 1:9e821e640117 | 168 | page = (uint8_t) (address / 256); |
fmanzano_dtk | 1:9e821e640117 | 169 | |
fmanzano_dtk | 1:9e821e640117 | 170 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 171 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 172 | |
fmanzano_dtk | 1:9e821e640117 | 173 | if(_type < T24C32) { |
fmanzano_dtk | 1:9e821e640117 | 174 | len = 2; |
fmanzano_dtk | 1:9e821e640117 | 175 | |
fmanzano_dtk | 1:9e821e640117 | 176 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 177 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 178 | |
fmanzano_dtk | 1:9e821e640117 | 179 | // Data |
fmanzano_dtk | 1:9e821e640117 | 180 | cmd[1] = (uint8_t) data; |
fmanzano_dtk | 1:9e821e640117 | 181 | } |
fmanzano_dtk | 1:9e821e640117 | 182 | else { |
fmanzano_dtk | 1:9e821e640117 | 183 | len = 3; |
fmanzano_dtk | 1:9e821e640117 | 184 | |
fmanzano_dtk | 1:9e821e640117 | 185 | // First word address (MSB) |
fmanzano_dtk | 1:9e821e640117 | 186 | cmd[0] = (uint8_t) (address >> 8); |
fmanzano_dtk | 1:9e821e640117 | 187 | |
fmanzano_dtk | 1:9e821e640117 | 188 | // Second word address (LSB) |
fmanzano_dtk | 1:9e821e640117 | 189 | cmd[1] = (uint8_t) address; |
fmanzano_dtk | 1:9e821e640117 | 190 | |
fmanzano_dtk | 1:9e821e640117 | 191 | // Data |
fmanzano_dtk | 1:9e821e640117 | 192 | cmd[2] = (uint8_t) data; |
fmanzano_dtk | 1:9e821e640117 | 193 | } |
fmanzano_dtk | 1:9e821e640117 | 194 | |
fmanzano_dtk | 1:9e821e640117 | 195 | ack = _i2c.write((int)addr,(char *)cmd,len); |
fmanzano_dtk | 1:9e821e640117 | 196 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 197 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 198 | return; |
fmanzano_dtk | 1:9e821e640117 | 199 | } |
fmanzano_dtk | 1:9e821e640117 | 200 | |
fmanzano_dtk | 1:9e821e640117 | 201 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 202 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 203 | |
fmanzano_dtk | 1:9e821e640117 | 204 | } |
fmanzano_dtk | 1:9e821e640117 | 205 | |
fmanzano_dtk | 1:9e821e640117 | 206 | /** |
fmanzano_dtk | 1:9e821e640117 | 207 | * void write(uint32_t address, int8_t data[], uint32_t length) |
fmanzano_dtk | 1:9e821e640117 | 208 | * |
fmanzano_dtk | 1:9e821e640117 | 209 | * Write array of bytes (use the page mode) |
fmanzano_dtk | 1:9e821e640117 | 210 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 211 | * @param data bytes array to write (int8_t[]) |
fmanzano_dtk | 1:9e821e640117 | 212 | * @param size number of bytes to write (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 213 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 214 | */ |
fmanzano_dtk | 1:9e821e640117 | 215 | void EEPROM::write(uint32_t address, int8_t data[], uint32_t length) |
fmanzano_dtk | 1:9e821e640117 | 216 | { |
fmanzano_dtk | 1:9e821e640117 | 217 | uint8_t page; |
fmanzano_dtk | 1:9e821e640117 | 218 | uint8_t addr = 0; |
fmanzano_dtk | 1:9e821e640117 | 219 | uint8_t blocs,remain; |
fmanzano_dtk | 1:9e821e640117 | 220 | uint8_t fpart,lpart; |
fmanzano_dtk | 1:9e821e640117 | 221 | uint8_t i,j,ind; |
fmanzano_dtk | 1:9e821e640117 | 222 | uint8_t cmd[129]; |
fmanzano_dtk | 1:9e821e640117 | 223 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 224 | |
fmanzano_dtk | 1:9e821e640117 | 225 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 226 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 227 | return; |
fmanzano_dtk | 1:9e821e640117 | 228 | |
fmanzano_dtk | 1:9e821e640117 | 229 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 230 | if(!checkAddress(address)) { |
fmanzano_dtk | 1:9e821e640117 | 231 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 232 | return; |
fmanzano_dtk | 1:9e821e640117 | 233 | } |
fmanzano_dtk | 1:9e821e640117 | 234 | |
fmanzano_dtk | 1:9e821e640117 | 235 | // Check length |
fmanzano_dtk | 1:9e821e640117 | 236 | if(!checkAddress(address + length - 1)) { |
fmanzano_dtk | 1:9e821e640117 | 237 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 238 | return; |
fmanzano_dtk | 1:9e821e640117 | 239 | } |
fmanzano_dtk | 1:9e821e640117 | 240 | |
fmanzano_dtk | 1:9e821e640117 | 241 | // Compute blocs numbers |
fmanzano_dtk | 1:9e821e640117 | 242 | blocs = length / _page_write; |
fmanzano_dtk | 1:9e821e640117 | 243 | |
fmanzano_dtk | 1:9e821e640117 | 244 | // Compute remaining bytes |
fmanzano_dtk | 1:9e821e640117 | 245 | remain = length - blocs * _page_write; |
fmanzano_dtk | 1:9e821e640117 | 246 | |
fmanzano_dtk | 1:9e821e640117 | 247 | for(i = 0;i < blocs;i++) { |
fmanzano_dtk | 1:9e821e640117 | 248 | // Compute page number |
fmanzano_dtk | 1:9e821e640117 | 249 | page = 0; |
fmanzano_dtk | 1:9e821e640117 | 250 | if(_type < T24C32) |
fmanzano_dtk | 1:9e821e640117 | 251 | page = (uint8_t) (address / 256); |
fmanzano_dtk | 1:9e821e640117 | 252 | |
fmanzano_dtk | 1:9e821e640117 | 253 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 254 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 255 | |
fmanzano_dtk | 1:9e821e640117 | 256 | if(_type < T24C32) { |
fmanzano_dtk | 1:9e821e640117 | 257 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 258 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 259 | |
fmanzano_dtk | 1:9e821e640117 | 260 | if((uint8_t) ((address + _page_write) / 256) == page) { // Data fit in the same page |
fmanzano_dtk | 1:9e821e640117 | 261 | // Add data |
fmanzano_dtk | 1:9e821e640117 | 262 | for(j = 0;j < _page_write;j++) |
fmanzano_dtk | 1:9e821e640117 | 263 | cmd[j + 1] = (uint8_t) data[i * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 264 | |
fmanzano_dtk | 1:9e821e640117 | 265 | // Write data |
fmanzano_dtk | 1:9e821e640117 | 266 | ack = _i2c.write((int)addr,(char *)cmd,_page_write + 1); |
fmanzano_dtk | 1:9e821e640117 | 267 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 268 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 269 | return; |
fmanzano_dtk | 1:9e821e640117 | 270 | } |
fmanzano_dtk | 1:9e821e640117 | 271 | |
fmanzano_dtk | 1:9e821e640117 | 272 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 273 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 274 | |
fmanzano_dtk | 1:9e821e640117 | 275 | // Increment address |
fmanzano_dtk | 1:9e821e640117 | 276 | address += _page_write; |
fmanzano_dtk | 1:9e821e640117 | 277 | } |
fmanzano_dtk | 1:9e821e640117 | 278 | else { // Data on 2 pages. We must split the write |
fmanzano_dtk | 1:9e821e640117 | 279 | // Number of bytes in current page |
fmanzano_dtk | 1:9e821e640117 | 280 | fpart = (page + 1) * 256 - address; |
fmanzano_dtk | 1:9e821e640117 | 281 | |
fmanzano_dtk | 1:9e821e640117 | 282 | // Add data for current page |
fmanzano_dtk | 1:9e821e640117 | 283 | for(j = 0;j < fpart;j++) |
fmanzano_dtk | 1:9e821e640117 | 284 | cmd[j + 1] = (uint8_t) data[i * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 285 | |
fmanzano_dtk | 1:9e821e640117 | 286 | // Write data for current page |
fmanzano_dtk | 1:9e821e640117 | 287 | ack = _i2c.write((int)addr,(char *)cmd,fpart + 1); |
fmanzano_dtk | 1:9e821e640117 | 288 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 289 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 290 | return; |
fmanzano_dtk | 1:9e821e640117 | 291 | } |
fmanzano_dtk | 1:9e821e640117 | 292 | |
fmanzano_dtk | 1:9e821e640117 | 293 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 294 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 295 | |
fmanzano_dtk | 1:9e821e640117 | 296 | // Increment address |
fmanzano_dtk | 1:9e821e640117 | 297 | address += fpart; |
fmanzano_dtk | 1:9e821e640117 | 298 | |
fmanzano_dtk | 1:9e821e640117 | 299 | if(page < _page_number - 1) { |
fmanzano_dtk | 1:9e821e640117 | 300 | // Increment page |
fmanzano_dtk | 1:9e821e640117 | 301 | page++; |
fmanzano_dtk | 1:9e821e640117 | 302 | |
fmanzano_dtk | 1:9e821e640117 | 303 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 304 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 305 | |
fmanzano_dtk | 1:9e821e640117 | 306 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 307 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 308 | |
fmanzano_dtk | 1:9e821e640117 | 309 | // Data index |
fmanzano_dtk | 1:9e821e640117 | 310 | ind = i * _page_write + fpart; |
fmanzano_dtk | 1:9e821e640117 | 311 | |
fmanzano_dtk | 1:9e821e640117 | 312 | // Number of bytes in next page |
fmanzano_dtk | 1:9e821e640117 | 313 | lpart = _page_write - fpart; |
fmanzano_dtk | 1:9e821e640117 | 314 | |
fmanzano_dtk | 1:9e821e640117 | 315 | // Add data for next page |
fmanzano_dtk | 1:9e821e640117 | 316 | for(j = 0;j < lpart;j++) |
fmanzano_dtk | 1:9e821e640117 | 317 | cmd[j + 1] = (uint8_t) data[ind + j]; |
fmanzano_dtk | 1:9e821e640117 | 318 | |
fmanzano_dtk | 1:9e821e640117 | 319 | // Write data for next page |
fmanzano_dtk | 1:9e821e640117 | 320 | ack = _i2c.write((int)addr,(char *)cmd,lpart + 1); |
fmanzano_dtk | 1:9e821e640117 | 321 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 322 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 323 | return; |
fmanzano_dtk | 1:9e821e640117 | 324 | } |
fmanzano_dtk | 1:9e821e640117 | 325 | |
fmanzano_dtk | 1:9e821e640117 | 326 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 327 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 328 | |
fmanzano_dtk | 1:9e821e640117 | 329 | // Increment address |
fmanzano_dtk | 1:9e821e640117 | 330 | address += lpart; |
fmanzano_dtk | 1:9e821e640117 | 331 | } |
fmanzano_dtk | 1:9e821e640117 | 332 | } |
fmanzano_dtk | 1:9e821e640117 | 333 | } |
fmanzano_dtk | 1:9e821e640117 | 334 | else { |
fmanzano_dtk | 1:9e821e640117 | 335 | // First word address (MSB) |
fmanzano_dtk | 1:9e821e640117 | 336 | cmd[0] = (uint8_t) (address >> 8); |
fmanzano_dtk | 1:9e821e640117 | 337 | |
fmanzano_dtk | 1:9e821e640117 | 338 | // Second word address (LSB) |
fmanzano_dtk | 1:9e821e640117 | 339 | cmd[1] = (uint8_t) address; |
fmanzano_dtk | 1:9e821e640117 | 340 | |
fmanzano_dtk | 1:9e821e640117 | 341 | // Add data |
fmanzano_dtk | 1:9e821e640117 | 342 | for(j = 0;j < _page_write;j++) |
fmanzano_dtk | 1:9e821e640117 | 343 | cmd[j + 2] = (uint8_t) data[i * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 344 | |
fmanzano_dtk | 1:9e821e640117 | 345 | // Write data |
fmanzano_dtk | 1:9e821e640117 | 346 | ack = _i2c.write((int)addr,(char *)cmd,_page_write + 2); |
fmanzano_dtk | 1:9e821e640117 | 347 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 348 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 349 | return; |
fmanzano_dtk | 1:9e821e640117 | 350 | } |
fmanzano_dtk | 1:9e821e640117 | 351 | |
fmanzano_dtk | 1:9e821e640117 | 352 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 353 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 354 | |
fmanzano_dtk | 1:9e821e640117 | 355 | // Increment address |
fmanzano_dtk | 1:9e821e640117 | 356 | address += _page_write; |
fmanzano_dtk | 1:9e821e640117 | 357 | } |
fmanzano_dtk | 1:9e821e640117 | 358 | } |
fmanzano_dtk | 1:9e821e640117 | 359 | |
fmanzano_dtk | 1:9e821e640117 | 360 | if(remain) { |
fmanzano_dtk | 1:9e821e640117 | 361 | // Compute page number |
fmanzano_dtk | 1:9e821e640117 | 362 | page = 0; |
fmanzano_dtk | 1:9e821e640117 | 363 | if(_type < T24C32) |
fmanzano_dtk | 1:9e821e640117 | 364 | page = (uint8_t) (address / 256); |
fmanzano_dtk | 1:9e821e640117 | 365 | |
fmanzano_dtk | 1:9e821e640117 | 366 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 367 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 368 | |
fmanzano_dtk | 1:9e821e640117 | 369 | if(_type < T24C32) { |
fmanzano_dtk | 1:9e821e640117 | 370 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 371 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 372 | |
fmanzano_dtk | 1:9e821e640117 | 373 | if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page |
fmanzano_dtk | 1:9e821e640117 | 374 | // Add data for the current page |
fmanzano_dtk | 1:9e821e640117 | 375 | for(j = 0;j < remain;j++) |
fmanzano_dtk | 1:9e821e640117 | 376 | cmd[j + 1] = (uint8_t) data[blocs * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 377 | |
fmanzano_dtk | 1:9e821e640117 | 378 | // Write data for the current page |
fmanzano_dtk | 1:9e821e640117 | 379 | ack = _i2c.write((int)addr,(char *)cmd,remain + 1); |
fmanzano_dtk | 1:9e821e640117 | 380 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 381 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 382 | return; |
fmanzano_dtk | 1:9e821e640117 | 383 | } |
fmanzano_dtk | 1:9e821e640117 | 384 | |
fmanzano_dtk | 1:9e821e640117 | 385 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 386 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 387 | } |
fmanzano_dtk | 1:9e821e640117 | 388 | else { // Data on 2 pages. We must split the write |
fmanzano_dtk | 1:9e821e640117 | 389 | // Number of bytes in current page |
fmanzano_dtk | 1:9e821e640117 | 390 | fpart = (page + 1) * 256 - address; |
fmanzano_dtk | 1:9e821e640117 | 391 | |
fmanzano_dtk | 1:9e821e640117 | 392 | // Add data for current page |
fmanzano_dtk | 1:9e821e640117 | 393 | for(j = 0;j < fpart;j++) |
fmanzano_dtk | 1:9e821e640117 | 394 | cmd[j + 1] = (uint8_t) data[blocs * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 395 | |
fmanzano_dtk | 1:9e821e640117 | 396 | // Write data for current page |
fmanzano_dtk | 1:9e821e640117 | 397 | ack = _i2c.write((int)addr,(char *)cmd,fpart + 1); |
fmanzano_dtk | 1:9e821e640117 | 398 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 399 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 400 | return; |
fmanzano_dtk | 1:9e821e640117 | 401 | } |
fmanzano_dtk | 1:9e821e640117 | 402 | |
fmanzano_dtk | 1:9e821e640117 | 403 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 404 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 405 | |
fmanzano_dtk | 1:9e821e640117 | 406 | // Increment address |
fmanzano_dtk | 1:9e821e640117 | 407 | address += fpart; |
fmanzano_dtk | 1:9e821e640117 | 408 | |
fmanzano_dtk | 1:9e821e640117 | 409 | if(page < _page_number - 1) { |
fmanzano_dtk | 1:9e821e640117 | 410 | // Increment page |
fmanzano_dtk | 1:9e821e640117 | 411 | page++; |
fmanzano_dtk | 1:9e821e640117 | 412 | |
fmanzano_dtk | 1:9e821e640117 | 413 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 414 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 415 | |
fmanzano_dtk | 1:9e821e640117 | 416 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 417 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 418 | |
fmanzano_dtk | 1:9e821e640117 | 419 | // Data index |
fmanzano_dtk | 1:9e821e640117 | 420 | ind = blocs * _page_write + fpart; |
fmanzano_dtk | 1:9e821e640117 | 421 | |
fmanzano_dtk | 1:9e821e640117 | 422 | // Number of bytes in next page |
fmanzano_dtk | 1:9e821e640117 | 423 | lpart = remain - fpart; |
fmanzano_dtk | 1:9e821e640117 | 424 | |
fmanzano_dtk | 1:9e821e640117 | 425 | // Add data for next page |
fmanzano_dtk | 1:9e821e640117 | 426 | for(j = 0;j < lpart;j++) |
fmanzano_dtk | 1:9e821e640117 | 427 | cmd[j + 1] = (uint8_t) data[ind + j]; |
fmanzano_dtk | 1:9e821e640117 | 428 | |
fmanzano_dtk | 1:9e821e640117 | 429 | // Write data for next page |
fmanzano_dtk | 1:9e821e640117 | 430 | ack = _i2c.write((int)addr,(char *)cmd,lpart + 1); |
fmanzano_dtk | 1:9e821e640117 | 431 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 432 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 433 | return; |
fmanzano_dtk | 1:9e821e640117 | 434 | } |
fmanzano_dtk | 1:9e821e640117 | 435 | |
fmanzano_dtk | 1:9e821e640117 | 436 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 437 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 438 | } |
fmanzano_dtk | 1:9e821e640117 | 439 | } |
fmanzano_dtk | 1:9e821e640117 | 440 | } |
fmanzano_dtk | 1:9e821e640117 | 441 | else { |
fmanzano_dtk | 1:9e821e640117 | 442 | // Fist word address (MSB) |
fmanzano_dtk | 1:9e821e640117 | 443 | cmd[0] = (uint8_t) (address >> 8); |
fmanzano_dtk | 1:9e821e640117 | 444 | |
fmanzano_dtk | 1:9e821e640117 | 445 | // Second word address (LSB) |
fmanzano_dtk | 1:9e821e640117 | 446 | cmd[1] = (uint8_t) address; |
fmanzano_dtk | 1:9e821e640117 | 447 | |
fmanzano_dtk | 1:9e821e640117 | 448 | // Add data for the current page |
fmanzano_dtk | 1:9e821e640117 | 449 | for(j = 0;j < remain;j++) |
fmanzano_dtk | 1:9e821e640117 | 450 | cmd[j + 2] = (uint8_t) data[blocs * _page_write + j]; |
fmanzano_dtk | 1:9e821e640117 | 451 | |
fmanzano_dtk | 1:9e821e640117 | 452 | // Write data for the current page |
fmanzano_dtk | 1:9e821e640117 | 453 | ack = _i2c.write((int)addr,(char *)cmd,remain + 2); |
fmanzano_dtk | 1:9e821e640117 | 454 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 455 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 456 | return; |
fmanzano_dtk | 1:9e821e640117 | 457 | } |
fmanzano_dtk | 1:9e821e640117 | 458 | |
fmanzano_dtk | 1:9e821e640117 | 459 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 460 | ready(); |
fmanzano_dtk | 1:9e821e640117 | 461 | } |
fmanzano_dtk | 1:9e821e640117 | 462 | } |
fmanzano_dtk | 1:9e821e640117 | 463 | |
fmanzano_dtk | 1:9e821e640117 | 464 | } |
fmanzano_dtk | 1:9e821e640117 | 465 | |
fmanzano_dtk | 1:9e821e640117 | 466 | /** |
fmanzano_dtk | 1:9e821e640117 | 467 | * void write(uint32_t address, int16_t data) |
fmanzano_dtk | 1:9e821e640117 | 468 | * |
fmanzano_dtk | 1:9e821e640117 | 469 | * Write short |
fmanzano_dtk | 1:9e821e640117 | 470 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 471 | * @param data short to write (int16_t) |
fmanzano_dtk | 1:9e821e640117 | 472 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 473 | */ |
fmanzano_dtk | 1:9e821e640117 | 474 | void EEPROM::write(uint32_t address, int16_t data) |
fmanzano_dtk | 1:9e821e640117 | 475 | { |
fmanzano_dtk | 1:9e821e640117 | 476 | int8_t cmd[2]; |
fmanzano_dtk | 1:9e821e640117 | 477 | |
fmanzano_dtk | 1:9e821e640117 | 478 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 479 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 480 | return; |
fmanzano_dtk | 1:9e821e640117 | 481 | |
fmanzano_dtk | 1:9e821e640117 | 482 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 483 | if(!checkAddress(address + 1)) { |
fmanzano_dtk | 1:9e821e640117 | 484 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 485 | return; |
fmanzano_dtk | 1:9e821e640117 | 486 | } |
fmanzano_dtk | 1:9e821e640117 | 487 | |
fmanzano_dtk | 1:9e821e640117 | 488 | memcpy(cmd,&data,2); |
fmanzano_dtk | 1:9e821e640117 | 489 | |
fmanzano_dtk | 1:9e821e640117 | 490 | write(address,cmd,2); |
fmanzano_dtk | 1:9e821e640117 | 491 | |
fmanzano_dtk | 1:9e821e640117 | 492 | } |
fmanzano_dtk | 1:9e821e640117 | 493 | |
fmanzano_dtk | 1:9e821e640117 | 494 | /** |
fmanzano_dtk | 1:9e821e640117 | 495 | * void write(uint32_t address, int32_t data) |
fmanzano_dtk | 1:9e821e640117 | 496 | * |
fmanzano_dtk | 1:9e821e640117 | 497 | * Write long |
fmanzano_dtk | 1:9e821e640117 | 498 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 499 | * @param data long to write (int32_t) |
fmanzano_dtk | 1:9e821e640117 | 500 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 501 | */ |
fmanzano_dtk | 1:9e821e640117 | 502 | void EEPROM::write(uint32_t address, int32_t data) |
fmanzano_dtk | 1:9e821e640117 | 503 | { |
fmanzano_dtk | 1:9e821e640117 | 504 | int8_t cmd[4]; |
fmanzano_dtk | 1:9e821e640117 | 505 | |
fmanzano_dtk | 1:9e821e640117 | 506 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 507 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 508 | return; |
fmanzano_dtk | 1:9e821e640117 | 509 | |
fmanzano_dtk | 1:9e821e640117 | 510 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 511 | if(!checkAddress(address + 3)) { |
fmanzano_dtk | 1:9e821e640117 | 512 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 513 | return; |
fmanzano_dtk | 1:9e821e640117 | 514 | } |
fmanzano_dtk | 1:9e821e640117 | 515 | |
fmanzano_dtk | 1:9e821e640117 | 516 | memcpy(cmd,&data,4); |
fmanzano_dtk | 1:9e821e640117 | 517 | |
fmanzano_dtk | 1:9e821e640117 | 518 | write(address,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 519 | |
fmanzano_dtk | 1:9e821e640117 | 520 | } |
fmanzano_dtk | 1:9e821e640117 | 521 | |
fmanzano_dtk | 1:9e821e640117 | 522 | /** |
fmanzano_dtk | 1:9e821e640117 | 523 | * void write(uint32_t address, float data) |
fmanzano_dtk | 1:9e821e640117 | 524 | * |
fmanzano_dtk | 1:9e821e640117 | 525 | * Write float |
fmanzano_dtk | 1:9e821e640117 | 526 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 527 | * @param data float to write (float) |
fmanzano_dtk | 1:9e821e640117 | 528 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 529 | */ |
fmanzano_dtk | 1:9e821e640117 | 530 | void EEPROM::write(uint32_t address, float data) |
fmanzano_dtk | 1:9e821e640117 | 531 | { |
fmanzano_dtk | 1:9e821e640117 | 532 | int8_t cmd[4]; |
fmanzano_dtk | 1:9e821e640117 | 533 | |
fmanzano_dtk | 1:9e821e640117 | 534 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 535 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 536 | return; |
fmanzano_dtk | 1:9e821e640117 | 537 | |
fmanzano_dtk | 1:9e821e640117 | 538 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 539 | if(!checkAddress(address + 3)) { |
fmanzano_dtk | 1:9e821e640117 | 540 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 541 | return; |
fmanzano_dtk | 1:9e821e640117 | 542 | } |
fmanzano_dtk | 1:9e821e640117 | 543 | |
fmanzano_dtk | 1:9e821e640117 | 544 | memcpy(cmd,&data,4); |
fmanzano_dtk | 1:9e821e640117 | 545 | |
fmanzano_dtk | 1:9e821e640117 | 546 | write(address,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 547 | |
fmanzano_dtk | 1:9e821e640117 | 548 | } |
fmanzano_dtk | 1:9e821e640117 | 549 | |
fmanzano_dtk | 1:9e821e640117 | 550 | /** |
fmanzano_dtk | 1:9e821e640117 | 551 | * void write(uint32_t address, void *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 552 | * |
fmanzano_dtk | 1:9e821e640117 | 553 | * Write anything (use the page write mode) |
fmanzano_dtk | 1:9e821e640117 | 554 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 555 | * @param data data to write (void *) |
fmanzano_dtk | 1:9e821e640117 | 556 | * @param size number of bytes to write (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 557 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 558 | */ |
fmanzano_dtk | 1:9e821e640117 | 559 | void EEPROM::write(uint32_t address, void *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 560 | { |
fmanzano_dtk | 1:9e821e640117 | 561 | int8_t *cmd = NULL; |
fmanzano_dtk | 1:9e821e640117 | 562 | |
fmanzano_dtk | 1:9e821e640117 | 563 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 564 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 565 | return; |
fmanzano_dtk | 1:9e821e640117 | 566 | |
fmanzano_dtk | 1:9e821e640117 | 567 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 568 | if(!checkAddress(address + size - 1)) { |
fmanzano_dtk | 1:9e821e640117 | 569 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 570 | return; |
fmanzano_dtk | 1:9e821e640117 | 571 | } |
fmanzano_dtk | 1:9e821e640117 | 572 | |
fmanzano_dtk | 1:9e821e640117 | 573 | cmd = (int8_t *)malloc(size); |
fmanzano_dtk | 1:9e821e640117 | 574 | if(cmd == NULL) { |
fmanzano_dtk | 1:9e821e640117 | 575 | _errnum = EEPROM_MallocError; |
fmanzano_dtk | 1:9e821e640117 | 576 | return; |
fmanzano_dtk | 1:9e821e640117 | 577 | } |
fmanzano_dtk | 1:9e821e640117 | 578 | |
fmanzano_dtk | 1:9e821e640117 | 579 | memcpy(cmd,(uint8_t *)data,size); |
fmanzano_dtk | 1:9e821e640117 | 580 | |
fmanzano_dtk | 1:9e821e640117 | 581 | write(address,cmd,size); |
fmanzano_dtk | 1:9e821e640117 | 582 | |
fmanzano_dtk | 1:9e821e640117 | 583 | free(cmd); |
fmanzano_dtk | 1:9e821e640117 | 584 | |
fmanzano_dtk | 1:9e821e640117 | 585 | } |
fmanzano_dtk | 1:9e821e640117 | 586 | |
fmanzano_dtk | 1:9e821e640117 | 587 | /** |
fmanzano_dtk | 1:9e821e640117 | 588 | * void read(uint32_t address, int8_t& data) |
fmanzano_dtk | 1:9e821e640117 | 589 | * |
fmanzano_dtk | 1:9e821e640117 | 590 | * Random read byte |
fmanzano_dtk | 1:9e821e640117 | 591 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 592 | * @param data byte to read (int8_t&) |
fmanzano_dtk | 1:9e821e640117 | 593 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 594 | */ |
fmanzano_dtk | 1:9e821e640117 | 595 | void EEPROM::read(uint32_t address, int8_t& data) |
fmanzano_dtk | 1:9e821e640117 | 596 | { |
fmanzano_dtk | 1:9e821e640117 | 597 | uint8_t page; |
fmanzano_dtk | 1:9e821e640117 | 598 | uint8_t addr; |
fmanzano_dtk | 1:9e821e640117 | 599 | uint8_t cmd[2]; |
fmanzano_dtk | 1:9e821e640117 | 600 | uint8_t len; |
fmanzano_dtk | 1:9e821e640117 | 601 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 602 | |
fmanzano_dtk | 1:9e821e640117 | 603 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 604 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 605 | return; |
fmanzano_dtk | 1:9e821e640117 | 606 | |
fmanzano_dtk | 1:9e821e640117 | 607 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 608 | if(!checkAddress(address)) { |
fmanzano_dtk | 1:9e821e640117 | 609 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 610 | return; |
fmanzano_dtk | 1:9e821e640117 | 611 | } |
fmanzano_dtk | 1:9e821e640117 | 612 | |
fmanzano_dtk | 1:9e821e640117 | 613 | // Compute page number |
fmanzano_dtk | 1:9e821e640117 | 614 | page = 0; |
fmanzano_dtk | 1:9e821e640117 | 615 | if(_type < T24C32) |
fmanzano_dtk | 1:9e821e640117 | 616 | page = (uint8_t) (address / 256); |
fmanzano_dtk | 1:9e821e640117 | 617 | |
fmanzano_dtk | 1:9e821e640117 | 618 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 619 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 620 | |
fmanzano_dtk | 1:9e821e640117 | 621 | if(_type < T24C32) { |
fmanzano_dtk | 1:9e821e640117 | 622 | len = 1; |
fmanzano_dtk | 1:9e821e640117 | 623 | |
fmanzano_dtk | 1:9e821e640117 | 624 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 625 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 626 | } |
fmanzano_dtk | 1:9e821e640117 | 627 | else { |
fmanzano_dtk | 1:9e821e640117 | 628 | len = 2; |
fmanzano_dtk | 1:9e821e640117 | 629 | |
fmanzano_dtk | 1:9e821e640117 | 630 | // First word address (MSB) |
fmanzano_dtk | 1:9e821e640117 | 631 | cmd[0] = (uint8_t) (address >> 8); |
fmanzano_dtk | 1:9e821e640117 | 632 | |
fmanzano_dtk | 1:9e821e640117 | 633 | // Second word address (LSB) |
fmanzano_dtk | 1:9e821e640117 | 634 | cmd[1] = (uint8_t)address; |
fmanzano_dtk | 1:9e821e640117 | 635 | } |
fmanzano_dtk | 1:9e821e640117 | 636 | |
fmanzano_dtk | 1:9e821e640117 | 637 | // Write command |
fmanzano_dtk | 1:9e821e640117 | 638 | ack = _i2c.write((int)addr,(char *)cmd,len,true); |
fmanzano_dtk | 1:9e821e640117 | 639 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 640 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 641 | return; |
fmanzano_dtk | 1:9e821e640117 | 642 | } |
fmanzano_dtk | 1:9e821e640117 | 643 | |
fmanzano_dtk | 1:9e821e640117 | 644 | // Read data |
fmanzano_dtk | 1:9e821e640117 | 645 | ack = _i2c.read((int)addr,(char *)&data,sizeof(data)); |
fmanzano_dtk | 1:9e821e640117 | 646 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 647 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 648 | return; |
fmanzano_dtk | 1:9e821e640117 | 649 | } |
fmanzano_dtk | 1:9e821e640117 | 650 | |
fmanzano_dtk | 1:9e821e640117 | 651 | } |
fmanzano_dtk | 1:9e821e640117 | 652 | |
fmanzano_dtk | 1:9e821e640117 | 653 | /** |
fmanzano_dtk | 1:9e821e640117 | 654 | * void read(uint32_t address, int8_t *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 655 | * |
fmanzano_dtk | 1:9e821e640117 | 656 | * Sequential read byte |
fmanzano_dtk | 1:9e821e640117 | 657 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 658 | * @param data bytes array to read (int8_t[]&) |
fmanzano_dtk | 1:9e821e640117 | 659 | * @param size number of bytes to read (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 660 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 661 | */ |
fmanzano_dtk | 1:9e821e640117 | 662 | void EEPROM::read(uint32_t address, int8_t *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 663 | { |
fmanzano_dtk | 1:9e821e640117 | 664 | uint8_t page; |
fmanzano_dtk | 1:9e821e640117 | 665 | uint8_t addr; |
fmanzano_dtk | 1:9e821e640117 | 666 | uint8_t cmd[2]; |
fmanzano_dtk | 1:9e821e640117 | 667 | uint8_t len; |
fmanzano_dtk | 1:9e821e640117 | 668 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 669 | |
fmanzano_dtk | 1:9e821e640117 | 670 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 671 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 672 | return; |
fmanzano_dtk | 1:9e821e640117 | 673 | |
fmanzano_dtk | 1:9e821e640117 | 674 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 675 | if(!checkAddress(address)) { |
fmanzano_dtk | 1:9e821e640117 | 676 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 677 | return; |
fmanzano_dtk | 1:9e821e640117 | 678 | } |
fmanzano_dtk | 1:9e821e640117 | 679 | |
fmanzano_dtk | 1:9e821e640117 | 680 | // Check size |
fmanzano_dtk | 1:9e821e640117 | 681 | if(!checkAddress(address + size - 1)) { |
fmanzano_dtk | 1:9e821e640117 | 682 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 683 | return; |
fmanzano_dtk | 1:9e821e640117 | 684 | } |
fmanzano_dtk | 1:9e821e640117 | 685 | |
fmanzano_dtk | 1:9e821e640117 | 686 | // Compute page number |
fmanzano_dtk | 1:9e821e640117 | 687 | page = 0; |
fmanzano_dtk | 1:9e821e640117 | 688 | if(_type < T24C32) |
fmanzano_dtk | 1:9e821e640117 | 689 | page = (uint8_t) (address / 256); |
fmanzano_dtk | 1:9e821e640117 | 690 | |
fmanzano_dtk | 1:9e821e640117 | 691 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 692 | addr = EEPROM_Address | _address | (page << 1); |
fmanzano_dtk | 1:9e821e640117 | 693 | |
fmanzano_dtk | 1:9e821e640117 | 694 | if(_type < T24C32) { |
fmanzano_dtk | 1:9e821e640117 | 695 | len = 1; |
fmanzano_dtk | 1:9e821e640117 | 696 | |
fmanzano_dtk | 1:9e821e640117 | 697 | // Word address |
fmanzano_dtk | 1:9e821e640117 | 698 | cmd[0] = (uint8_t) (address - page * 256); |
fmanzano_dtk | 1:9e821e640117 | 699 | } |
fmanzano_dtk | 1:9e821e640117 | 700 | else { |
fmanzano_dtk | 1:9e821e640117 | 701 | len = 2; |
fmanzano_dtk | 1:9e821e640117 | 702 | |
fmanzano_dtk | 1:9e821e640117 | 703 | // First word address (MSB) |
fmanzano_dtk | 1:9e821e640117 | 704 | cmd[0] = (uint8_t) (address >> 8); |
fmanzano_dtk | 1:9e821e640117 | 705 | |
fmanzano_dtk | 1:9e821e640117 | 706 | // Second word address (LSB) |
fmanzano_dtk | 1:9e821e640117 | 707 | cmd[1] = (uint8_t) address; |
fmanzano_dtk | 1:9e821e640117 | 708 | } |
fmanzano_dtk | 1:9e821e640117 | 709 | |
fmanzano_dtk | 1:9e821e640117 | 710 | // Write command |
fmanzano_dtk | 1:9e821e640117 | 711 | ack = _i2c.write((int)addr,(char *)cmd,len,true); |
fmanzano_dtk | 1:9e821e640117 | 712 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 713 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 714 | return; |
fmanzano_dtk | 1:9e821e640117 | 715 | } |
fmanzano_dtk | 1:9e821e640117 | 716 | |
fmanzano_dtk | 1:9e821e640117 | 717 | // Sequential read |
fmanzano_dtk | 1:9e821e640117 | 718 | ack = _i2c.read((int)addr,(char *)data,size); |
fmanzano_dtk | 1:9e821e640117 | 719 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 720 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 721 | return; |
fmanzano_dtk | 1:9e821e640117 | 722 | } |
fmanzano_dtk | 1:9e821e640117 | 723 | |
fmanzano_dtk | 1:9e821e640117 | 724 | } |
fmanzano_dtk | 1:9e821e640117 | 725 | |
fmanzano_dtk | 1:9e821e640117 | 726 | /** |
fmanzano_dtk | 1:9e821e640117 | 727 | * void read(int8_t& data) |
fmanzano_dtk | 1:9e821e640117 | 728 | * |
fmanzano_dtk | 1:9e821e640117 | 729 | * Current address read byte |
fmanzano_dtk | 1:9e821e640117 | 730 | * @param data byte to read (int8_t&) |
fmanzano_dtk | 1:9e821e640117 | 731 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 732 | */ |
fmanzano_dtk | 1:9e821e640117 | 733 | void EEPROM::read(int8_t& data) |
fmanzano_dtk | 1:9e821e640117 | 734 | { |
fmanzano_dtk | 1:9e821e640117 | 735 | uint8_t addr; |
fmanzano_dtk | 1:9e821e640117 | 736 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 737 | |
fmanzano_dtk | 1:9e821e640117 | 738 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 739 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 740 | return; |
fmanzano_dtk | 1:9e821e640117 | 741 | |
fmanzano_dtk | 1:9e821e640117 | 742 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 743 | addr = EEPROM_Address | _address; |
fmanzano_dtk | 1:9e821e640117 | 744 | |
fmanzano_dtk | 1:9e821e640117 | 745 | // Read data |
fmanzano_dtk | 1:9e821e640117 | 746 | ack = _i2c.read((int)addr,(char *)&data,sizeof(data)); |
fmanzano_dtk | 1:9e821e640117 | 747 | if(ack != 0) { |
fmanzano_dtk | 1:9e821e640117 | 748 | _errnum = EEPROM_I2cError; |
fmanzano_dtk | 1:9e821e640117 | 749 | return; |
fmanzano_dtk | 1:9e821e640117 | 750 | } |
fmanzano_dtk | 1:9e821e640117 | 751 | |
fmanzano_dtk | 1:9e821e640117 | 752 | } |
fmanzano_dtk | 1:9e821e640117 | 753 | |
fmanzano_dtk | 1:9e821e640117 | 754 | /** |
fmanzano_dtk | 1:9e821e640117 | 755 | * void read(uint32_t address, int16_t& data) |
fmanzano_dtk | 1:9e821e640117 | 756 | * |
fmanzano_dtk | 1:9e821e640117 | 757 | * Random read short |
fmanzano_dtk | 1:9e821e640117 | 758 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 759 | * @param data short to read (int16_t&) |
fmanzano_dtk | 1:9e821e640117 | 760 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 761 | */ |
fmanzano_dtk | 1:9e821e640117 | 762 | void EEPROM::read(uint32_t address, int16_t& data) |
fmanzano_dtk | 1:9e821e640117 | 763 | { |
fmanzano_dtk | 1:9e821e640117 | 764 | int8_t cmd[2]; |
fmanzano_dtk | 1:9e821e640117 | 765 | |
fmanzano_dtk | 1:9e821e640117 | 766 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 767 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 768 | return; |
fmanzano_dtk | 1:9e821e640117 | 769 | |
fmanzano_dtk | 1:9e821e640117 | 770 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 771 | if(!checkAddress(address + 1)) { |
fmanzano_dtk | 1:9e821e640117 | 772 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 773 | return; |
fmanzano_dtk | 1:9e821e640117 | 774 | } |
fmanzano_dtk | 1:9e821e640117 | 775 | |
fmanzano_dtk | 1:9e821e640117 | 776 | read(address,cmd,2); |
fmanzano_dtk | 1:9e821e640117 | 777 | |
fmanzano_dtk | 1:9e821e640117 | 778 | memcpy(&data,cmd,2); |
fmanzano_dtk | 1:9e821e640117 | 779 | |
fmanzano_dtk | 1:9e821e640117 | 780 | } |
fmanzano_dtk | 1:9e821e640117 | 781 | |
fmanzano_dtk | 1:9e821e640117 | 782 | /** |
fmanzano_dtk | 1:9e821e640117 | 783 | * void read(uint32_t address, int32_t& data) |
fmanzano_dtk | 1:9e821e640117 | 784 | * |
fmanzano_dtk | 1:9e821e640117 | 785 | * Random read long |
fmanzano_dtk | 1:9e821e640117 | 786 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 787 | * @param data long to read (int32_t&) |
fmanzano_dtk | 1:9e821e640117 | 788 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 789 | */ |
fmanzano_dtk | 1:9e821e640117 | 790 | void EEPROM::read(uint32_t address, int32_t& data) |
fmanzano_dtk | 1:9e821e640117 | 791 | { |
fmanzano_dtk | 1:9e821e640117 | 792 | int8_t cmd[4]; |
fmanzano_dtk | 1:9e821e640117 | 793 | |
fmanzano_dtk | 1:9e821e640117 | 794 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 795 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 796 | return; |
fmanzano_dtk | 1:9e821e640117 | 797 | |
fmanzano_dtk | 1:9e821e640117 | 798 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 799 | if(!checkAddress(address + 3)) { |
fmanzano_dtk | 1:9e821e640117 | 800 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 801 | return; |
fmanzano_dtk | 1:9e821e640117 | 802 | } |
fmanzano_dtk | 1:9e821e640117 | 803 | |
fmanzano_dtk | 1:9e821e640117 | 804 | read(address,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 805 | |
fmanzano_dtk | 1:9e821e640117 | 806 | memcpy(&data,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 807 | |
fmanzano_dtk | 1:9e821e640117 | 808 | } |
fmanzano_dtk | 1:9e821e640117 | 809 | |
fmanzano_dtk | 1:9e821e640117 | 810 | /** |
fmanzano_dtk | 1:9e821e640117 | 811 | * void read(uint32_t address, float& data) |
fmanzano_dtk | 1:9e821e640117 | 812 | * |
fmanzano_dtk | 1:9e821e640117 | 813 | * Random read float |
fmanzano_dtk | 1:9e821e640117 | 814 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 815 | * @param data float to read (float&) |
fmanzano_dtk | 1:9e821e640117 | 816 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 817 | */ |
fmanzano_dtk | 1:9e821e640117 | 818 | void EEPROM::read(uint32_t address, float& data) |
fmanzano_dtk | 1:9e821e640117 | 819 | { |
fmanzano_dtk | 1:9e821e640117 | 820 | int8_t cmd[4]; |
fmanzano_dtk | 1:9e821e640117 | 821 | |
fmanzano_dtk | 1:9e821e640117 | 822 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 823 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 824 | return; |
fmanzano_dtk | 1:9e821e640117 | 825 | |
fmanzano_dtk | 1:9e821e640117 | 826 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 827 | if(!checkAddress(address + 3)) { |
fmanzano_dtk | 1:9e821e640117 | 828 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 829 | return; |
fmanzano_dtk | 1:9e821e640117 | 830 | } |
fmanzano_dtk | 1:9e821e640117 | 831 | |
fmanzano_dtk | 1:9e821e640117 | 832 | read(address,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 833 | |
fmanzano_dtk | 1:9e821e640117 | 834 | memcpy(&data,cmd,4); |
fmanzano_dtk | 1:9e821e640117 | 835 | |
fmanzano_dtk | 1:9e821e640117 | 836 | } |
fmanzano_dtk | 1:9e821e640117 | 837 | |
fmanzano_dtk | 1:9e821e640117 | 838 | /** |
fmanzano_dtk | 1:9e821e640117 | 839 | * void read(uint32_t address, void *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 840 | * |
fmanzano_dtk | 1:9e821e640117 | 841 | * Random read anything |
fmanzano_dtk | 1:9e821e640117 | 842 | * @param address start address (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 843 | * @param data data to read (void *) |
fmanzano_dtk | 1:9e821e640117 | 844 | * @param size number of bytes to read (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 845 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 846 | */ |
fmanzano_dtk | 1:9e821e640117 | 847 | void EEPROM::read(uint32_t address, void *data, uint32_t size) |
fmanzano_dtk | 1:9e821e640117 | 848 | { |
fmanzano_dtk | 1:9e821e640117 | 849 | int8_t *cmd = NULL; |
fmanzano_dtk | 1:9e821e640117 | 850 | |
fmanzano_dtk | 1:9e821e640117 | 851 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 852 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 853 | return; |
fmanzano_dtk | 1:9e821e640117 | 854 | |
fmanzano_dtk | 1:9e821e640117 | 855 | // Check address |
fmanzano_dtk | 1:9e821e640117 | 856 | if(!checkAddress(address + size - 1)) { |
fmanzano_dtk | 1:9e821e640117 | 857 | _errnum = EEPROM_OutOfRange; |
fmanzano_dtk | 1:9e821e640117 | 858 | return; |
fmanzano_dtk | 1:9e821e640117 | 859 | } |
fmanzano_dtk | 1:9e821e640117 | 860 | |
fmanzano_dtk | 1:9e821e640117 | 861 | cmd = (int8_t *)malloc(size); |
fmanzano_dtk | 1:9e821e640117 | 862 | |
fmanzano_dtk | 1:9e821e640117 | 863 | if(cmd == NULL) { |
fmanzano_dtk | 1:9e821e640117 | 864 | _errnum = EEPROM_MallocError; |
fmanzano_dtk | 1:9e821e640117 | 865 | return; |
fmanzano_dtk | 1:9e821e640117 | 866 | } |
fmanzano_dtk | 1:9e821e640117 | 867 | |
fmanzano_dtk | 1:9e821e640117 | 868 | read(address,(int8_t *)cmd,size); |
fmanzano_dtk | 1:9e821e640117 | 869 | |
fmanzano_dtk | 1:9e821e640117 | 870 | memcpy(data,cmd,size); |
fmanzano_dtk | 1:9e821e640117 | 871 | |
fmanzano_dtk | 1:9e821e640117 | 872 | free(cmd); |
fmanzano_dtk | 1:9e821e640117 | 873 | |
fmanzano_dtk | 1:9e821e640117 | 874 | } |
fmanzano_dtk | 1:9e821e640117 | 875 | |
fmanzano_dtk | 1:9e821e640117 | 876 | /** |
fmanzano_dtk | 1:9e821e640117 | 877 | * void clear(void) |
fmanzano_dtk | 1:9e821e640117 | 878 | * |
fmanzano_dtk | 1:9e821e640117 | 879 | * Clear eeprom (write with 0) |
fmanzano_dtk | 1:9e821e640117 | 880 | * @param none |
fmanzano_dtk | 1:9e821e640117 | 881 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 882 | */ |
fmanzano_dtk | 1:9e821e640117 | 883 | void EEPROM::clear(void) |
fmanzano_dtk | 1:9e821e640117 | 884 | { |
fmanzano_dtk | 1:9e821e640117 | 885 | int32_t data; |
fmanzano_dtk | 1:9e821e640117 | 886 | uint32_t i; |
fmanzano_dtk | 1:9e821e640117 | 887 | |
fmanzano_dtk | 1:9e821e640117 | 888 | data = 0; |
fmanzano_dtk | 1:9e821e640117 | 889 | |
fmanzano_dtk | 1:9e821e640117 | 890 | for(i = 0; i < _size / 4;i++) { |
fmanzano_dtk | 1:9e821e640117 | 891 | write((uint32_t)(i * 4),data); |
fmanzano_dtk | 1:9e821e640117 | 892 | } |
fmanzano_dtk | 1:9e821e640117 | 893 | } |
fmanzano_dtk | 1:9e821e640117 | 894 | |
fmanzano_dtk | 1:9e821e640117 | 895 | /** |
fmanzano_dtk | 1:9e821e640117 | 896 | * void ready(void) |
fmanzano_dtk | 1:9e821e640117 | 897 | * |
fmanzano_dtk | 1:9e821e640117 | 898 | * Wait eeprom ready |
fmanzano_dtk | 1:9e821e640117 | 899 | * @param none |
fmanzano_dtk | 1:9e821e640117 | 900 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 901 | */ |
fmanzano_dtk | 1:9e821e640117 | 902 | void EEPROM::ready(void) |
fmanzano_dtk | 1:9e821e640117 | 903 | { |
fmanzano_dtk | 1:9e821e640117 | 904 | int ack; |
fmanzano_dtk | 1:9e821e640117 | 905 | uint8_t addr; |
fmanzano_dtk | 1:9e821e640117 | 906 | uint8_t cmd[2]; |
fmanzano_dtk | 1:9e821e640117 | 907 | |
fmanzano_dtk | 1:9e821e640117 | 908 | // Check error |
fmanzano_dtk | 1:9e821e640117 | 909 | if(_errnum) |
fmanzano_dtk | 1:9e821e640117 | 910 | return; |
fmanzano_dtk | 1:9e821e640117 | 911 | |
fmanzano_dtk | 1:9e821e640117 | 912 | // Device address |
fmanzano_dtk | 1:9e821e640117 | 913 | addr = EEPROM_Address | _address; |
fmanzano_dtk | 1:9e821e640117 | 914 | |
fmanzano_dtk | 1:9e821e640117 | 915 | cmd[0] = 0; |
fmanzano_dtk | 1:9e821e640117 | 916 | |
fmanzano_dtk | 1:9e821e640117 | 917 | // Wait end of write |
fmanzano_dtk | 1:9e821e640117 | 918 | do { |
fmanzano_dtk | 1:9e821e640117 | 919 | ack = _i2c.write((int)addr,(char *)cmd,0); |
fmanzano_dtk | 1:9e821e640117 | 920 | //wait(0.5); |
fmanzano_dtk | 1:9e821e640117 | 921 | } while(ack != 0); |
fmanzano_dtk | 1:9e821e640117 | 922 | |
fmanzano_dtk | 1:9e821e640117 | 923 | } |
fmanzano_dtk | 1:9e821e640117 | 924 | |
fmanzano_dtk | 1:9e821e640117 | 925 | /** |
fmanzano_dtk | 1:9e821e640117 | 926 | * uint32_t getSize(void) |
fmanzano_dtk | 1:9e821e640117 | 927 | * |
fmanzano_dtk | 1:9e821e640117 | 928 | * Get eeprom size in bytes |
fmanzano_dtk | 1:9e821e640117 | 929 | * @param none |
fmanzano_dtk | 1:9e821e640117 | 930 | * @return size in bytes (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 931 | */ |
fmanzano_dtk | 1:9e821e640117 | 932 | uint32_t EEPROM::getSize(void) |
fmanzano_dtk | 1:9e821e640117 | 933 | { |
fmanzano_dtk | 1:9e821e640117 | 934 | return(_size); |
fmanzano_dtk | 1:9e821e640117 | 935 | } |
fmanzano_dtk | 1:9e821e640117 | 936 | |
fmanzano_dtk | 1:9e821e640117 | 937 | /** |
fmanzano_dtk | 1:9e821e640117 | 938 | * const char* getName(void) |
fmanzano_dtk | 1:9e821e640117 | 939 | * |
fmanzano_dtk | 1:9e821e640117 | 940 | * Get eeprom name |
fmanzano_dtk | 1:9e821e640117 | 941 | * @param none |
fmanzano_dtk | 1:9e821e640117 | 942 | * @return name (const char*) |
fmanzano_dtk | 1:9e821e640117 | 943 | */ |
fmanzano_dtk | 1:9e821e640117 | 944 | const char* EEPROM::getName(void) |
fmanzano_dtk | 1:9e821e640117 | 945 | { |
fmanzano_dtk | 1:9e821e640117 | 946 | uint8_t i = 0; |
fmanzano_dtk | 1:9e821e640117 | 947 | |
fmanzano_dtk | 1:9e821e640117 | 948 | switch(_type) { |
fmanzano_dtk | 1:9e821e640117 | 949 | case T24C01 : |
fmanzano_dtk | 1:9e821e640117 | 950 | i = 0; |
fmanzano_dtk | 1:9e821e640117 | 951 | break; |
fmanzano_dtk | 1:9e821e640117 | 952 | case T24C02 : |
fmanzano_dtk | 1:9e821e640117 | 953 | i = 1; |
fmanzano_dtk | 1:9e821e640117 | 954 | break; |
fmanzano_dtk | 1:9e821e640117 | 955 | case T24C04 : |
fmanzano_dtk | 1:9e821e640117 | 956 | i = 2; |
fmanzano_dtk | 1:9e821e640117 | 957 | break; |
fmanzano_dtk | 1:9e821e640117 | 958 | case T24C08 : |
fmanzano_dtk | 1:9e821e640117 | 959 | i = 3; |
fmanzano_dtk | 1:9e821e640117 | 960 | break; |
fmanzano_dtk | 1:9e821e640117 | 961 | case T24C16 : |
fmanzano_dtk | 1:9e821e640117 | 962 | i = 4; |
fmanzano_dtk | 1:9e821e640117 | 963 | break; |
fmanzano_dtk | 1:9e821e640117 | 964 | case T24C32 : |
fmanzano_dtk | 1:9e821e640117 | 965 | i = 5; |
fmanzano_dtk | 1:9e821e640117 | 966 | break; |
fmanzano_dtk | 1:9e821e640117 | 967 | case T24C64 : |
fmanzano_dtk | 1:9e821e640117 | 968 | i = 6; |
fmanzano_dtk | 1:9e821e640117 | 969 | break; |
fmanzano_dtk | 1:9e821e640117 | 970 | case T24C128 : |
fmanzano_dtk | 1:9e821e640117 | 971 | i = 7; |
fmanzano_dtk | 1:9e821e640117 | 972 | break; |
fmanzano_dtk | 1:9e821e640117 | 973 | case T24C256 : |
fmanzano_dtk | 1:9e821e640117 | 974 | i = 8; |
fmanzano_dtk | 1:9e821e640117 | 975 | break; |
fmanzano_dtk | 1:9e821e640117 | 976 | case T24C512 : |
fmanzano_dtk | 1:9e821e640117 | 977 | i = 9; |
fmanzano_dtk | 1:9e821e640117 | 978 | break; |
fmanzano_dtk | 1:9e821e640117 | 979 | case T24C1024 : |
fmanzano_dtk | 1:9e821e640117 | 980 | i = 10; |
fmanzano_dtk | 1:9e821e640117 | 981 | break; |
fmanzano_dtk | 1:9e821e640117 | 982 | case T24C1025 : |
fmanzano_dtk | 1:9e821e640117 | 983 | i = 11; |
fmanzano_dtk | 1:9e821e640117 | 984 | break; |
fmanzano_dtk | 1:9e821e640117 | 985 | } |
fmanzano_dtk | 1:9e821e640117 | 986 | |
fmanzano_dtk | 1:9e821e640117 | 987 | return(_name[i]); |
fmanzano_dtk | 1:9e821e640117 | 988 | } |
fmanzano_dtk | 1:9e821e640117 | 989 | |
fmanzano_dtk | 1:9e821e640117 | 990 | /** |
fmanzano_dtk | 1:9e821e640117 | 991 | * uint8_t getError(void) |
fmanzano_dtk | 1:9e821e640117 | 992 | * |
fmanzano_dtk | 1:9e821e640117 | 993 | * Get the current error number (EEPROM_NoError if no error) |
fmanzano_dtk | 1:9e821e640117 | 994 | * @param none |
fmanzano_dtk | 1:9e821e640117 | 995 | * @return none |
fmanzano_dtk | 1:9e821e640117 | 996 | */ |
fmanzano_dtk | 1:9e821e640117 | 997 | uint8_t EEPROM::getError(void) |
fmanzano_dtk | 1:9e821e640117 | 998 | { |
fmanzano_dtk | 1:9e821e640117 | 999 | return(_errnum); |
fmanzano_dtk | 1:9e821e640117 | 1000 | } |
fmanzano_dtk | 1:9e821e640117 | 1001 | |
fmanzano_dtk | 1:9e821e640117 | 1002 | /** |
fmanzano_dtk | 1:9e821e640117 | 1003 | * bool checkAddress(uint32_t address) |
fmanzano_dtk | 1:9e821e640117 | 1004 | * |
fmanzano_dtk | 1:9e821e640117 | 1005 | * Check if address is in the eeprom range address |
fmanzano_dtk | 1:9e821e640117 | 1006 | * @param address address to check (uint32_t) |
fmanzano_dtk | 1:9e821e640117 | 1007 | * @return true if in eeprom range, overwise false (bool) |
fmanzano_dtk | 1:9e821e640117 | 1008 | */ |
fmanzano_dtk | 1:9e821e640117 | 1009 | bool EEPROM::checkAddress(uint32_t address) |
fmanzano_dtk | 1:9e821e640117 | 1010 | { |
fmanzano_dtk | 1:9e821e640117 | 1011 | bool ret = true; |
fmanzano_dtk | 1:9e821e640117 | 1012 | |
fmanzano_dtk | 1:9e821e640117 | 1013 | switch(_type) { |
fmanzano_dtk | 1:9e821e640117 | 1014 | case T24C01 : |
fmanzano_dtk | 1:9e821e640117 | 1015 | if(address >= T24C01) |
fmanzano_dtk | 1:9e821e640117 | 1016 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1017 | break; |
fmanzano_dtk | 1:9e821e640117 | 1018 | case T24C02 : |
fmanzano_dtk | 1:9e821e640117 | 1019 | if(address >= T24C02) |
fmanzano_dtk | 1:9e821e640117 | 1020 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1021 | break; |
fmanzano_dtk | 1:9e821e640117 | 1022 | case T24C04 : |
fmanzano_dtk | 1:9e821e640117 | 1023 | if(address >= T24C04) |
fmanzano_dtk | 1:9e821e640117 | 1024 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1025 | break; |
fmanzano_dtk | 1:9e821e640117 | 1026 | case T24C08 : |
fmanzano_dtk | 1:9e821e640117 | 1027 | if(address >= T24C08) |
fmanzano_dtk | 1:9e821e640117 | 1028 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1029 | break; |
fmanzano_dtk | 1:9e821e640117 | 1030 | case T24C16 : |
fmanzano_dtk | 1:9e821e640117 | 1031 | if(address >= T24C16) |
fmanzano_dtk | 1:9e821e640117 | 1032 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1033 | break; |
fmanzano_dtk | 1:9e821e640117 | 1034 | case T24C32 : |
fmanzano_dtk | 1:9e821e640117 | 1035 | if(address >= T24C32) |
fmanzano_dtk | 1:9e821e640117 | 1036 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1037 | break; |
fmanzano_dtk | 1:9e821e640117 | 1038 | case T24C64 : |
fmanzano_dtk | 1:9e821e640117 | 1039 | if(address >= T24C64) |
fmanzano_dtk | 1:9e821e640117 | 1040 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1041 | break; |
fmanzano_dtk | 1:9e821e640117 | 1042 | case T24C128 : |
fmanzano_dtk | 1:9e821e640117 | 1043 | if(address >= T24C128) |
fmanzano_dtk | 1:9e821e640117 | 1044 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1045 | break; |
fmanzano_dtk | 1:9e821e640117 | 1046 | case T24C256 : |
fmanzano_dtk | 1:9e821e640117 | 1047 | if(address >= T24C256) |
fmanzano_dtk | 1:9e821e640117 | 1048 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1049 | break; |
fmanzano_dtk | 1:9e821e640117 | 1050 | case T24C512 : |
fmanzano_dtk | 1:9e821e640117 | 1051 | if(address >= T24C512) |
fmanzano_dtk | 1:9e821e640117 | 1052 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1053 | break; |
fmanzano_dtk | 1:9e821e640117 | 1054 | case T24C1024 : |
fmanzano_dtk | 1:9e821e640117 | 1055 | if(address >= T24C1024) |
fmanzano_dtk | 1:9e821e640117 | 1056 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1057 | break; |
fmanzano_dtk | 1:9e821e640117 | 1058 | case T24C1025 : |
fmanzano_dtk | 1:9e821e640117 | 1059 | if(address >= T24C1025 - 1) |
fmanzano_dtk | 1:9e821e640117 | 1060 | ret = false; |
fmanzano_dtk | 1:9e821e640117 | 1061 | break; |
fmanzano_dtk | 1:9e821e640117 | 1062 | } |
fmanzano_dtk | 1:9e821e640117 | 1063 | |
fmanzano_dtk | 1:9e821e640117 | 1064 | return(ret); |
fmanzano_dtk | 1:9e821e640117 | 1065 | } |
fmanzano_dtk | 1:9e821e640117 | 1066 |