I2C EEProm library

Fork of eeprom by FRA221_2015

Committer:
JojoS
Date:
Mon Dec 21 17:31:49 2015 +0000
Revision:
4:0f09fbac7613
Parent:
3:df82ebf4be54
write(address, data, length) fiailed when writing full flash size. There was address command too much, fixed by checking remaining bytes == 0.

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
JojoS 4:0f09fbac7613 308 if (remain == 0)
JojoS 4:0f09fbac7613 309 return;
JojoS 4:0f09fbac7613 310
sweilz 3:df82ebf4be54 311 // Compute page number
sweilz 3:df82ebf4be54 312 page = 0;
sweilz 3:df82ebf4be54 313 if(_type < T24C32)
sweilz 3:df82ebf4be54 314 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 315
sweilz 3:df82ebf4be54 316 // Device address
sweilz 3:df82ebf4be54 317 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 318
sweilz 3:df82ebf4be54 319 if(_type < T24C32) {
bborredon 0:80245aff63ce 320 // Word address
bborredon 0:80245aff63ce 321 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 322
sweilz 3:df82ebf4be54 323 if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
sweilz 3:df82ebf4be54 324 // Add data for the current page
sweilz 3:df82ebf4be54 325 for(j = 0; j < remain; j++)
sweilz 3:df82ebf4be54 326 cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 327
sweilz 3:df82ebf4be54 328 // Write data for the current page
sweilz 3:df82ebf4be54 329 ack = _i2c.write((int)addr,(char *)cmd,remain + 1);
sweilz 3:df82ebf4be54 330 if(ack != 0) {
sweilz 3:df82ebf4be54 331 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 332 return;
sweilz 3:df82ebf4be54 333 }
sweilz 3:df82ebf4be54 334
sweilz 3:df82ebf4be54 335 // Wait end of write
sweilz 3:df82ebf4be54 336 ready();
sweilz 3:df82ebf4be54 337 } else { // Data on 2 pages. We must split the write
sweilz 3:df82ebf4be54 338 // Number of bytes in current page
sweilz 3:df82ebf4be54 339 fpart = (page + 1) * 256 - address;
sweilz 3:df82ebf4be54 340
sweilz 3:df82ebf4be54 341 // Add data for current page
sweilz 3:df82ebf4be54 342 for(j = 0; j < fpart; j++)
sweilz 3:df82ebf4be54 343 cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 344
sweilz 3:df82ebf4be54 345 // Write data for current page
sweilz 3:df82ebf4be54 346 ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
sweilz 3:df82ebf4be54 347 if(ack != 0) {
sweilz 3:df82ebf4be54 348 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 349 return;
sweilz 3:df82ebf4be54 350 }
sweilz 3:df82ebf4be54 351
sweilz 3:df82ebf4be54 352 // Wait end of write
sweilz 3:df82ebf4be54 353 ready();
sweilz 3:df82ebf4be54 354
sweilz 3:df82ebf4be54 355 // Increment address
sweilz 3:df82ebf4be54 356 address += fpart;
sweilz 3:df82ebf4be54 357
sweilz 3:df82ebf4be54 358 if(page < _page_number - 1) {
sweilz 3:df82ebf4be54 359 // Increment page
sweilz 3:df82ebf4be54 360 page++;
sweilz 3:df82ebf4be54 361
sweilz 3:df82ebf4be54 362 // Device address
sweilz 3:df82ebf4be54 363 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 364
sweilz 3:df82ebf4be54 365 // Word address
sweilz 3:df82ebf4be54 366 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 367
sweilz 3:df82ebf4be54 368 // Data index
sweilz 3:df82ebf4be54 369 ind = blocs * _page_write + fpart;
sweilz 3:df82ebf4be54 370
sweilz 3:df82ebf4be54 371 // Number of bytes in next page
sweilz 3:df82ebf4be54 372 lpart = remain - fpart;
sweilz 3:df82ebf4be54 373
sweilz 3:df82ebf4be54 374 // Add data for next page
sweilz 3:df82ebf4be54 375 for(j = 0; j < lpart; j++)
sweilz 3:df82ebf4be54 376 cmd[j + 1] = (uint8_t) data[ind + j];
sweilz 3:df82ebf4be54 377
sweilz 3:df82ebf4be54 378 // Write data for next page
sweilz 3:df82ebf4be54 379 ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
sweilz 3:df82ebf4be54 380 if(ack != 0) {
sweilz 3:df82ebf4be54 381 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 382 return;
sweilz 3:df82ebf4be54 383 }
sweilz 3:df82ebf4be54 384
sweilz 3:df82ebf4be54 385 // Wait end of write
sweilz 3:df82ebf4be54 386 ready();
sweilz 3:df82ebf4be54 387 }
sweilz 3:df82ebf4be54 388 }
sweilz 3:df82ebf4be54 389 } else {
sweilz 3:df82ebf4be54 390 // Fist word address (MSB)
sweilz 3:df82ebf4be54 391 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 392
sweilz 3:df82ebf4be54 393 // Second word address (LSB)
sweilz 3:df82ebf4be54 394 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 395
sweilz 3:df82ebf4be54 396 // Add data for the current page
sweilz 3:df82ebf4be54 397 for(j = 0; j < remain; j++)
sweilz 3:df82ebf4be54 398 cmd[j + 2] = (uint8_t) data[blocs * _page_write + j];
sweilz 3:df82ebf4be54 399
sweilz 3:df82ebf4be54 400 // Write data for the current page
sweilz 3:df82ebf4be54 401 ack = _i2c.write((int)addr,(char *)cmd,remain + 2);
bborredon 0:80245aff63ce 402 if(ack != 0) {
sweilz 3:df82ebf4be54 403 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 404 return;
bborredon 0:80245aff63ce 405 }
sweilz 3:df82ebf4be54 406
bborredon 0:80245aff63ce 407 // Wait end of write
bborredon 0:80245aff63ce 408 ready();
bborredon 0:80245aff63ce 409 }
bborredon 0:80245aff63ce 410
bborredon 0:80245aff63ce 411 }
bborredon 0:80245aff63ce 412
bborredon 0:80245aff63ce 413 void EEPROM::write(uint16_t address, int16_t data)
bborredon 0:80245aff63ce 414 {
sweilz 3:df82ebf4be54 415 int8_t cmd[2];
sweilz 3:df82ebf4be54 416
sweilz 3:df82ebf4be54 417 // Check error
sweilz 3:df82ebf4be54 418 if(_errnum)
sweilz 3:df82ebf4be54 419 return;
sweilz 3:df82ebf4be54 420
sweilz 3:df82ebf4be54 421 // Check address
sweilz 3:df82ebf4be54 422 if(!checkAddress(address + 1)) {
sweilz 3:df82ebf4be54 423 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 424 return;
sweilz 3:df82ebf4be54 425 }
sweilz 3:df82ebf4be54 426
sweilz 3:df82ebf4be54 427 memcpy(cmd,&data,2);
sweilz 3:df82ebf4be54 428
sweilz 3:df82ebf4be54 429 write(address,cmd,2);
sweilz 3:df82ebf4be54 430
bborredon 0:80245aff63ce 431 }
bborredon 0:80245aff63ce 432
bborredon 0:80245aff63ce 433 void EEPROM::write(uint16_t address, int32_t data)
bborredon 0:80245aff63ce 434 {
sweilz 3:df82ebf4be54 435 int8_t cmd[4];
sweilz 3:df82ebf4be54 436
sweilz 3:df82ebf4be54 437 // Check error
sweilz 3:df82ebf4be54 438 if(_errnum)
sweilz 3:df82ebf4be54 439 return;
sweilz 3:df82ebf4be54 440
sweilz 3:df82ebf4be54 441 // Check address
sweilz 3:df82ebf4be54 442 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 443 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 444 return;
sweilz 3:df82ebf4be54 445 }
sweilz 3:df82ebf4be54 446
sweilz 3:df82ebf4be54 447 memcpy(cmd,&data,4);
sweilz 3:df82ebf4be54 448
sweilz 3:df82ebf4be54 449 write(address,cmd,4);
soulx 2:c648c5e93d5e 450
bborredon 0:80245aff63ce 451 }
bborredon 0:80245aff63ce 452
bborredon 0:80245aff63ce 453 void EEPROM::write(uint16_t address, float data)
bborredon 0:80245aff63ce 454 {
sweilz 3:df82ebf4be54 455 int8_t cmd[4];
sweilz 3:df82ebf4be54 456
sweilz 3:df82ebf4be54 457 // Check error
sweilz 3:df82ebf4be54 458 if(_errnum)
sweilz 3:df82ebf4be54 459 return;
sweilz 3:df82ebf4be54 460
sweilz 3:df82ebf4be54 461 // Check address
sweilz 3:df82ebf4be54 462 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 463 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 464 return;
sweilz 3:df82ebf4be54 465 }
sweilz 3:df82ebf4be54 466
sweilz 3:df82ebf4be54 467 memcpy(cmd,&data,4);
sweilz 3:df82ebf4be54 468
sweilz 3:df82ebf4be54 469 write(address,cmd,4);
sweilz 3:df82ebf4be54 470
bborredon 0:80245aff63ce 471 }
bborredon 0:80245aff63ce 472
bborredon 0:80245aff63ce 473 void EEPROM::write(uint16_t address, void *data, uint16_t size)
bborredon 0:80245aff63ce 474 {
sweilz 3:df82ebf4be54 475 int8_t *cmd = NULL;
sweilz 3:df82ebf4be54 476
sweilz 3:df82ebf4be54 477 // Check error
sweilz 3:df82ebf4be54 478 if(_errnum)
sweilz 3:df82ebf4be54 479 return;
sweilz 3:df82ebf4be54 480
sweilz 3:df82ebf4be54 481 // Check address
sweilz 3:df82ebf4be54 482 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 483 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 484 return;
sweilz 3:df82ebf4be54 485 }
sweilz 3:df82ebf4be54 486
sweilz 3:df82ebf4be54 487 cmd = (int8_t *)malloc(size);
sweilz 3:df82ebf4be54 488 if(cmd == NULL) {
sweilz 3:df82ebf4be54 489 _errnum = EEPROM_MallocError;
sweilz 3:df82ebf4be54 490 return;
sweilz 3:df82ebf4be54 491 }
sweilz 3:df82ebf4be54 492
sweilz 3:df82ebf4be54 493 memcpy(cmd,data,size);
sweilz 3:df82ebf4be54 494
sweilz 3:df82ebf4be54 495 write(address,cmd,size);
sweilz 3:df82ebf4be54 496
sweilz 3:df82ebf4be54 497 free(cmd);
sweilz 3:df82ebf4be54 498
bborredon 0:80245aff63ce 499 }
bborredon 0:80245aff63ce 500
bborredon 0:80245aff63ce 501 void EEPROM::read(uint16_t address, int8_t& data)
bborredon 0:80245aff63ce 502 {
sweilz 3:df82ebf4be54 503 uint8_t page;
sweilz 3:df82ebf4be54 504 uint8_t addr;
sweilz 3:df82ebf4be54 505 uint8_t cmd[2];
sweilz 3:df82ebf4be54 506 uint8_t len;
sweilz 3:df82ebf4be54 507 int ack;
sweilz 3:df82ebf4be54 508
sweilz 3:df82ebf4be54 509 // Check error
sweilz 3:df82ebf4be54 510 if(_errnum)
sweilz 3:df82ebf4be54 511 return;
sweilz 3:df82ebf4be54 512
sweilz 3:df82ebf4be54 513 // Check address
sweilz 3:df82ebf4be54 514 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 515 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 516 return;
sweilz 3:df82ebf4be54 517 }
sweilz 3:df82ebf4be54 518
sweilz 3:df82ebf4be54 519 // Compute page number
sweilz 3:df82ebf4be54 520 page = 0;
sweilz 3:df82ebf4be54 521 if(_type < T24C32)
sweilz 3:df82ebf4be54 522 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 523
sweilz 3:df82ebf4be54 524 // Device address
sweilz 3:df82ebf4be54 525 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 526
sweilz 3:df82ebf4be54 527 if(_type < T24C32) {
sweilz 3:df82ebf4be54 528 len = 1;
sweilz 3:df82ebf4be54 529
sweilz 3:df82ebf4be54 530 // Word address
sweilz 3:df82ebf4be54 531 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 532 } else {
sweilz 3:df82ebf4be54 533 len = 2;
sweilz 3:df82ebf4be54 534
sweilz 3:df82ebf4be54 535 // First word address (MSB)
sweilz 3:df82ebf4be54 536 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 537
sweilz 3:df82ebf4be54 538 // Second word address (LSB)
sweilz 3:df82ebf4be54 539 cmd[1] = (uint8_t)address;
sweilz 3:df82ebf4be54 540 }
sweilz 3:df82ebf4be54 541
sweilz 3:df82ebf4be54 542 // Write command
sweilz 3:df82ebf4be54 543 ack = _i2c.write((int)addr,(char *)cmd,len,true);
sweilz 3:df82ebf4be54 544 if(ack != 0) {
sweilz 3:df82ebf4be54 545 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 546 return;
sweilz 3:df82ebf4be54 547 }
sweilz 3:df82ebf4be54 548
sweilz 3:df82ebf4be54 549 // Read data
sweilz 3:df82ebf4be54 550 ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
sweilz 3:df82ebf4be54 551 if(ack != 0) {
sweilz 3:df82ebf4be54 552 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 553 return;
sweilz 3:df82ebf4be54 554 }
sweilz 3:df82ebf4be54 555
bborredon 0:80245aff63ce 556 }
bborredon 0:80245aff63ce 557
bborredon 0:80245aff63ce 558 void EEPROM::read(uint16_t address, int8_t *data, uint16_t size)
bborredon 0:80245aff63ce 559 {
sweilz 3:df82ebf4be54 560 uint8_t page;
sweilz 3:df82ebf4be54 561 uint8_t addr;
sweilz 3:df82ebf4be54 562 uint8_t cmd[2];
sweilz 3:df82ebf4be54 563 uint8_t len;
sweilz 3:df82ebf4be54 564 int ack;
sweilz 3:df82ebf4be54 565
sweilz 3:df82ebf4be54 566 // Check error
sweilz 3:df82ebf4be54 567 if(_errnum)
sweilz 3:df82ebf4be54 568 return;
sweilz 3:df82ebf4be54 569
sweilz 3:df82ebf4be54 570 // Check address
sweilz 3:df82ebf4be54 571 if(!checkAddress(address)) {
sweilz 3:df82ebf4be54 572 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 573 return;
sweilz 3:df82ebf4be54 574 }
sweilz 3:df82ebf4be54 575
sweilz 3:df82ebf4be54 576 // Check size
sweilz 3:df82ebf4be54 577 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 578 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 579 return;
sweilz 3:df82ebf4be54 580 }
sweilz 3:df82ebf4be54 581
sweilz 3:df82ebf4be54 582 // Compute page number
sweilz 3:df82ebf4be54 583 page = 0;
sweilz 3:df82ebf4be54 584 if(_type < T24C32)
sweilz 3:df82ebf4be54 585 page = (uint8_t) (address / 256);
sweilz 3:df82ebf4be54 586
sweilz 3:df82ebf4be54 587 // Device address
sweilz 3:df82ebf4be54 588 addr = EEPROM_Address | _address | (page << 1);
sweilz 3:df82ebf4be54 589
sweilz 3:df82ebf4be54 590 if(_type < T24C32) {
sweilz 3:df82ebf4be54 591 len = 1;
sweilz 3:df82ebf4be54 592
sweilz 3:df82ebf4be54 593 // Word address
sweilz 3:df82ebf4be54 594 cmd[0] = (uint8_t) (address - page * 256);
sweilz 3:df82ebf4be54 595 } else {
sweilz 3:df82ebf4be54 596 len = 2;
sweilz 3:df82ebf4be54 597
sweilz 3:df82ebf4be54 598 // First word address (MSB)
sweilz 3:df82ebf4be54 599 cmd[0] = (uint8_t) (address >> 8);
sweilz 3:df82ebf4be54 600
sweilz 3:df82ebf4be54 601 // Second word address (LSB)
sweilz 3:df82ebf4be54 602 cmd[1] = (uint8_t) address;
sweilz 3:df82ebf4be54 603 }
sweilz 3:df82ebf4be54 604
sweilz 3:df82ebf4be54 605 // Write command
sweilz 3:df82ebf4be54 606 ack = _i2c.write((int)addr,(char *)cmd,len,true);
sweilz 3:df82ebf4be54 607 if(ack != 0) {
sweilz 3:df82ebf4be54 608 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 609 return;
sweilz 3:df82ebf4be54 610 }
sweilz 3:df82ebf4be54 611
sweilz 3:df82ebf4be54 612 // Sequential read
sweilz 3:df82ebf4be54 613 ack = _i2c.read((int)addr,(char *)data,size);
sweilz 3:df82ebf4be54 614 if(ack != 0) {
sweilz 3:df82ebf4be54 615 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 616 return;
sweilz 3:df82ebf4be54 617 }
sweilz 3:df82ebf4be54 618
bborredon 0:80245aff63ce 619 }
bborredon 0:80245aff63ce 620
bborredon 0:80245aff63ce 621 void EEPROM::read(int8_t& data)
bborredon 0:80245aff63ce 622 {
sweilz 3:df82ebf4be54 623 uint8_t addr;
sweilz 3:df82ebf4be54 624 int ack;
sweilz 3:df82ebf4be54 625
sweilz 3:df82ebf4be54 626 // Check error
sweilz 3:df82ebf4be54 627 if(_errnum)
sweilz 3:df82ebf4be54 628 return;
bborredon 0:80245aff63ce 629
sweilz 3:df82ebf4be54 630 // Device address
sweilz 3:df82ebf4be54 631 addr = EEPROM_Address | _address;
sweilz 3:df82ebf4be54 632
sweilz 3:df82ebf4be54 633 // Read data
sweilz 3:df82ebf4be54 634 ack = _i2c.read((int)addr,(char *)&data,sizeof(data));
sweilz 3:df82ebf4be54 635 if(ack != 0) {
sweilz 3:df82ebf4be54 636 _errnum = EEPROM_I2cError;
sweilz 3:df82ebf4be54 637 return;
sweilz 3:df82ebf4be54 638 }
sweilz 3:df82ebf4be54 639
bborredon 0:80245aff63ce 640 }
bborredon 0:80245aff63ce 641
bborredon 0:80245aff63ce 642 void EEPROM::read(uint16_t address, int16_t& data)
bborredon 0:80245aff63ce 643 {
sweilz 3:df82ebf4be54 644 int8_t cmd[2];
sweilz 3:df82ebf4be54 645
sweilz 3:df82ebf4be54 646 // Check error
sweilz 3:df82ebf4be54 647 if(_errnum)
sweilz 3:df82ebf4be54 648 return;
sweilz 3:df82ebf4be54 649
sweilz 3:df82ebf4be54 650 // Check address
sweilz 3:df82ebf4be54 651 if(!checkAddress(address + 1)) {
sweilz 3:df82ebf4be54 652 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 653 return;
sweilz 3:df82ebf4be54 654 }
sweilz 3:df82ebf4be54 655
sweilz 3:df82ebf4be54 656 read(address,cmd,2);
sweilz 3:df82ebf4be54 657
sweilz 3:df82ebf4be54 658 memcpy(&data,cmd,2);
sweilz 3:df82ebf4be54 659
bborredon 0:80245aff63ce 660 }
bborredon 0:80245aff63ce 661
bborredon 0:80245aff63ce 662 void EEPROM::read(uint16_t address, int32_t& data)
bborredon 0:80245aff63ce 663 {
sweilz 3:df82ebf4be54 664 int8_t cmd[4];
sweilz 3:df82ebf4be54 665
sweilz 3:df82ebf4be54 666 // Check error
sweilz 3:df82ebf4be54 667 if(_errnum)
sweilz 3:df82ebf4be54 668 return;
sweilz 3:df82ebf4be54 669
sweilz 3:df82ebf4be54 670 // Check address
sweilz 3:df82ebf4be54 671 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 672 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 673 return;
sweilz 3:df82ebf4be54 674 }
sweilz 3:df82ebf4be54 675
sweilz 3:df82ebf4be54 676 read(address,cmd,4);
sweilz 3:df82ebf4be54 677
sweilz 3:df82ebf4be54 678 memcpy(&data,cmd,4);
sweilz 3:df82ebf4be54 679
bborredon 0:80245aff63ce 680 }
bborredon 0:80245aff63ce 681
bborredon 0:80245aff63ce 682 void EEPROM::read(uint16_t address, float& data)
bborredon 0:80245aff63ce 683 {
sweilz 3:df82ebf4be54 684 int8_t cmd[4];
sweilz 3:df82ebf4be54 685
sweilz 3:df82ebf4be54 686 // Check error
sweilz 3:df82ebf4be54 687 if(_errnum)
sweilz 3:df82ebf4be54 688 return;
sweilz 3:df82ebf4be54 689
sweilz 3:df82ebf4be54 690 // Check address
sweilz 3:df82ebf4be54 691 if(!checkAddress(address + 3)) {
sweilz 3:df82ebf4be54 692 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 693 return;
sweilz 3:df82ebf4be54 694 }
sweilz 3:df82ebf4be54 695
sweilz 3:df82ebf4be54 696 read(address,cmd,4);
sweilz 3:df82ebf4be54 697
sweilz 3:df82ebf4be54 698 memcpy(&data,cmd,4);
sweilz 3:df82ebf4be54 699
bborredon 0:80245aff63ce 700 }
bborredon 0:80245aff63ce 701
bborredon 0:80245aff63ce 702 void EEPROM::read(uint16_t address, void *data, uint16_t size)
bborredon 0:80245aff63ce 703 {
sweilz 3:df82ebf4be54 704 int8_t *cmd = NULL;
sweilz 3:df82ebf4be54 705
sweilz 3:df82ebf4be54 706 // Check error
sweilz 3:df82ebf4be54 707 if(_errnum)
sweilz 3:df82ebf4be54 708 return;
sweilz 3:df82ebf4be54 709
sweilz 3:df82ebf4be54 710 // Check address
sweilz 3:df82ebf4be54 711 if(!checkAddress(address + size - 1)) {
sweilz 3:df82ebf4be54 712 _errnum = EEPROM_OutOfRange;
sweilz 3:df82ebf4be54 713 return;
sweilz 3:df82ebf4be54 714 }
sweilz 3:df82ebf4be54 715
sweilz 3:df82ebf4be54 716 cmd = (int8_t *)malloc(size);
sweilz 3:df82ebf4be54 717 if(cmd == NULL) {
sweilz 3:df82ebf4be54 718 _errnum = EEPROM_MallocError;
sweilz 3:df82ebf4be54 719 return;
sweilz 3:df82ebf4be54 720 }
sweilz 3:df82ebf4be54 721
sweilz 3:df82ebf4be54 722 read(address,cmd,size);
sweilz 3:df82ebf4be54 723
sweilz 3:df82ebf4be54 724 memcpy(data,cmd,size);
sweilz 3:df82ebf4be54 725
sweilz 3:df82ebf4be54 726 free(cmd);
sweilz 3:df82ebf4be54 727
bborredon 0:80245aff63ce 728 }
bborredon 0:80245aff63ce 729
bborredon 0:80245aff63ce 730 void EEPROM::ready(void)
bborredon 0:80245aff63ce 731 {
sweilz 3:df82ebf4be54 732 int ack;
sweilz 3:df82ebf4be54 733 uint8_t addr;
sweilz 3:df82ebf4be54 734 uint8_t cmd;
sweilz 3:df82ebf4be54 735
sweilz 3:df82ebf4be54 736 // Check error
sweilz 3:df82ebf4be54 737 if(_errnum)
sweilz 3:df82ebf4be54 738 return;
sweilz 3:df82ebf4be54 739
sweilz 3:df82ebf4be54 740 // Device address
sweilz 3:df82ebf4be54 741 addr = EEPROM_Address | _address;
sweilz 3:df82ebf4be54 742
sweilz 3:df82ebf4be54 743 cmd = 0;
sweilz 3:df82ebf4be54 744 /*
sweilz 3:df82ebf4be54 745 // Wait end of write
sweilz 3:df82ebf4be54 746 do {
sweilz 3:df82ebf4be54 747 ack = _i2c.write((int)addr,(char *)cmd,0);
sweilz 3:df82ebf4be54 748 } while(ack != 0);
sweilz 3:df82ebf4be54 749 */
soulx 2:c648c5e93d5e 750 wait_ms(5);
bborredon 0:80245aff63ce 751 }
bborredon 0:80245aff63ce 752
bborredon 0:80245aff63ce 753 uint32_t EEPROM::getSize(void)
bborredon 0:80245aff63ce 754 {
sweilz 3:df82ebf4be54 755 return(_size);
bborredon 0:80245aff63ce 756 }
bborredon 0:80245aff63ce 757
bborredon 0:80245aff63ce 758 uint8_t EEPROM::getError(void)
bborredon 0:80245aff63ce 759 {
sweilz 3:df82ebf4be54 760 return(_errnum);
bborredon 0:80245aff63ce 761 }
bborredon 0:80245aff63ce 762
bborredon 0:80245aff63ce 763 bool EEPROM::checkAddress(uint16_t address)
bborredon 0:80245aff63ce 764 {
sweilz 3:df82ebf4be54 765 bool ret = true;
sweilz 3:df82ebf4be54 766
sweilz 3:df82ebf4be54 767 switch(_type) {
sweilz 3:df82ebf4be54 768 case T24C01 :
sweilz 3:df82ebf4be54 769 if(address >= T24C01)
sweilz 3:df82ebf4be54 770 ret = false;
sweilz 3:df82ebf4be54 771 break;
sweilz 3:df82ebf4be54 772 case T24C02 :
sweilz 3:df82ebf4be54 773 if(address >= T24C02)
sweilz 3:df82ebf4be54 774 ret = false;
sweilz 3:df82ebf4be54 775 break;
sweilz 3:df82ebf4be54 776 case T24C04 :
sweilz 3:df82ebf4be54 777 if(address >= T24C04)
sweilz 3:df82ebf4be54 778 ret = false;
sweilz 3:df82ebf4be54 779 break;
sweilz 3:df82ebf4be54 780 case T24C08 :
sweilz 3:df82ebf4be54 781 if(address >= T24C08)
sweilz 3:df82ebf4be54 782 ret = false;
sweilz 3:df82ebf4be54 783 break;
sweilz 3:df82ebf4be54 784 case T24C16 :
sweilz 3:df82ebf4be54 785 if(address >= T24C16)
sweilz 3:df82ebf4be54 786 ret = false;
sweilz 3:df82ebf4be54 787 break;
sweilz 3:df82ebf4be54 788 case T24C32 :
sweilz 3:df82ebf4be54 789 if(address >= T24C32)
sweilz 3:df82ebf4be54 790 ret = false;
sweilz 3:df82ebf4be54 791 break;
sweilz 3:df82ebf4be54 792 case T24C64 :
sweilz 3:df82ebf4be54 793 if(address >= T24C64)
sweilz 3:df82ebf4be54 794 ret = false;
sweilz 3:df82ebf4be54 795 break;
sweilz 3:df82ebf4be54 796 case T24C128 :
sweilz 3:df82ebf4be54 797 if(address >= T24C128)
sweilz 3:df82ebf4be54 798 ret = false;
sweilz 3:df82ebf4be54 799 break;
sweilz 3:df82ebf4be54 800 case T24C256 :
sweilz 3:df82ebf4be54 801 if(address >= T24C256)
sweilz 3:df82ebf4be54 802 ret = false;
sweilz 3:df82ebf4be54 803 break;
sweilz 3:df82ebf4be54 804 case T24C512 :
sweilz 3:df82ebf4be54 805 if(address >= T24C512)
sweilz 3:df82ebf4be54 806 ret = false;
sweilz 3:df82ebf4be54 807 break;
sweilz 3:df82ebf4be54 808 case T24C1024 :
sweilz 3:df82ebf4be54 809 if(address >= T24C1024)
sweilz 3:df82ebf4be54 810 ret = false;
sweilz 3:df82ebf4be54 811 break;
sweilz 3:df82ebf4be54 812 case T24C1025 :
sweilz 3:df82ebf4be54 813 if(address >= T24C1025 - 1)
sweilz 3:df82ebf4be54 814 ret = false;
sweilz 3:df82ebf4be54 815 break;
sweilz 3:df82ebf4be54 816 }
sweilz 3:df82ebf4be54 817
sweilz 3:df82ebf4be54 818 return(ret);
sweilz 3:df82ebf4be54 819 }