Proyecto ABInBev para la tarjeta Guaria 1/2.

Committer:
fmanzano_dtk
Date:
Fri Jul 01 12:45:55 2022 -0600
Revision:
1:9e821e640117
Child:
17:c53ea16f75c0
Se importan todos los archivos de la solucion para soportar la nueva version de USBSerial

Who changed what in which revision?

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