สัสชิน

Dependencies:   BEAR_Protocol_Edited_V22 BufferedSerial Debug MaxSonar PID Process QEI UI iSerial mbed

Fork of clean_V2 by Betago

Committer:
icyzkungz
Date:
Wed Jun 08 17:19:21 2016 +0000
Revision:
8:fc70c78a443b
Parent:
1:45f1573d65a1
??????

Who changed what in which revision?

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