สัสชิน
Dependencies: BEAR_Protocol_Edited_V22 BufferedSerial Debug MaxSonar PID Process QEI UI iSerial mbed
Fork of clean_V2 by
eeprom/eeprom.cpp@1:45f1573d65a1, 2016-03-21 (annotated)
- Committer:
- palmdotax
- Date:
- Mon Mar 21 20:21:12 2016 +0000
- Revision:
- 1:45f1573d65a1
aaaaa
Who changed what in which revision?
User | Revision | Line number | New 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 | } |