I2C EEProm library

Fork of eeprom by FRA221_2015

Committer:
sweilz
Date:
Sat Nov 14 14:27:06 2015 +0000
Revision:
3:df82ebf4be54
Parent:
2:c648c5e93d5e
Child:
4:0f09fbac7613
EEPROM 24LC64

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bborredon 0:80245aff63ce 1 /***********************************************************
bborredon 0:80245aff63ce 2 Author: Bernard Borredon
bborredon 0:80245aff63ce 3 Date: 27 december 2011
bborredon 0:80245aff63ce 4 Version: 1.0
bborredon 0:80245aff63ce 5 ************************************************************/
soulx 2:c648c5e93d5e 6 #include "mbed.h"
bborredon 0:80245aff63ce 7 #include "eeprom.h"
bborredon 0:80245aff63ce 8
bborredon 0:80245aff63ce 9 #define BIT_SET(x,n) (x=x | (0x01<<n))
bborredon 0:80245aff63ce 10 #define BIT_TEST(x,n) (x & (0x01<<n))
bborredon 0:80245aff63ce 11 #define BIT_CLEAR(x,n) (x=x & ~(0x01<<n))
bborredon 0:80245aff63ce 12
sweilz 3:df82ebf4be54 13 EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl)
bborredon 0:80245aff63ce 14 {
sweilz 3:df82ebf4be54 15
sweilz 3:df82ebf4be54 16 _errnum = EEPROM_NoError;
sweilz 3:df82ebf4be54 17 _type = type;
sweilz 3:df82ebf4be54 18
sweilz 3:df82ebf4be54 19 // Check address range
sweilz 3:df82ebf4be54 20 _address = address;
sweilz 3:df82ebf4be54 21 switch(type) {
sweilz 3:df82ebf4be54 22 case T24C01 :
sweilz 3:df82ebf4be54 23 case T24C02 :
sweilz 3:df82ebf4be54 24 if(address > 7) {
sweilz 3:df82ebf4be54 25 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 26 }
sweilz 3:df82ebf4be54 27 _address = _address << 1;
sweilz 3:df82ebf4be54 28 _page_write = 8;
sweilz 3:df82ebf4be54 29 _page_number = 1;
sweilz 3:df82ebf4be54 30 break;
sweilz 3:df82ebf4be54 31 case T24C04 :
sweilz 3:df82ebf4be54 32 if(address > 7) {
sweilz 3:df82ebf4be54 33 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 34 }
sweilz 3:df82ebf4be54 35 _address = (_address & 0xFE) << 1;
sweilz 3:df82ebf4be54 36 _page_write = 16;
sweilz 3:df82ebf4be54 37 _page_number = 2;
sweilz 3:df82ebf4be54 38 break;
sweilz 3:df82ebf4be54 39 case T24C08 :
sweilz 3:df82ebf4be54 40 if(address > 7) {
sweilz 3:df82ebf4be54 41 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 42 }
sweilz 3:df82ebf4be54 43 _address = (_address & 0xFC) << 1;
sweilz 3:df82ebf4be54 44 _page_write = 16;
sweilz 3:df82ebf4be54 45 _page_number = 4;
sweilz 3:df82ebf4be54 46 break;
sweilz 3:df82ebf4be54 47 case T24C16 :
sweilz 3:df82ebf4be54 48 _address = 0;
sweilz 3:df82ebf4be54 49 _page_write = 16;
sweilz 3:df82ebf4be54 50 _page_number = 8;
sweilz 3:df82ebf4be54 51 break;
sweilz 3:df82ebf4be54 52 case T24C32 :
sweilz 3:df82ebf4be54 53 case T24C64 :
sweilz 3:df82ebf4be54 54 if(address > 7) {
sweilz 3:df82ebf4be54 55 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 56 }
sweilz 3:df82ebf4be54 57 _address = _address << 1;
sweilz 3:df82ebf4be54 58 _page_write = 32;
sweilz 3:df82ebf4be54 59 _page_number = 1;
sweilz 3:df82ebf4be54 60 break;
sweilz 3:df82ebf4be54 61 case T24C128 :
sweilz 3:df82ebf4be54 62 case T24C256 :
sweilz 3:df82ebf4be54 63 if(address > 3) {
sweilz 3:df82ebf4be54 64 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 65 }
sweilz 3:df82ebf4be54 66 _address = _address << 1;
sweilz 3:df82ebf4be54 67 _page_write = 64;
sweilz 3:df82ebf4be54 68 _page_number = 1;
sweilz 3:df82ebf4be54 69 break;
sweilz 3:df82ebf4be54 70 case T24C512 :
sweilz 3:df82ebf4be54 71 if(address > 3) {
sweilz 3:df82ebf4be54 72 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 73 }
sweilz 3:df82ebf4be54 74 _address = _address << 1;
sweilz 3:df82ebf4be54 75 _page_write = 128;
sweilz 3:df82ebf4be54 76 _page_number = 1;
sweilz 3:df82ebf4be54 77 break;
sweilz 3:df82ebf4be54 78 case T24C1024 :
sweilz 3:df82ebf4be54 79 if(address > 7) {
sweilz 3:df82ebf4be54 80 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 81 }
sweilz 3:df82ebf4be54 82 _address = (_address & 0xFE) << 1;
sweilz 3:df82ebf4be54 83 _page_write = 128;
sweilz 3:df82ebf4be54 84 _page_number = 2;
sweilz 3:df82ebf4be54 85 break;
sweilz 3:df82ebf4be54 86 case T24C1025 :
sweilz 3:df82ebf4be54 87 if(address > 3) {
sweilz 3:df82ebf4be54 88 _errnum = EEPROM_BadAddress;
sweilz 3:df82ebf4be54 89 }
sweilz 3:df82ebf4be54 90 _address = _address << 1;
sweilz 3:df82ebf4be54 91 _page_write = 128;
sweilz 3:df82ebf4be54 92 _page_number = 2;
sweilz 3:df82ebf4be54 93 break;
sweilz 3:df82ebf4be54 94 }
sweilz 3:df82ebf4be54 95
sweilz 3:df82ebf4be54 96 // Size in bytes
sweilz 3:df82ebf4be54 97 _size = _type;
sweilz 3:df82ebf4be54 98 if(_type == T24C1025)
sweilz 3:df82ebf4be54 99 _size = T24C1024;
sweilz 3:df82ebf4be54 100
sweilz 3:df82ebf4be54 101 // Set I2C frequency
sweilz 3:df82ebf4be54 102 _i2c.frequency(100000);
bborredon 0:80245aff63ce 103 }
bborredon 0:80245aff63ce 104
bborredon 0:80245aff63ce 105 void EEPROM::write(uint16_t address, int8_t data)
bborredon 0:80245aff63ce 106 {
sweilz 3:df82ebf4be54 107 uint8_t page;
sweilz 3:df82ebf4be54 108 uint8_t addr;
sweilz 3:df82ebf4be54 109 uint8_t cmd[3];
sweilz 3:df82ebf4be54 110 int len;
sweilz 3:df82ebf4be54 111 int ack;
sweilz 3:df82ebf4be54 112
sweilz 3:df82ebf4be54 113 // Check error
sweilz 3:df82ebf4be54 114 if(_errnum)
sweilz 3:df82ebf4be54 115 return;
sweilz 3:df82ebf4be54 116
sweilz 3:df82ebf4be54 117 // Check address
sweilz 3:df82ebf4be54 118 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 119 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 120 return;
sweilz 3:df82ebf4be54 121 }
sweilz 3:df82ebf4be54 122
sweilz 3:df82ebf4be54 123 // Compute page number
sweilz 3:df82ebf4be54 124 page = 0;
sweilz 3:df82ebf4be54 125 if(_type < T24C32)
sweilz 3:df82ebf4be54 126 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 127
sweilz 3:df82ebf4be54 128 // Device address
sweilz 3:df82ebf4be54 129 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 130
sweilz 3:df82ebf4be54 131 if(_type < T24C32) {
sweilz 3:df82ebf4be54 132 len = 2;
sweilz 3:df82ebf4be54 133
sweilz 3:df82ebf4be54 134 // Word address
sweilz 3:df82ebf4be54 135 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 136
sweilz 3:df82ebf4be54 137 // Data
sweilz 3:df82ebf4be54 138 cmd[1] = (uint8_t) data;
sweilz 3:df82ebf4be54 139 } else {
sweilz 3:df82ebf4be54 140 len = 3;
sweilz 3:df82ebf4be54 141
sweilz 3:df82ebf4be54 142 // First word address (MSB)
sweilz 3:df82ebf4be54 143 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 144
sweilz 3:df82ebf4be54 145 // Second word address (LSB)
sweilz 3:df82ebf4be54 146 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 147
sweilz 3:df82ebf4be54 148 // Data
sweilz 3:df82ebf4be54 149 cmd[2] = (uint8_t) data;
sweilz 3:df82ebf4be54 150 }
sweilz 3:df82ebf4be54 151
sweilz 3:df82ebf4be54 152 // printf("len %d address %02x cmd[0] %02x cmd[1] %02x cmd[2] %02x\n",len,addr,cmd[0],cmd[1],cmd[2]);
sweilz 3:df82ebf4be54 153
sweilz 3:df82ebf4be54 154 ack = _i2c.write((int)addr,(char *)cmd,len);
sweilz 3:df82ebf4be54 155 if(ack != 0) {
sweilz 3:df82ebf4be54 156 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 157 return;
sweilz 3:df82ebf4be54 158 }
sweilz 3:df82ebf4be54 159
sweilz 3:df82ebf4be54 160 // Wait end of write
sweilz 3:df82ebf4be54 161 ready();
bborredon 0:80245aff63ce 162
bborredon 0:80245aff63ce 163 }
bborredon 0:80245aff63ce 164
bborredon 0:80245aff63ce 165 void EEPROM::write(uint16_t address, int8_t data[], uint16_t length)
bborredon 0:80245aff63ce 166 {
sweilz 3:df82ebf4be54 167 uint8_t page;
sweilz 3:df82ebf4be54 168 uint8_t addr;
sweilz 3:df82ebf4be54 169 uint8_t blocs,remain;
sweilz 3:df82ebf4be54 170 uint8_t fpart,lpart;
sweilz 3:df82ebf4be54 171 uint8_t i,j,ind;
sweilz 3:df82ebf4be54 172 uint8_t cmd[129];
sweilz 3:df82ebf4be54 173 int ack;
sweilz 3:df82ebf4be54 174
sweilz 3:df82ebf4be54 175 // Check error
sweilz 3:df82ebf4be54 176 if(_errnum)
sweilz 3:df82ebf4be54 177 return;
sweilz 3:df82ebf4be54 178
sweilz 3:df82ebf4be54 179 // Check address
sweilz 3:df82ebf4be54 180 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 181 _errnum = EEPROM_OutOfRange;
bborredon 0:80245aff63ce 182 return;
sweilz 3:df82ebf4be54 183 }
sweilz 3:df82ebf4be54 184
sweilz 3:df82ebf4be54 185 // Check length
sweilz 3:df82ebf4be54 186 if(!checkAddress(address + length - 1)) {
sweilz 3:df82ebf4be54 187 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 188 return;
bborredon 0:80245aff63ce 189 }
sweilz 3:df82ebf4be54 190
sweilz 3:df82ebf4be54 191 // Compute blocs numbers
sweilz 3:df82ebf4be54 192 blocs = length / _page_write;
sweilz 3:df82ebf4be54 193
sweilz 3:df82ebf4be54 194 // Compute remaining bytes
sweilz 3:df82ebf4be54 195 remain = length - blocs * _page_write;
sweilz 3:df82ebf4be54 196
sweilz 3:df82ebf4be54 197 for(i = 0; i < blocs; i++) {
sweilz 3:df82ebf4be54 198 // Compute page number
sweilz 3:df82ebf4be54 199 page = 0;
sweilz 3:df82ebf4be54 200 if(_type < T24C32)
sweilz 3:df82ebf4be54 201 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 202
bborredon 0:80245aff63ce 203 // Device address
bborredon 0:80245aff63ce 204 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 205
sweilz 3:df82ebf4be54 206 if(_type < T24C32) {
sweilz 3:df82ebf4be54 207 // Word address
sweilz 3:df82ebf4be54 208 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 209
sweilz 3:df82ebf4be54 210 if((uint8_t) ((address + _page_write) / 256) == page) { // Data fit in the same page
sweilz 3:df82ebf4be54 211 // Add data
sweilz 3:df82ebf4be54 212 for(j = 0; j < _page_write; j++)
sweilz 3:df82ebf4be54 213 cmd[j + 1] = (uint8_t) data[i * _page_write + j];
sweilz 3:df82ebf4be54 214
sweilz 3:df82ebf4be54 215 // Write data
sweilz 3:df82ebf4be54 216 ack = _i2c.write((int)addr,(char *)cmd,_page_write + 1);
sweilz 3:df82ebf4be54 217 if(ack != 0) {
sweilz 3:df82ebf4be54 218 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 219 return;
sweilz 3:df82ebf4be54 220 }
sweilz 3:df82ebf4be54 221
sweilz 3:df82ebf4be54 222 // Wait end of write
sweilz 3:df82ebf4be54 223 ready();
sweilz 3:df82ebf4be54 224
sweilz 3:df82ebf4be54 225 // Increment address
sweilz 3:df82ebf4be54 226 address += _page_write;
sweilz 3:df82ebf4be54 227 } else { // Data on 2 pages. We must split the write
sweilz 3:df82ebf4be54 228 // Number of bytes in current page
sweilz 3:df82ebf4be54 229 fpart = (page + 1) * 256 - address;
sweilz 3:df82ebf4be54 230
sweilz 3:df82ebf4be54 231 // Add data for current page
sweilz 3:df82ebf4be54 232 for(j = 0; j < fpart; j++)
sweilz 3:df82ebf4be54 233 cmd[j + 1] = (uint8_t) data[i * _page_write + j];
sweilz 3:df82ebf4be54 234
sweilz 3:df82ebf4be54 235 // Write data for current page
sweilz 3:df82ebf4be54 236 ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
sweilz 3:df82ebf4be54 237 if(ack != 0) {
sweilz 3:df82ebf4be54 238 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 239 return;
sweilz 3:df82ebf4be54 240 }
sweilz 3:df82ebf4be54 241
sweilz 3:df82ebf4be54 242 // Wait end of write
sweilz 3:df82ebf4be54 243 ready();
sweilz 3:df82ebf4be54 244
sweilz 3:df82ebf4be54 245 // Increment address
sweilz 3:df82ebf4be54 246 address += fpart;
sweilz 3:df82ebf4be54 247
sweilz 3:df82ebf4be54 248 if(page < _page_number - 1) {
sweilz 3:df82ebf4be54 249 // Increment page
sweilz 3:df82ebf4be54 250 page++;
sweilz 3:df82ebf4be54 251
sweilz 3:df82ebf4be54 252 // Device address
sweilz 3:df82ebf4be54 253 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 254
sweilz 3:df82ebf4be54 255 // Word address
sweilz 3:df82ebf4be54 256 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 257
sweilz 3:df82ebf4be54 258 // Data index
sweilz 3:df82ebf4be54 259 ind = i * _page_write + fpart;
sweilz 3:df82ebf4be54 260
sweilz 3:df82ebf4be54 261 // Number of bytes in next page
sweilz 3:df82ebf4be54 262 lpart = _page_write - fpart;
sweilz 3:df82ebf4be54 263
sweilz 3:df82ebf4be54 264 // Add data for next page
sweilz 3:df82ebf4be54 265 for(j = 0; j < lpart; j++)
sweilz 3:df82ebf4be54 266 cmd[j + 1] = (uint8_t) data[ind + j];
sweilz 3:df82ebf4be54 267
sweilz 3:df82ebf4be54 268 // Write data for next page
sweilz 3:df82ebf4be54 269 ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
sweilz 3:df82ebf4be54 270 if(ack != 0) {
sweilz 3:df82ebf4be54 271 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 272 return;
sweilz 3:df82ebf4be54 273 }
sweilz 3:df82ebf4be54 274
sweilz 3:df82ebf4be54 275 // Wait end of write
sweilz 3:df82ebf4be54 276 ready();
sweilz 3:df82ebf4be54 277
sweilz 3:df82ebf4be54 278 // Increment address
sweilz 3:df82ebf4be54 279 address += lpart;
sweilz 3:df82ebf4be54 280 }
sweilz 3:df82ebf4be54 281 }
sweilz 3:df82ebf4be54 282 } else {
sweilz 3:df82ebf4be54 283 // First word address (MSB)
sweilz 3:df82ebf4be54 284 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 285
sweilz 3:df82ebf4be54 286 // Second word address (LSB)
sweilz 3:df82ebf4be54 287 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 288
sweilz 3:df82ebf4be54 289 // Add data
sweilz 3:df82ebf4be54 290 for(j = 0; j < _page_write; j++)
sweilz 3:df82ebf4be54 291 cmd[j + 2] = (uint8_t) data[i * _page_write + j];
sweilz 3:df82ebf4be54 292
sweilz 3:df82ebf4be54 293 // Write data
sweilz 3:df82ebf4be54 294 ack = _i2c.write((int)addr,(char *)cmd,_page_write + 2);
sweilz 3:df82ebf4be54 295 if(ack != 0) {
sweilz 3:df82ebf4be54 296 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 297 return;
sweilz 3:df82ebf4be54 298 }
sweilz 3:df82ebf4be54 299
sweilz 3:df82ebf4be54 300 // Wait end of write
sweilz 3:df82ebf4be54 301 ready();
sweilz 3:df82ebf4be54 302
sweilz 3:df82ebf4be54 303 // Increment address
sweilz 3:df82ebf4be54 304 address += _page_write;
sweilz 3:df82ebf4be54 305 }
sweilz 3:df82ebf4be54 306 }
sweilz 3:df82ebf4be54 307
sweilz 3:df82ebf4be54 308 // Compute page number
sweilz 3:df82ebf4be54 309 page = 0;
sweilz 3:df82ebf4be54 310 if(_type < T24C32)
sweilz 3:df82ebf4be54 311 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 312
sweilz 3:df82ebf4be54 313 // Device address
sweilz 3:df82ebf4be54 314 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 315
sweilz 3:df82ebf4be54 316 if(_type < T24C32) {
bborredon 0:80245aff63ce 317 // Word address
bborredon 0:80245aff63ce 318 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 319
sweilz 3:df82ebf4be54 320 if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
sweilz 3:df82ebf4be54 321 // Add data for the current page
sweilz 3:df82ebf4be54 322 for(j = 0; j < remain; j++)
sweilz 3:df82ebf4be54 323 cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 324
sweilz 3:df82ebf4be54 325 // Write data for the current page
sweilz 3:df82ebf4be54 326 ack = _i2c.write((int)addr,(char *)cmd,remain + 1);
sweilz 3:df82ebf4be54 327 if(ack != 0) {
sweilz 3:df82ebf4be54 328 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 329 return;
sweilz 3:df82ebf4be54 330 }
sweilz 3:df82ebf4be54 331
sweilz 3:df82ebf4be54 332 // Wait end of write
sweilz 3:df82ebf4be54 333 ready();
sweilz 3:df82ebf4be54 334 } else { // Data on 2 pages. We must split the write
sweilz 3:df82ebf4be54 335 // Number of bytes in current page
sweilz 3:df82ebf4be54 336 fpart = (page + 1) * 256 - address;
sweilz 3:df82ebf4be54 337
sweilz 3:df82ebf4be54 338 // Add data for current page
sweilz 3:df82ebf4be54 339 for(j = 0; j < fpart; j++)
sweilz 3:df82ebf4be54 340 cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 341
sweilz 3:df82ebf4be54 342 // Write data for current page
sweilz 3:df82ebf4be54 343 ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
sweilz 3:df82ebf4be54 344 if(ack != 0) {
sweilz 3:df82ebf4be54 345 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 346 return;
sweilz 3:df82ebf4be54 347 }
sweilz 3:df82ebf4be54 348
sweilz 3:df82ebf4be54 349 // Wait end of write
sweilz 3:df82ebf4be54 350 ready();
sweilz 3:df82ebf4be54 351
sweilz 3:df82ebf4be54 352 // Increment address
sweilz 3:df82ebf4be54 353 address += fpart;
sweilz 3:df82ebf4be54 354
sweilz 3:df82ebf4be54 355 if(page < _page_number - 1) {
sweilz 3:df82ebf4be54 356 // Increment page
sweilz 3:df82ebf4be54 357 page++;
sweilz 3:df82ebf4be54 358
sweilz 3:df82ebf4be54 359 // Device address
sweilz 3:df82ebf4be54 360 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 361
sweilz 3:df82ebf4be54 362 // Word address
sweilz 3:df82ebf4be54 363 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 364
sweilz 3:df82ebf4be54 365 // Data index
sweilz 3:df82ebf4be54 366 ind = blocs * _page_write + fpart;
sweilz 3:df82ebf4be54 367
sweilz 3:df82ebf4be54 368 // Number of bytes in next page
sweilz 3:df82ebf4be54 369 lpart = remain - fpart;
sweilz 3:df82ebf4be54 370
sweilz 3:df82ebf4be54 371 // Add data for next page
sweilz 3:df82ebf4be54 372 for(j = 0; j < lpart; j++)
sweilz 3:df82ebf4be54 373 cmd[j + 1] = (uint8_t) data[ind + j];
sweilz 3:df82ebf4be54 374
sweilz 3:df82ebf4be54 375 // Write data for next page
sweilz 3:df82ebf4be54 376 ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
sweilz 3:df82ebf4be54 377 if(ack != 0) {
sweilz 3:df82ebf4be54 378 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 379 return;
sweilz 3:df82ebf4be54 380 }
sweilz 3:df82ebf4be54 381
sweilz 3:df82ebf4be54 382 // Wait end of write
sweilz 3:df82ebf4be54 383 ready();
sweilz 3:df82ebf4be54 384 }
sweilz 3:df82ebf4be54 385 }
sweilz 3:df82ebf4be54 386 } else {
sweilz 3:df82ebf4be54 387 // Fist word address (MSB)
sweilz 3:df82ebf4be54 388 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 389
sweilz 3:df82ebf4be54 390 // Second word address (LSB)
sweilz 3:df82ebf4be54 391 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 392
sweilz 3:df82ebf4be54 393 // Add data for the current page
sweilz 3:df82ebf4be54 394 for(j = 0; j < remain; j++)
sweilz 3:df82ebf4be54 395 cmd[j + 2] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 396
sweilz 3:df82ebf4be54 397 // Write data for the current page
sweilz 3:df82ebf4be54 398 ack = _i2c.write((int)addr,(char *)cmd,remain + 2);
bborredon 0:80245aff63ce 399 if(ack != 0) {
sweilz 3:df82ebf4be54 400 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 401 return;
bborredon 0:80245aff63ce 402 }
sweilz 3:df82ebf4be54 403
bborredon 0:80245aff63ce 404 // Wait end of write
bborredon 0:80245aff63ce 405 ready();
bborredon 0:80245aff63ce 406 }
bborredon 0:80245aff63ce 407
bborredon 0:80245aff63ce 408 }
bborredon 0:80245aff63ce 409
bborredon 0:80245aff63ce 410 void EEPROM::write(uint16_t address, int16_t data)
bborredon 0:80245aff63ce 411 {
sweilz 3:df82ebf4be54 412 int8_t cmd[2];
sweilz 3:df82ebf4be54 413
sweilz 3:df82ebf4be54 414 // Check error
sweilz 3:df82ebf4be54 415 if(_errnum)
sweilz 3:df82ebf4be54 416 return;
sweilz 3:df82ebf4be54 417
sweilz 3:df82ebf4be54 418 // Check address
sweilz 3:df82ebf4be54 419 if(!checkAddress(address + 1)) {
sweilz 3:df82ebf4be54 420 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 421 return;
sweilz 3:df82ebf4be54 422 }
sweilz 3:df82ebf4be54 423
sweilz 3:df82ebf4be54 424 memcpy(cmd,&data,2);
sweilz 3:df82ebf4be54 425
sweilz 3:df82ebf4be54 426 write(address,cmd,2);
sweilz 3:df82ebf4be54 427
bborredon 0:80245aff63ce 428 }
bborredon 0:80245aff63ce 429
bborredon 0:80245aff63ce 430 void EEPROM::write(uint16_t address, int32_t data)
bborredon 0:80245aff63ce 431 {
sweilz 3:df82ebf4be54 432 int8_t cmd[4];
sweilz 3:df82ebf4be54 433
sweilz 3:df82ebf4be54 434 // Check error
sweilz 3:df82ebf4be54 435 if(_errnum)
sweilz 3:df82ebf4be54 436 return;
sweilz 3:df82ebf4be54 437
sweilz 3:df82ebf4be54 438 // Check address
sweilz 3:df82ebf4be54 439 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 440 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 441 return;
sweilz 3:df82ebf4be54 442 }
sweilz 3:df82ebf4be54 443
sweilz 3:df82ebf4be54 444 memcpy(cmd,&data,4);
sweilz 3:df82ebf4be54 445
sweilz 3:df82ebf4be54 446 write(address,cmd,4);
soulx 2:c648c5e93d5e 447
bborredon 0:80245aff63ce 448 }
bborredon 0:80245aff63ce 449
bborredon 0:80245aff63ce 450 void EEPROM::write(uint16_t address, float data)
bborredon 0:80245aff63ce 451 {
sweilz 3:df82ebf4be54 452 int8_t cmd[4];
sweilz 3:df82ebf4be54 453
sweilz 3:df82ebf4be54 454 // Check error
sweilz 3:df82ebf4be54 455 if(_errnum)
sweilz 3:df82ebf4be54 456 return;
sweilz 3:df82ebf4be54 457
sweilz 3:df82ebf4be54 458 // Check address
sweilz 3:df82ebf4be54 459 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 460 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 461 return;
sweilz 3:df82ebf4be54 462 }
sweilz 3:df82ebf4be54 463
sweilz 3:df82ebf4be54 464 memcpy(cmd,&data,4);
sweilz 3:df82ebf4be54 465
sweilz 3:df82ebf4be54 466 write(address,cmd,4);
sweilz 3:df82ebf4be54 467
bborredon 0:80245aff63ce 468 }
bborredon 0:80245aff63ce 469
bborredon 0:80245aff63ce 470 void EEPROM::write(uint16_t address, void *data, uint16_t size)
bborredon 0:80245aff63ce 471 {
sweilz 3:df82ebf4be54 472 int8_t *cmd = NULL;
sweilz 3:df82ebf4be54 473
sweilz 3:df82ebf4be54 474 // Check error
sweilz 3:df82ebf4be54 475 if(_errnum)
sweilz 3:df82ebf4be54 476 return;
sweilz 3:df82ebf4be54 477
sweilz 3:df82ebf4be54 478 // Check address
sweilz 3:df82ebf4be54 479 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 480 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 481 return;
sweilz 3:df82ebf4be54 482 }
sweilz 3:df82ebf4be54 483
sweilz 3:df82ebf4be54 484 cmd = (int8_t *)malloc(size);
sweilz 3:df82ebf4be54 485 if(cmd == NULL) {
sweilz 3:df82ebf4be54 486 _errnum = EEPROM_MallocError;
sweilz 3:df82ebf4be54 487 return;
sweilz 3:df82ebf4be54 488 }
sweilz 3:df82ebf4be54 489
sweilz 3:df82ebf4be54 490 memcpy(cmd,data,size);
sweilz 3:df82ebf4be54 491
sweilz 3:df82ebf4be54 492 write(address,cmd,size);
sweilz 3:df82ebf4be54 493
sweilz 3:df82ebf4be54 494 free(cmd);
sweilz 3:df82ebf4be54 495
bborredon 0:80245aff63ce 496 }
bborredon 0:80245aff63ce 497
bborredon 0:80245aff63ce 498 void EEPROM::read(uint16_t address, int8_t& data)
bborredon 0:80245aff63ce 499 {
sweilz 3:df82ebf4be54 500 uint8_t page;
sweilz 3:df82ebf4be54 501 uint8_t addr;
sweilz 3:df82ebf4be54 502 uint8_t cmd[2];
sweilz 3:df82ebf4be54 503 uint8_t len;
sweilz 3:df82ebf4be54 504 int ack;
sweilz 3:df82ebf4be54 505
sweilz 3:df82ebf4be54 506 // Check error
sweilz 3:df82ebf4be54 507 if(_errnum)
sweilz 3:df82ebf4be54 508 return;
sweilz 3:df82ebf4be54 509
sweilz 3:df82ebf4be54 510 // Check address
sweilz 3:df82ebf4be54 511 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 512 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 513 return;
sweilz 3:df82ebf4be54 514 }
sweilz 3:df82ebf4be54 515
sweilz 3:df82ebf4be54 516 // Compute page number
sweilz 3:df82ebf4be54 517 page = 0;
sweilz 3:df82ebf4be54 518 if(_type < T24C32)
sweilz 3:df82ebf4be54 519 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 520
sweilz 3:df82ebf4be54 521 // Device address
sweilz 3:df82ebf4be54 522 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 523
sweilz 3:df82ebf4be54 524 if(_type < T24C32) {
sweilz 3:df82ebf4be54 525 len = 1;
sweilz 3:df82ebf4be54 526
sweilz 3:df82ebf4be54 527 // Word address
sweilz 3:df82ebf4be54 528 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 529 } else {
sweilz 3:df82ebf4be54 530 len = 2;
sweilz 3:df82ebf4be54 531
sweilz 3:df82ebf4be54 532 // First word address (MSB)
sweilz 3:df82ebf4be54 533 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 534
sweilz 3:df82ebf4be54 535 // Second word address (LSB)
sweilz 3:df82ebf4be54 536 cmd[1] = (uint8_t)address;
sweilz 3:df82ebf4be54 537 }
sweilz 3:df82ebf4be54 538
sweilz 3:df82ebf4be54 539 // Write command
sweilz 3:df82ebf4be54 540 ack = _i2c.write((int)addr,(char *)cmd,len,true);
sweilz 3:df82ebf4be54 541 if(ack != 0) {
sweilz 3:df82ebf4be54 542 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 543 return;
sweilz 3:df82ebf4be54 544 }
sweilz 3:df82ebf4be54 545
sweilz 3:df82ebf4be54 546 // Read data
sweilz 3:df82ebf4be54 547 ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
sweilz 3:df82ebf4be54 548 if(ack != 0) {
sweilz 3:df82ebf4be54 549 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 550 return;
sweilz 3:df82ebf4be54 551 }
sweilz 3:df82ebf4be54 552
bborredon 0:80245aff63ce 553 }
bborredon 0:80245aff63ce 554
bborredon 0:80245aff63ce 555 void EEPROM::read(uint16_t address, int8_t *data, uint16_t size)
bborredon 0:80245aff63ce 556 {
sweilz 3:df82ebf4be54 557 uint8_t page;
sweilz 3:df82ebf4be54 558 uint8_t addr;
sweilz 3:df82ebf4be54 559 uint8_t cmd[2];
sweilz 3:df82ebf4be54 560 uint8_t len;
sweilz 3:df82ebf4be54 561 int ack;
sweilz 3:df82ebf4be54 562
sweilz 3:df82ebf4be54 563 // Check error
sweilz 3:df82ebf4be54 564 if(_errnum)
sweilz 3:df82ebf4be54 565 return;
sweilz 3:df82ebf4be54 566
sweilz 3:df82ebf4be54 567 // Check address
sweilz 3:df82ebf4be54 568 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 569 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 570 return;
sweilz 3:df82ebf4be54 571 }
sweilz 3:df82ebf4be54 572
sweilz 3:df82ebf4be54 573 // Check size
sweilz 3:df82ebf4be54 574 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 575 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 576 return;
sweilz 3:df82ebf4be54 577 }
sweilz 3:df82ebf4be54 578
sweilz 3:df82ebf4be54 579 // Compute page number
sweilz 3:df82ebf4be54 580 page = 0;
sweilz 3:df82ebf4be54 581 if(_type < T24C32)
sweilz 3:df82ebf4be54 582 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 583
sweilz 3:df82ebf4be54 584 // Device address
sweilz 3:df82ebf4be54 585 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 586
sweilz 3:df82ebf4be54 587 if(_type < T24C32) {
sweilz 3:df82ebf4be54 588 len = 1;
sweilz 3:df82ebf4be54 589
sweilz 3:df82ebf4be54 590 // Word address
sweilz 3:df82ebf4be54 591 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 592 } else {
sweilz 3:df82ebf4be54 593 len = 2;
sweilz 3:df82ebf4be54 594
sweilz 3:df82ebf4be54 595 // First word address (MSB)
sweilz 3:df82ebf4be54 596 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 597
sweilz 3:df82ebf4be54 598 // Second word address (LSB)
sweilz 3:df82ebf4be54 599 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 600 }
sweilz 3:df82ebf4be54 601
sweilz 3:df82ebf4be54 602 // Write command
sweilz 3:df82ebf4be54 603 ack = _i2c.write((int)addr,(char *)cmd,len,true);
sweilz 3:df82ebf4be54 604 if(ack != 0) {
sweilz 3:df82ebf4be54 605 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 606 return;
sweilz 3:df82ebf4be54 607 }
sweilz 3:df82ebf4be54 608
sweilz 3:df82ebf4be54 609 // Sequential read
sweilz 3:df82ebf4be54 610 ack = _i2c.read((int)addr,(char *)data,size);
sweilz 3:df82ebf4be54 611 if(ack != 0) {
sweilz 3:df82ebf4be54 612 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 613 return;
sweilz 3:df82ebf4be54 614 }
sweilz 3:df82ebf4be54 615
bborredon 0:80245aff63ce 616 }
bborredon 0:80245aff63ce 617
bborredon 0:80245aff63ce 618 void EEPROM::read(int8_t& data)
bborredon 0:80245aff63ce 619 {
sweilz 3:df82ebf4be54 620 uint8_t addr;
sweilz 3:df82ebf4be54 621 int ack;
sweilz 3:df82ebf4be54 622
sweilz 3:df82ebf4be54 623 // Check error
sweilz 3:df82ebf4be54 624 if(_errnum)
sweilz 3:df82ebf4be54 625 return;
bborredon 0:80245aff63ce 626
sweilz 3:df82ebf4be54 627 // Device address
sweilz 3:df82ebf4be54 628 addr = EEPROM_Address | _address;
sweilz 3:df82ebf4be54 629
sweilz 3:df82ebf4be54 630 // Read data
sweilz 3:df82ebf4be54 631 ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
sweilz 3:df82ebf4be54 632 if(ack != 0) {
sweilz 3:df82ebf4be54 633 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 634 return;
sweilz 3:df82ebf4be54 635 }
sweilz 3:df82ebf4be54 636
bborredon 0:80245aff63ce 637 }
bborredon 0:80245aff63ce 638
bborredon 0:80245aff63ce 639 void EEPROM::read(uint16_t address, int16_t& data)
bborredon 0:80245aff63ce 640 {
sweilz 3:df82ebf4be54 641 int8_t cmd[2];
sweilz 3:df82ebf4be54 642
sweilz 3:df82ebf4be54 643 // Check error
sweilz 3:df82ebf4be54 644 if(_errnum)
sweilz 3:df82ebf4be54 645 return;
sweilz 3:df82ebf4be54 646
sweilz 3:df82ebf4be54 647 // Check address
sweilz 3:df82ebf4be54 648 if(!checkAddress(address + 1)) {
sweilz 3:df82ebf4be54 649 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 650 return;
sweilz 3:df82ebf4be54 651 }
sweilz 3:df82ebf4be54 652
sweilz 3:df82ebf4be54 653 read(address,cmd,2);
sweilz 3:df82ebf4be54 654
sweilz 3:df82ebf4be54 655 memcpy(&data,cmd,2);
sweilz 3:df82ebf4be54 656
bborredon 0:80245aff63ce 657 }
bborredon 0:80245aff63ce 658
bborredon 0:80245aff63ce 659 void EEPROM::read(uint16_t address, int32_t& data)
bborredon 0:80245aff63ce 660 {
sweilz 3:df82ebf4be54 661 int8_t cmd[4];
sweilz 3:df82ebf4be54 662
sweilz 3:df82ebf4be54 663 // Check error
sweilz 3:df82ebf4be54 664 if(_errnum)
sweilz 3:df82ebf4be54 665 return;
sweilz 3:df82ebf4be54 666
sweilz 3:df82ebf4be54 667 // Check address
sweilz 3:df82ebf4be54 668 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 669 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 670 return;
sweilz 3:df82ebf4be54 671 }
sweilz 3:df82ebf4be54 672
sweilz 3:df82ebf4be54 673 read(address,cmd,4);
sweilz 3:df82ebf4be54 674
sweilz 3:df82ebf4be54 675 memcpy(&data,cmd,4);
sweilz 3:df82ebf4be54 676
bborredon 0:80245aff63ce 677 }
bborredon 0:80245aff63ce 678
bborredon 0:80245aff63ce 679 void EEPROM::read(uint16_t address, float& data)
bborredon 0:80245aff63ce 680 {
sweilz 3:df82ebf4be54 681 int8_t cmd[4];
sweilz 3:df82ebf4be54 682
sweilz 3:df82ebf4be54 683 // Check error
sweilz 3:df82ebf4be54 684 if(_errnum)
sweilz 3:df82ebf4be54 685 return;
sweilz 3:df82ebf4be54 686
sweilz 3:df82ebf4be54 687 // Check address
sweilz 3:df82ebf4be54 688 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 689 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 690 return;
sweilz 3:df82ebf4be54 691 }
sweilz 3:df82ebf4be54 692
sweilz 3:df82ebf4be54 693 read(address,cmd,4);
sweilz 3:df82ebf4be54 694
sweilz 3:df82ebf4be54 695 memcpy(&data,cmd,4);
sweilz 3:df82ebf4be54 696
bborredon 0:80245aff63ce 697 }
bborredon 0:80245aff63ce 698
bborredon 0:80245aff63ce 699 void EEPROM::read(uint16_t address, void *data, uint16_t size)
bborredon 0:80245aff63ce 700 {
sweilz 3:df82ebf4be54 701 int8_t *cmd = NULL;
sweilz 3:df82ebf4be54 702
sweilz 3:df82ebf4be54 703 // Check error
sweilz 3:df82ebf4be54 704 if(_errnum)
sweilz 3:df82ebf4be54 705 return;
sweilz 3:df82ebf4be54 706
sweilz 3:df82ebf4be54 707 // Check address
sweilz 3:df82ebf4be54 708 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 709 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 710 return;
sweilz 3:df82ebf4be54 711 }
sweilz 3:df82ebf4be54 712
sweilz 3:df82ebf4be54 713 cmd = (int8_t *)malloc(size);
sweilz 3:df82ebf4be54 714 if(cmd == NULL) {
sweilz 3:df82ebf4be54 715 _errnum = EEPROM_MallocError;
sweilz 3:df82ebf4be54 716 return;
sweilz 3:df82ebf4be54 717 }
sweilz 3:df82ebf4be54 718
sweilz 3:df82ebf4be54 719 read(address,cmd,size);
sweilz 3:df82ebf4be54 720
sweilz 3:df82ebf4be54 721 memcpy(data,cmd,size);
sweilz 3:df82ebf4be54 722
sweilz 3:df82ebf4be54 723 free(cmd);
sweilz 3:df82ebf4be54 724
bborredon 0:80245aff63ce 725 }
bborredon 0:80245aff63ce 726
bborredon 0:80245aff63ce 727 void EEPROM::ready(void)
bborredon 0:80245aff63ce 728 {
sweilz 3:df82ebf4be54 729 int ack;
sweilz 3:df82ebf4be54 730 uint8_t addr;
sweilz 3:df82ebf4be54 731 uint8_t cmd;
sweilz 3:df82ebf4be54 732
sweilz 3:df82ebf4be54 733 // Check error
sweilz 3:df82ebf4be54 734 if(_errnum)
sweilz 3:df82ebf4be54 735 return;
sweilz 3:df82ebf4be54 736
sweilz 3:df82ebf4be54 737 // Device address
sweilz 3:df82ebf4be54 738 addr = EEPROM_Address | _address;
sweilz 3:df82ebf4be54 739
sweilz 3:df82ebf4be54 740 cmd = 0;
sweilz 3:df82ebf4be54 741 /*
sweilz 3:df82ebf4be54 742 // Wait end of write
sweilz 3:df82ebf4be54 743 do {
sweilz 3:df82ebf4be54 744 ack = _i2c.write((int)addr,(char *)cmd,0);
sweilz 3:df82ebf4be54 745 } while(ack != 0);
sweilz 3:df82ebf4be54 746 */
soulx 2:c648c5e93d5e 747 wait_ms(5);
bborredon 0:80245aff63ce 748 }
bborredon 0:80245aff63ce 749
bborredon 0:80245aff63ce 750 uint32_t EEPROM::getSize(void)
bborredon 0:80245aff63ce 751 {
sweilz 3:df82ebf4be54 752 return(_size);
bborredon 0:80245aff63ce 753 }
bborredon 0:80245aff63ce 754
bborredon 0:80245aff63ce 755 uint8_t EEPROM::getError(void)
bborredon 0:80245aff63ce 756 {
sweilz 3:df82ebf4be54 757 return(_errnum);
bborredon 0:80245aff63ce 758 }
bborredon 0:80245aff63ce 759
bborredon 0:80245aff63ce 760 bool EEPROM::checkAddress(uint16_t address)
bborredon 0:80245aff63ce 761 {
sweilz 3:df82ebf4be54 762 bool ret = true;
sweilz 3:df82ebf4be54 763
sweilz 3:df82ebf4be54 764 switch(_type) {
sweilz 3:df82ebf4be54 765 case T24C01 :
sweilz 3:df82ebf4be54 766 if(address >= T24C01)
sweilz 3:df82ebf4be54 767 ret = false;
sweilz 3:df82ebf4be54 768 break;
sweilz 3:df82ebf4be54 769 case T24C02 :
sweilz 3:df82ebf4be54 770 if(address >= T24C02)
sweilz 3:df82ebf4be54 771 ret = false;
sweilz 3:df82ebf4be54 772 break;
sweilz 3:df82ebf4be54 773 case T24C04 :
sweilz 3:df82ebf4be54 774 if(address >= T24C04)
sweilz 3:df82ebf4be54 775 ret = false;
sweilz 3:df82ebf4be54 776 break;
sweilz 3:df82ebf4be54 777 case T24C08 :
sweilz 3:df82ebf4be54 778 if(address >= T24C08)
sweilz 3:df82ebf4be54 779 ret = false;
sweilz 3:df82ebf4be54 780 break;
sweilz 3:df82ebf4be54 781 case T24C16 :
sweilz 3:df82ebf4be54 782 if(address >= T24C16)
sweilz 3:df82ebf4be54 783 ret = false;
sweilz 3:df82ebf4be54 784 break;
sweilz 3:df82ebf4be54 785 case T24C32 :
sweilz 3:df82ebf4be54 786 if(address >= T24C32)
sweilz 3:df82ebf4be54 787 ret = false;
sweilz 3:df82ebf4be54 788 break;
sweilz 3:df82ebf4be54 789 case T24C64 :
sweilz 3:df82ebf4be54 790 if(address >= T24C64)
sweilz 3:df82ebf4be54 791 ret = false;
sweilz 3:df82ebf4be54 792 break;
sweilz 3:df82ebf4be54 793 case T24C128 :
sweilz 3:df82ebf4be54 794 if(address >= T24C128)
sweilz 3:df82ebf4be54 795 ret = false;
sweilz 3:df82ebf4be54 796 break;
sweilz 3:df82ebf4be54 797 case T24C256 :
sweilz 3:df82ebf4be54 798 if(address >= T24C256)
sweilz 3:df82ebf4be54 799 ret = false;
sweilz 3:df82ebf4be54 800 break;
sweilz 3:df82ebf4be54 801 case T24C512 :
sweilz 3:df82ebf4be54 802 if(address >= T24C512)
sweilz 3:df82ebf4be54 803 ret = false;
sweilz 3:df82ebf4be54 804 break;
sweilz 3:df82ebf4be54 805 case T24C1024 :
sweilz 3:df82ebf4be54 806 if(address >= T24C1024)
sweilz 3:df82ebf4be54 807 ret = false;
sweilz 3:df82ebf4be54 808 break;
sweilz 3:df82ebf4be54 809 case T24C1025 :
sweilz 3:df82ebf4be54 810 if(address >= T24C1025 - 1)
sweilz 3:df82ebf4be54 811 ret = false;
sweilz 3:df82ebf4be54 812 break;
sweilz 3:df82ebf4be54 813 }
sweilz 3:df82ebf4be54 814
sweilz 3:df82ebf4be54 815 return(ret);
sweilz 3:df82ebf4be54 816 }