Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
OneWireEEPROM.cpp@2:193926923cb0, 2012-01-17 (annotated)
- Committer:
- Wimpie
- Date:
- Tue Jan 17 08:30:45 2012 +0000
- Revision:
- 2:193926923cb0
- Parent:
- 1:7218c076189b
readbyte readword
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wimpie | 0:0f7bbfde44b7 | 1 | /* |
Wimpie | 0:0f7bbfde44b7 | 2 | * OneWireEEPROM. Library for Maxim One-Wire EEPROM. |
Wimpie | 0:0f7bbfde44b7 | 3 | * |
Wimpie | 0:0f7bbfde44b7 | 4 | * see http://www.maxim-ic.com |
Wimpie | 0:0f7bbfde44b7 | 5 | * |
Wimpie | 0:0f7bbfde44b7 | 6 | * DS2433 |
Wimpie | 0:0f7bbfde44b7 | 7 | * DS28EC20 |
Wimpie | 0:0f7bbfde44b7 | 8 | * |
Wimpie | 0:0f7bbfde44b7 | 9 | * Copyright (C) <2011> Wim De Roeve <wim312@gmail.com> |
Wimpie | 0:0f7bbfde44b7 | 10 | * |
Wimpie | 0:0f7bbfde44b7 | 11 | * OneWireEEPROM is free software: you can redistribute it and/or modify |
Wimpie | 0:0f7bbfde44b7 | 12 | * it under the terms of the GNU General Public License as published by |
Wimpie | 0:0f7bbfde44b7 | 13 | * the Free Software Foundation, either version 3 of the License, or |
Wimpie | 0:0f7bbfde44b7 | 14 | * (at your option) any later version. |
Wimpie | 0:0f7bbfde44b7 | 15 | * |
Wimpie | 0:0f7bbfde44b7 | 16 | * OneWireEEPROM is distributed in the hope that it will be useful, |
Wimpie | 0:0f7bbfde44b7 | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
Wimpie | 0:0f7bbfde44b7 | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
Wimpie | 0:0f7bbfde44b7 | 19 | * GNU General Public License for more details. |
Wimpie | 0:0f7bbfde44b7 | 20 | * |
Wimpie | 0:0f7bbfde44b7 | 21 | * You should have received a copy of the GNU General Public License |
Wimpie | 0:0f7bbfde44b7 | 22 | * If not, see <http://www.gnu.org/licenses/>. |
Wimpie | 0:0f7bbfde44b7 | 23 | */ |
Wimpie | 0:0f7bbfde44b7 | 24 | |
Wimpie | 0:0f7bbfde44b7 | 25 | #include "mbed.h" |
Wimpie | 0:0f7bbfde44b7 | 26 | #include "OneWireEEPROM.h" |
Wimpie | 0:0f7bbfde44b7 | 27 | |
Wimpie | 0:0f7bbfde44b7 | 28 | Serial output(USBTX, USBRX); |
Wimpie | 0:0f7bbfde44b7 | 29 | |
Wimpie | 1:7218c076189b | 30 | OneWireEEPROM::OneWireEEPROM(PinName pin, bool crcOn, bool useAddr, bool parasitic, DSTYPE ds, unsigned char *ROMaddress) |
Wimpie | 0:0f7bbfde44b7 | 31 | :oneWire(pin, STANDARD) { |
Wimpie | 0:0f7bbfde44b7 | 32 | _useCRC=crcOn; |
Wimpie | 0:0f7bbfde44b7 | 33 | _useAddress=useAddr; |
Wimpie | 0:0f7bbfde44b7 | 34 | _useParasiticPower=parasitic; |
Wimpie | 0:0f7bbfde44b7 | 35 | switch (ds) { |
Wimpie | 0:0f7bbfde44b7 | 36 | case DS2433: { |
Wimpie | 0:0f7bbfde44b7 | 37 | _pages = DS2433PAGES; |
Wimpie | 0:0f7bbfde44b7 | 38 | _eeprom_id =DS2433EEPROM_ID; |
Wimpie | 0:0f7bbfde44b7 | 39 | break; |
Wimpie | 0:0f7bbfde44b7 | 40 | } |
Wimpie | 0:0f7bbfde44b7 | 41 | case DS28EC20: { |
Wimpie | 0:0f7bbfde44b7 | 42 | _pages =DS28EC20PAGES; |
Wimpie | 0:0f7bbfde44b7 | 43 | _eeprom_id =DS28EC20EEPROM_ID; |
Wimpie | 0:0f7bbfde44b7 | 44 | break; |
Wimpie | 0:0f7bbfde44b7 | 45 | } |
Wimpie | 0:0f7bbfde44b7 | 46 | |
Wimpie | 0:0f7bbfde44b7 | 47 | } |
Wimpie | 0:0f7bbfde44b7 | 48 | _memsize = _pages * PAGESIZE; |
Wimpie | 1:7218c076189b | 49 | |
Wimpie | 1:7218c076189b | 50 | if (_useAddress) { |
Wimpie | 1:7218c076189b | 51 | for (int i = 0; i < ADDRESS_SIZE; i++) |
Wimpie | 1:7218c076189b | 52 | _ROMCode[i]=ROMaddress[i]; |
Wimpie | 1:7218c076189b | 53 | } else { |
Wimpie | 1:7218c076189b | 54 | for (int i = 0; i < ADDRESS_SIZE; i++) |
Wimpie | 1:7218c076189b | 55 | _ROMCode[i]=0; |
Wimpie | 1:7218c076189b | 56 | } |
Wimpie | 2:193926923cb0 | 57 | |
Wimpie | 2:193926923cb0 | 58 | active=0; |
Wimpie | 0:0f7bbfde44b7 | 59 | } |
Wimpie | 0:0f7bbfde44b7 | 60 | |
Wimpie | 0:0f7bbfde44b7 | 61 | |
Wimpie | 1:7218c076189b | 62 | bool OneWireEEPROM::Initialize() { |
Wimpie | 1:7218c076189b | 63 | |
Wimpie | 1:7218c076189b | 64 | int OneWireFound; |
Wimpie | 1:7218c076189b | 65 | int OneWireSameAddress; |
Wimpie | 1:7218c076189b | 66 | int i; |
Wimpie | 1:7218c076189b | 67 | BYTE _dummyaddress[8]; |
Wimpie | 1:7218c076189b | 68 | |
Wimpie | 0:0f7bbfde44b7 | 69 | |
Wimpie | 1:7218c076189b | 70 | if (_useAddress) { |
Wimpie | 1:7218c076189b | 71 | output.printf("\r\nScan for device with address "); |
Wimpie | 1:7218c076189b | 72 | for (i = 0; i < ADDRESS_SIZE; i++) { |
Wimpie | 1:7218c076189b | 73 | output.printf("%x ", (int)_ROMCode[i]); |
Wimpie | 1:7218c076189b | 74 | } |
Wimpie | 1:7218c076189b | 75 | output.printf("\r\n"); |
Wimpie | 1:7218c076189b | 76 | } |
Wimpie | 0:0f7bbfde44b7 | 77 | |
Wimpie | 1:7218c076189b | 78 | OneWireSameAddress=0; |
Wimpie | 0:0f7bbfde44b7 | 79 | |
Wimpie | 0:0f7bbfde44b7 | 80 | oneWire.resetSearch(); |
Wimpie | 1:7218c076189b | 81 | do { |
Wimpie | 1:7218c076189b | 82 | OneWireFound=(oneWire.search(_dummyaddress)); |
Wimpie | 1:7218c076189b | 83 | if (OneWireFound) { |
Wimpie | 1:7218c076189b | 84 | |
Wimpie | 1:7218c076189b | 85 | if (!_useAddress) { |
Wimpie | 1:7218c076189b | 86 | output.printf("Device found with Address = "); |
Wimpie | 1:7218c076189b | 87 | for (i = 0; i < ADDRESS_SIZE; i++) { |
Wimpie | 1:7218c076189b | 88 | output.printf("%x ", (int)_dummyaddress[i]); |
Wimpie | 1:7218c076189b | 89 | } |
Wimpie | 1:7218c076189b | 90 | } |
Wimpie | 1:7218c076189b | 91 | |
Wimpie | 1:7218c076189b | 92 | OneWireSameAddress=1; |
Wimpie | 1:7218c076189b | 93 | |
Wimpie | 1:7218c076189b | 94 | if (_useAddress) { |
Wimpie | 1:7218c076189b | 95 | for (i = 0; i < ADDRESS_SIZE; i++) { |
Wimpie | 1:7218c076189b | 96 | if (!((OneWireSameAddress) && (_ROMCode[i] ==_dummyaddress[i]))) |
Wimpie | 1:7218c076189b | 97 | OneWireSameAddress=0; |
Wimpie | 1:7218c076189b | 98 | } |
Wimpie | 1:7218c076189b | 99 | } else { |
Wimpie | 1:7218c076189b | 100 | for (i = 0; i < ADDRESS_SIZE; i++) { |
Wimpie | 1:7218c076189b | 101 | _ROMCode[i] =_dummyaddress[i]; |
Wimpie | 1:7218c076189b | 102 | } |
Wimpie | 1:7218c076189b | 103 | } |
Wimpie | 1:7218c076189b | 104 | |
Wimpie | 1:7218c076189b | 105 | |
Wimpie | 1:7218c076189b | 106 | /*if (OneWireSameAddress) { |
Wimpie | 1:7218c076189b | 107 | output.printf("-> Address valid!\r\n"); |
Wimpie | 1:7218c076189b | 108 | |
Wimpie | 1:7218c076189b | 109 | } else { |
Wimpie | 1:7218c076189b | 110 | |
Wimpie | 1:7218c076189b | 111 | }*/ |
Wimpie | 1:7218c076189b | 112 | |
Wimpie | 1:7218c076189b | 113 | } else { |
Wimpie | 1:7218c076189b | 114 | |
Wimpie | 1:7218c076189b | 115 | output.printf("No more addresses.\r\n"); |
Wimpie | 1:7218c076189b | 116 | oneWire.resetSearch(); |
Wimpie | 1:7218c076189b | 117 | wait_ms(250); //500 |
Wimpie | 1:7218c076189b | 118 | } |
Wimpie | 1:7218c076189b | 119 | } while (OneWireFound && !OneWireSameAddress); |
Wimpie | 1:7218c076189b | 120 | |
Wimpie | 1:7218c076189b | 121 | if (!OneWireSameAddress) { |
Wimpie | 1:7218c076189b | 122 | output.printf("-> No Valid ROM Code found.\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 123 | return false; |
Wimpie | 0:0f7bbfde44b7 | 124 | } |
Wimpie | 1:7218c076189b | 125 | if (OneWireCRC::crc8(_ROMCode, ADDRESS_CRC_BYTE) != _ROMCode[ADDRESS_CRC_BYTE]) { // check address CRC is valid |
Wimpie | 0:0f7bbfde44b7 | 126 | output.printf("CRC is not valid!\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 127 | wait_ms(100); |
Wimpie | 0:0f7bbfde44b7 | 128 | |
Wimpie | 0:0f7bbfde44b7 | 129 | return false; |
Wimpie | 0:0f7bbfde44b7 | 130 | } |
Wimpie | 0:0f7bbfde44b7 | 131 | |
Wimpie | 1:7218c076189b | 132 | if (_ROMCode[0] != _eeprom_id) { |
Wimpie | 0:0f7bbfde44b7 | 133 | output.printf("Device is not a OneWireEEPROM_ID device.\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 134 | wait_ms(100); |
Wimpie | 0:0f7bbfde44b7 | 135 | return false; |
Wimpie | 1:7218c076189b | 136 | |
Wimpie | 1:7218c076189b | 137 | } else { |
Wimpie | 1:7218c076189b | 138 | output.printf("OneWireEEPROM present and correct.\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 139 | } |
Wimpie | 2:193926923cb0 | 140 | active=1; |
Wimpie | 1:7218c076189b | 141 | return true; |
Wimpie | 0:0f7bbfde44b7 | 142 | } |
Wimpie | 0:0f7bbfde44b7 | 143 | |
Wimpie | 0:0f7bbfde44b7 | 144 | void OneWireEEPROM::ResetAndAddress() { |
Wimpie | 0:0f7bbfde44b7 | 145 | oneWire.reset(); // reset device |
Wimpie | 0:0f7bbfde44b7 | 146 | if (_useAddress) { |
Wimpie | 1:7218c076189b | 147 | oneWire.matchROM(_ROMCode); // select which device to talk to |
Wimpie | 0:0f7bbfde44b7 | 148 | } else { |
Wimpie | 0:0f7bbfde44b7 | 149 | oneWire.skipROM(); // broadcast |
Wimpie | 0:0f7bbfde44b7 | 150 | } |
Wimpie | 0:0f7bbfde44b7 | 151 | } |
Wimpie | 0:0f7bbfde44b7 | 152 | |
Wimpie | 0:0f7bbfde44b7 | 153 | bool OneWireEEPROM::WriteMemory(uint8_t* Source, uint16_t Address, uint8_t Size) { |
Wimpie | 0:0f7bbfde44b7 | 154 | uint8_t _ES; //store Endif Address , datastatus |
Wimpie | 0:0f7bbfde44b7 | 155 | uint8_t B; |
Wimpie | 0:0f7bbfde44b7 | 156 | |
Wimpie | 0:0f7bbfde44b7 | 157 | if (Address<_memsize) { |
Wimpie | 0:0f7bbfde44b7 | 158 | uint8_t _TA1=(uint8_t)(Address & 0x00FF); |
Wimpie | 0:0f7bbfde44b7 | 159 | uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8); |
Wimpie | 0:0f7bbfde44b7 | 160 | |
Wimpie | 0:0f7bbfde44b7 | 161 | if ((Size<=PAGESIZE) and ((Size+Address)<=_memsize)) { |
Wimpie | 0:0f7bbfde44b7 | 162 | |
Wimpie | 1:7218c076189b | 163 | // output.printf ("\r\nWriting to OneWireEEPROM %i Bytes",Size); |
Wimpie | 0:0f7bbfde44b7 | 164 | |
Wimpie | 0:0f7bbfde44b7 | 165 | ResetAndAddress(); |
Wimpie | 0:0f7bbfde44b7 | 166 | oneWire.writeByte(WRITESCRATCHPAD); |
Wimpie | 0:0f7bbfde44b7 | 167 | oneWire.writeByte(_TA1); //begin address T7..T0 |
Wimpie | 0:0f7bbfde44b7 | 168 | oneWire.writeByte(_TA2); //begin address T15..T8 |
Wimpie | 0:0f7bbfde44b7 | 169 | |
Wimpie | 0:0f7bbfde44b7 | 170 | //write _memPage to scratchpad |
Wimpie | 0:0f7bbfde44b7 | 171 | |
Wimpie | 0:0f7bbfde44b7 | 172 | for (int i = 0; i < Size; i++) { |
Wimpie | 0:0f7bbfde44b7 | 173 | oneWire.writeByte(Source[i]); |
Wimpie | 1:7218c076189b | 174 | // output.printf ("%X ",Source[i]); |
Wimpie | 0:0f7bbfde44b7 | 175 | } |
Wimpie | 1:7218c076189b | 176 | // output.printf ("\r\nTA1=%X",_TA1); |
Wimpie | 1:7218c076189b | 177 | // output.printf ("\r\nTA2=%X\r\n",_TA2); |
Wimpie | 0:0f7bbfde44b7 | 178 | |
Wimpie | 0:0f7bbfde44b7 | 179 | //read and check data in scratchpad |
Wimpie | 0:0f7bbfde44b7 | 180 | ResetAndAddress(); |
Wimpie | 0:0f7bbfde44b7 | 181 | oneWire.writeByte(READSCRATCHPAD); |
Wimpie | 0:0f7bbfde44b7 | 182 | B=oneWire.readByte(); |
Wimpie | 0:0f7bbfde44b7 | 183 | if (B != _TA1) { //check TA1, return if bad |
Wimpie | 0:0f7bbfde44b7 | 184 | output.printf("\r\nWrite error in TA1 %X - %X\r\n",B,_TA1); |
Wimpie | 0:0f7bbfde44b7 | 185 | return false; |
Wimpie | 0:0f7bbfde44b7 | 186 | } |
Wimpie | 0:0f7bbfde44b7 | 187 | B=oneWire.readByte(); |
Wimpie | 0:0f7bbfde44b7 | 188 | if (B != _TA2) { //check TA2, return if bad |
Wimpie | 0:0f7bbfde44b7 | 189 | output.printf("\r\nWrite error in TA2 %X - %X\r\n",B,_TA2); |
Wimpie | 0:0f7bbfde44b7 | 190 | return false; |
Wimpie | 0:0f7bbfde44b7 | 191 | } |
Wimpie | 0:0f7bbfde44b7 | 192 | _ES = oneWire.readByte(); // ES Register |
Wimpie | 0:0f7bbfde44b7 | 193 | |
Wimpie | 0:0f7bbfde44b7 | 194 | //check data written |
Wimpie | 0:0f7bbfde44b7 | 195 | for (int i = 0; i < Size; i++) { |
Wimpie | 0:0f7bbfde44b7 | 196 | B=oneWire.readByte(); |
Wimpie | 0:0f7bbfde44b7 | 197 | if (B != Source[i]) { //return if bad |
Wimpie | 0:0f7bbfde44b7 | 198 | output.printf("\r\nWrite error in scratchpad on %i %X<->%X\r\n",i,B ,Source[i]); |
Wimpie | 0:0f7bbfde44b7 | 199 | return false; |
Wimpie | 0:0f7bbfde44b7 | 200 | } |
Wimpie | 0:0f7bbfde44b7 | 201 | } |
Wimpie | 0:0f7bbfde44b7 | 202 | |
Wimpie | 1:7218c076189b | 203 | // output.printf("\r\nES=%X\r\n",_ES); |
Wimpie | 0:0f7bbfde44b7 | 204 | |
Wimpie | 0:0f7bbfde44b7 | 205 | //issue copy with auth data |
Wimpie | 0:0f7bbfde44b7 | 206 | wait_ms(10); |
Wimpie | 0:0f7bbfde44b7 | 207 | ResetAndAddress(); |
Wimpie | 0:0f7bbfde44b7 | 208 | oneWire.writeByte(COPYSCRATCHPAD); |
Wimpie | 0:0f7bbfde44b7 | 209 | oneWire.writeByte(_TA1); |
Wimpie | 0:0f7bbfde44b7 | 210 | oneWire.writeByte(_TA2); |
Wimpie | 0:0f7bbfde44b7 | 211 | oneWire.writeByte(_ES); //pull-up! |
Wimpie | 0:0f7bbfde44b7 | 212 | wait_ms(10); //10ms min strong pullup delay -> time needed to copy from scratchpad to memory |
Wimpie | 0:0f7bbfde44b7 | 213 | |
Wimpie | 0:0f7bbfde44b7 | 214 | oneWire.reset(); |
Wimpie | 0:0f7bbfde44b7 | 215 | |
Wimpie | 1:7218c076189b | 216 | // output.printf ("\r\nData written\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 217 | return true; |
Wimpie | 0:0f7bbfde44b7 | 218 | } else { |
Wimpie | 0:0f7bbfde44b7 | 219 | output.printf ("\r\nTrying to write more then %i bytes-> %i\r\n",PAGESIZE,Size); |
Wimpie | 0:0f7bbfde44b7 | 220 | return false; |
Wimpie | 0:0f7bbfde44b7 | 221 | } |
Wimpie | 0:0f7bbfde44b7 | 222 | } else { |
Wimpie | 0:0f7bbfde44b7 | 223 | output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address); |
Wimpie | 0:0f7bbfde44b7 | 224 | return false; |
Wimpie | 0:0f7bbfde44b7 | 225 | } |
Wimpie | 0:0f7bbfde44b7 | 226 | } |
Wimpie | 0:0f7bbfde44b7 | 227 | |
Wimpie | 0:0f7bbfde44b7 | 228 | |
Wimpie | 0:0f7bbfde44b7 | 229 | int OneWireEEPROM::ReadMemory(uint8_t* Destination, uint16_t Address, uint16_t Size) { |
Wimpie | 0:0f7bbfde44b7 | 230 | uint8_t tmpReader; |
Wimpie | 1:7218c076189b | 231 | // bool readFF = 0; |
Wimpie | 0:0f7bbfde44b7 | 232 | int memPtr; |
Wimpie | 0:0f7bbfde44b7 | 233 | |
Wimpie | 0:0f7bbfde44b7 | 234 | if (Address<_memsize) { |
Wimpie | 0:0f7bbfde44b7 | 235 | |
Wimpie | 0:0f7bbfde44b7 | 236 | uint8_t _TA1=(uint8_t)(Address & 0x00FF); |
Wimpie | 0:0f7bbfde44b7 | 237 | uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8); |
Wimpie | 0:0f7bbfde44b7 | 238 | |
Wimpie | 0:0f7bbfde44b7 | 239 | if ((Size+Address)<=_memsize) { |
Wimpie | 0:0f7bbfde44b7 | 240 | |
Wimpie | 0:0f7bbfde44b7 | 241 | ResetAndAddress(); |
Wimpie | 0:0f7bbfde44b7 | 242 | oneWire.writeByte(READMEMORY); |
Wimpie | 0:0f7bbfde44b7 | 243 | oneWire.writeByte(_TA1); |
Wimpie | 0:0f7bbfde44b7 | 244 | oneWire.writeByte(_TA2); |
Wimpie | 0:0f7bbfde44b7 | 245 | |
Wimpie | 2:193926923cb0 | 246 | // output.printf ("\r\nReading... TA1=%X TA2=%X",_TA1, _TA2); |
Wimpie | 0:0f7bbfde44b7 | 247 | |
Wimpie | 0:0f7bbfde44b7 | 248 | for (memPtr = 0; memPtr < Size; memPtr++) { |
Wimpie | 0:0f7bbfde44b7 | 249 | tmpReader = oneWire.readByte(); |
Wimpie | 1:7218c076189b | 250 | // if (tmpReader == 0xff & !readFF) |
Wimpie | 1:7218c076189b | 251 | // readFF = 1; |
Wimpie | 1:7218c076189b | 252 | // else if (tmpReader == 0xff & readFF) |
Wimpie | 1:7218c076189b | 253 | // 0xff read twice, hopefully EoF as we break here :) |
Wimpie | 1:7218c076189b | 254 | // break; |
Wimpie | 0:0f7bbfde44b7 | 255 | |
Wimpie | 0:0f7bbfde44b7 | 256 | Destination[memPtr] = tmpReader; |
Wimpie | 0:0f7bbfde44b7 | 257 | } |
Wimpie | 2:193926923cb0 | 258 | // output.printf ("-> %i byte(s)\r\n",memPtr); |
Wimpie | 0:0f7bbfde44b7 | 259 | return memPtr; |
Wimpie | 0:0f7bbfde44b7 | 260 | |
Wimpie | 0:0f7bbfde44b7 | 261 | } else { |
Wimpie | 0:0f7bbfde44b7 | 262 | output.printf ("\r\nTrying to read outside MEMORY -> %i\r\n",Address+Size); |
Wimpie | 0:0f7bbfde44b7 | 263 | return 0; |
Wimpie | 0:0f7bbfde44b7 | 264 | } |
Wimpie | 0:0f7bbfde44b7 | 265 | } else { |
Wimpie | 0:0f7bbfde44b7 | 266 | output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address); |
Wimpie | 0:0f7bbfde44b7 | 267 | return 0; |
Wimpie | 0:0f7bbfde44b7 | 268 | } |
Wimpie | 0:0f7bbfde44b7 | 269 | } |
Wimpie | 0:0f7bbfde44b7 | 270 | |
Wimpie | 0:0f7bbfde44b7 | 271 | void OneWireEEPROM::ShowMemory(int PageFrom, int PageTo) { |
Wimpie | 0:0f7bbfde44b7 | 272 | int Size; |
Wimpie | 1:7218c076189b | 273 | int MemSize; |
Wimpie | 1:7218c076189b | 274 | |
Wimpie | 1:7218c076189b | 275 | if (PageFrom<0) |
Wimpie | 1:7218c076189b | 276 | PageFrom=0; |
Wimpie | 1:7218c076189b | 277 | if (PageTo>=_pages) |
Wimpie | 1:7218c076189b | 278 | PageTo=_pages-1; |
Wimpie | 1:7218c076189b | 279 | |
Wimpie | 0:0f7bbfde44b7 | 280 | if ((PageFrom>=0) and (PageFrom<_pages) and |
Wimpie | 0:0f7bbfde44b7 | 281 | (PageTo>=0) and (PageTo<_pages)) { |
Wimpie | 0:0f7bbfde44b7 | 282 | |
Wimpie | 1:7218c076189b | 283 | MemSize=(PageTo-PageFrom+1)*PAGESIZE; |
Wimpie | 1:7218c076189b | 284 | |
Wimpie | 1:7218c076189b | 285 | uint8_t *MemAll = (uint8_t*) malloc(MemSize); |
Wimpie | 0:0f7bbfde44b7 | 286 | |
Wimpie | 1:7218c076189b | 287 | if (MemAll!=NULL) { |
Wimpie | 1:7218c076189b | 288 | output.printf ("\r\nRead Page(s) from EEPROM %i to %i -> ", PageFrom,PageTo); |
Wimpie | 0:0f7bbfde44b7 | 289 | |
Wimpie | 1:7218c076189b | 290 | Size=ReadMemory(MemAll,PageFrom*PAGESIZE,MemSize); |
Wimpie | 1:7218c076189b | 291 | |
Wimpie | 1:7218c076189b | 292 | output.printf("%i bytes\r\n ",Size); |
Wimpie | 0:0f7bbfde44b7 | 293 | |
Wimpie | 1:7218c076189b | 294 | for (int j=PageFrom;j<=PageTo;j++) { |
Wimpie | 1:7218c076189b | 295 | output.printf ("\r\nPage %2i ->",j); |
Wimpie | 1:7218c076189b | 296 | for (int i=0;i<PAGESIZE;i++) { |
Wimpie | 1:7218c076189b | 297 | if ((j*32+i)<= Size) |
Wimpie | 1:7218c076189b | 298 | output.printf("%2X ",MemAll[j*32+i]); |
Wimpie | 1:7218c076189b | 299 | } |
Wimpie | 1:7218c076189b | 300 | if ((j*32)>Size) |
Wimpie | 1:7218c076189b | 301 | break; |
Wimpie | 0:0f7bbfde44b7 | 302 | } |
Wimpie | 1:7218c076189b | 303 | output.printf ("\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 304 | |
Wimpie | 1:7218c076189b | 305 | free(MemAll); |
Wimpie | 1:7218c076189b | 306 | } else |
Wimpie | 1:7218c076189b | 307 | output.printf ("\r\nNOT enough memory to display EEPROM content !!\r\n"); |
Wimpie | 0:0f7bbfde44b7 | 308 | } |
Wimpie | 0:0f7bbfde44b7 | 309 | } |
Wimpie | 0:0f7bbfde44b7 | 310 | |
Wimpie | 1:7218c076189b | 311 | bool OneWireEEPROM::WriteWord(uint16_t v, uint16_t Address) { |
Wimpie | 2:193926923cb0 | 312 | bool ok=false; |
Wimpie | 2:193926923cb0 | 313 | int it=0; |
Wimpie | 1:7218c076189b | 314 | uint8_t Mem[2]; |
Wimpie | 1:7218c076189b | 315 | Mem[0]=(uint8_t)(v & 0x00FF); |
Wimpie | 1:7218c076189b | 316 | Mem[1]=(uint8_t)((v & 0xFF00)>>8); |
Wimpie | 2:193926923cb0 | 317 | |
Wimpie | 2:193926923cb0 | 318 | do { |
Wimpie | 2:193926923cb0 | 319 | ok=WriteMemory(Mem,Address,2); |
Wimpie | 2:193926923cb0 | 320 | it++; |
Wimpie | 2:193926923cb0 | 321 | } while ((ok==false) && (it<5)); |
Wimpie | 2:193926923cb0 | 322 | if (it>1) { |
Wimpie | 2:193926923cb0 | 323 | output.printf (" EEPROM WriteWord %i times ->",it); |
Wimpie | 2:193926923cb0 | 324 | if (ok) |
Wimpie | 2:193926923cb0 | 325 | output.printf("ok\r\n"); |
Wimpie | 2:193926923cb0 | 326 | else |
Wimpie | 2:193926923cb0 | 327 | output.printf("not ok\r\n"); |
Wimpie | 2:193926923cb0 | 328 | } |
Wimpie | 2:193926923cb0 | 329 | return ok; |
Wimpie | 1:7218c076189b | 330 | } |
Wimpie | 1:7218c076189b | 331 | |
Wimpie | 1:7218c076189b | 332 | bool OneWireEEPROM::WriteByte(uint8_t b, uint16_t Address) { |
Wimpie | 2:193926923cb0 | 333 | bool ok=false; |
Wimpie | 2:193926923cb0 | 334 | int it=0; |
Wimpie | 1:7218c076189b | 335 | uint8_t Mem[1]; |
Wimpie | 1:7218c076189b | 336 | Mem[0]=(uint8_t)(b & 0x00FF); |
Wimpie | 2:193926923cb0 | 337 | do { |
Wimpie | 2:193926923cb0 | 338 | ok=WriteMemory(Mem,Address,1); |
Wimpie | 2:193926923cb0 | 339 | it++; |
Wimpie | 2:193926923cb0 | 340 | } while ((ok==false) && (it<5)); |
Wimpie | 2:193926923cb0 | 341 | if (it>1) { |
Wimpie | 2:193926923cb0 | 342 | output.printf (" EEPROM WriteByte %i times ->",it); |
Wimpie | 2:193926923cb0 | 343 | if (ok) |
Wimpie | 2:193926923cb0 | 344 | output.printf("ok\r\n"); |
Wimpie | 2:193926923cb0 | 345 | else |
Wimpie | 2:193926923cb0 | 346 | output.printf("not ok\r\n"); |
Wimpie | 2:193926923cb0 | 347 | } |
Wimpie | 2:193926923cb0 | 348 | return ok; |
Wimpie | 2:193926923cb0 | 349 | } |
Wimpie | 2:193926923cb0 | 350 | |
Wimpie | 2:193926923cb0 | 351 | uint16_t OneWireEEPROM::ReadWord(uint16_t Address) { |
Wimpie | 2:193926923cb0 | 352 | int size; |
Wimpie | 2:193926923cb0 | 353 | int it=0; |
Wimpie | 2:193926923cb0 | 354 | |
Wimpie | 2:193926923cb0 | 355 | uint8_t Mem[2]; |
Wimpie | 2:193926923cb0 | 356 | do { |
Wimpie | 2:193926923cb0 | 357 | size=ReadMemory(Mem,Address,2); |
Wimpie | 2:193926923cb0 | 358 | it++; |
Wimpie | 2:193926923cb0 | 359 | } while ((size==0) && (it<5)); |
Wimpie | 2:193926923cb0 | 360 | // output.printf ("%i %i \r\n",Mem[0],Mem[1]); |
Wimpie | 2:193926923cb0 | 361 | if (it>1) { |
Wimpie | 2:193926923cb0 | 362 | output.printf (" EEPROM ReadWord %i times ->",it); |
Wimpie | 2:193926923cb0 | 363 | if (size>0) |
Wimpie | 2:193926923cb0 | 364 | output.printf("ok\r\n"); |
Wimpie | 2:193926923cb0 | 365 | else |
Wimpie | 2:193926923cb0 | 366 | output.printf("not ok\r\n"); |
Wimpie | 2:193926923cb0 | 367 | } |
Wimpie | 2:193926923cb0 | 368 | return (uint16_t)Mem[0] + (uint16_t) (Mem[1]<<8); |
Wimpie | 2:193926923cb0 | 369 | } |
Wimpie | 2:193926923cb0 | 370 | |
Wimpie | 2:193926923cb0 | 371 | uint8_t OneWireEEPROM::ReadByte(uint8_t Address) { |
Wimpie | 2:193926923cb0 | 372 | int size; |
Wimpie | 2:193926923cb0 | 373 | int it=0; |
Wimpie | 2:193926923cb0 | 374 | uint8_t Mem[1]; |
Wimpie | 2:193926923cb0 | 375 | do { |
Wimpie | 2:193926923cb0 | 376 | size=ReadMemory(Mem,Address,1); |
Wimpie | 2:193926923cb0 | 377 | it++; |
Wimpie | 2:193926923cb0 | 378 | } while ((size==0) && (it<5)); |
Wimpie | 2:193926923cb0 | 379 | // output.printf ("%i \r\n",Mem[0]); |
Wimpie | 2:193926923cb0 | 380 | if (it>1) { |
Wimpie | 2:193926923cb0 | 381 | output.printf (" EEPROM ReadByte %i times ->",it); |
Wimpie | 2:193926923cb0 | 382 | if (size>0) |
Wimpie | 2:193926923cb0 | 383 | output.printf("ok\r\n"); |
Wimpie | 2:193926923cb0 | 384 | else |
Wimpie | 2:193926923cb0 | 385 | output.printf("not ok\r\n"); |
Wimpie | 2:193926923cb0 | 386 | } |
Wimpie | 2:193926923cb0 | 387 | return (uint8_t) Mem[0]; |
Wimpie | 1:7218c076189b | 388 | } |