Proyecto ABInBev para la tarjeta Guaria 1/2.

Committer:
fmanzano_dtk
Date:
Thu Jul 07 08:56:13 2022 -0600
Revision:
18:522f706f03b1
Parent:
17:c53ea16f75c0
Actualizacion

Who changed what in which revision?

UserRevisionLine numberNew 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