Dependents:   1W-EEPROM

Committer:
Wimpie
Date:
Mon Mar 21 20:33:46 2011 +0000
Revision:
0:0f7bbfde44b7
Child:
1:7218c076189b

        

Who changed what in which revision?

UserRevisionLine numberNew 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 * Uses the OneWireCRC library. http://mbed.org/users/snatch59/programs/OneWireCRC/gpdz56
Wimpie 0:0f7bbfde44b7 12 *
Wimpie 0:0f7bbfde44b7 13 * OneWireEEPROM is free software: you can redistribute it and/or modify
Wimpie 0:0f7bbfde44b7 14 * it under the terms of the GNU General Public License as published by
Wimpie 0:0f7bbfde44b7 15 * the Free Software Foundation, either version 3 of the License, or
Wimpie 0:0f7bbfde44b7 16 * (at your option) any later version.
Wimpie 0:0f7bbfde44b7 17 *
Wimpie 0:0f7bbfde44b7 18 * OneWireEEPROM is distributed in the hope that it will be useful,
Wimpie 0:0f7bbfde44b7 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Wimpie 0:0f7bbfde44b7 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Wimpie 0:0f7bbfde44b7 21 * GNU General Public License for more details.
Wimpie 0:0f7bbfde44b7 22 *
Wimpie 0:0f7bbfde44b7 23 * You should have received a copy of the GNU General Public License
Wimpie 0:0f7bbfde44b7 24 * If not, see <http://www.gnu.org/licenses/>.
Wimpie 0:0f7bbfde44b7 25 */
Wimpie 0:0f7bbfde44b7 26
Wimpie 0:0f7bbfde44b7 27 #include "mbed.h"
Wimpie 0:0f7bbfde44b7 28 #include "OneWireEEPROM.h"
Wimpie 0:0f7bbfde44b7 29
Wimpie 0:0f7bbfde44b7 30 Serial output(USBTX, USBRX);
Wimpie 0:0f7bbfde44b7 31
Wimpie 0:0f7bbfde44b7 32 OneWireEEPROM::OneWireEEPROM(PinName pin, bool crcOn, bool useAddr, bool parasitic, DSTYPE ds)
Wimpie 0:0f7bbfde44b7 33 :oneWire(pin, STANDARD) {
Wimpie 0:0f7bbfde44b7 34 _useCRC=crcOn;
Wimpie 0:0f7bbfde44b7 35 _useAddress=useAddr;
Wimpie 0:0f7bbfde44b7 36 _useParasiticPower=parasitic;
Wimpie 0:0f7bbfde44b7 37 switch (ds) {
Wimpie 0:0f7bbfde44b7 38 case DS2433: {
Wimpie 0:0f7bbfde44b7 39 _pages = DS2433PAGES;
Wimpie 0:0f7bbfde44b7 40 _eeprom_id =DS2433EEPROM_ID;
Wimpie 0:0f7bbfde44b7 41 break;
Wimpie 0:0f7bbfde44b7 42 }
Wimpie 0:0f7bbfde44b7 43 case DS28EC20: {
Wimpie 0:0f7bbfde44b7 44 _pages =DS28EC20PAGES;
Wimpie 0:0f7bbfde44b7 45 _eeprom_id =DS28EC20EEPROM_ID;
Wimpie 0:0f7bbfde44b7 46 break;
Wimpie 0:0f7bbfde44b7 47 }
Wimpie 0:0f7bbfde44b7 48
Wimpie 0:0f7bbfde44b7 49 }
Wimpie 0:0f7bbfde44b7 50 _memsize = _pages * PAGESIZE;
Wimpie 0:0f7bbfde44b7 51 }
Wimpie 0:0f7bbfde44b7 52
Wimpie 0:0f7bbfde44b7 53
Wimpie 0:0f7bbfde44b7 54 bool OneWireEEPROM::Initialize(uint8_t* ROMaddress) {
Wimpie 0:0f7bbfde44b7 55
Wimpie 0:0f7bbfde44b7 56 active=false;
Wimpie 0:0f7bbfde44b7 57
Wimpie 0:0f7bbfde44b7 58 output.printf("\r\nScan for One-Wire devices\r\n");
Wimpie 0:0f7bbfde44b7 59
Wimpie 0:0f7bbfde44b7 60 oneWire.resetSearch();
Wimpie 0:0f7bbfde44b7 61 if (!oneWire.search(oneWire.ROMCode)) { // search for 1-wire device with address
Wimpie 0:0f7bbfde44b7 62 // pc_OneWireEEPROM.traceOut("No One-Wire Device found.\r\n");
Wimpie 0:0f7bbfde44b7 63 wait_ms(100);
Wimpie 0:0f7bbfde44b7 64 return false;
Wimpie 0:0f7bbfde44b7 65 }
Wimpie 0:0f7bbfde44b7 66
Wimpie 0:0f7bbfde44b7 67 output.printf("Address = ");
Wimpie 0:0f7bbfde44b7 68 for (int i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 0:0f7bbfde44b7 69 output.printf("%x ", (int)oneWire.ROMCode[i]);
Wimpie 0:0f7bbfde44b7 70 }
Wimpie 0:0f7bbfde44b7 71
Wimpie 0:0f7bbfde44b7 72 output.printf("\r\n");
Wimpie 0:0f7bbfde44b7 73
Wimpie 0:0f7bbfde44b7 74 if (OneWireCRC::crc8(oneWire.ROMCode, ADDRESS_CRC_BYTE) != oneWire.ROMCode[ADDRESS_CRC_BYTE]) { // check address CRC is valid
Wimpie 0:0f7bbfde44b7 75 output.printf("CRC is not valid!\r\n");
Wimpie 0:0f7bbfde44b7 76 wait_ms(100);
Wimpie 0:0f7bbfde44b7 77
Wimpie 0:0f7bbfde44b7 78 return false;
Wimpie 0:0f7bbfde44b7 79 }
Wimpie 0:0f7bbfde44b7 80
Wimpie 0:0f7bbfde44b7 81 if (oneWire.ROMCode[0] != _eeprom_id) {
Wimpie 0:0f7bbfde44b7 82 output.printf("Device is not a OneWireEEPROM_ID device.\r\n");
Wimpie 0:0f7bbfde44b7 83 wait_ms(100);
Wimpie 0:0f7bbfde44b7 84 return false;
Wimpie 0:0f7bbfde44b7 85 }
Wimpie 0:0f7bbfde44b7 86
Wimpie 0:0f7bbfde44b7 87 if (_useAddress) {
Wimpie 0:0f7bbfde44b7 88 bool wrong=false;
Wimpie 0:0f7bbfde44b7 89 for (int i = 0; i < ADDRESS_SIZE; i++) {
Wimpie 0:0f7bbfde44b7 90 if (oneWire.ROMCode[i]!=ROMaddress[i])
Wimpie 0:0f7bbfde44b7 91 wrong=true;
Wimpie 0:0f7bbfde44b7 92
Wimpie 0:0f7bbfde44b7 93 if (!wrong) {
Wimpie 0:0f7bbfde44b7 94 output.printf("OneWireEEPROM present and correct.\r\n");
Wimpie 0:0f7bbfde44b7 95 active=true;
Wimpie 0:0f7bbfde44b7 96 return true;
Wimpie 0:0f7bbfde44b7 97 } else {
Wimpie 0:0f7bbfde44b7 98 output.printf("other OneWireEEPROM found\r\n");
Wimpie 0:0f7bbfde44b7 99 return false;
Wimpie 0:0f7bbfde44b7 100 }
Wimpie 0:0f7bbfde44b7 101 }
Wimpie 0:0f7bbfde44b7 102 } else {
Wimpie 0:0f7bbfde44b7 103 active=true;
Wimpie 0:0f7bbfde44b7 104 return true;
Wimpie 0:0f7bbfde44b7 105 }
Wimpie 0:0f7bbfde44b7 106 return false;
Wimpie 0:0f7bbfde44b7 107 }
Wimpie 0:0f7bbfde44b7 108
Wimpie 0:0f7bbfde44b7 109 void OneWireEEPROM::ResetAndAddress() {
Wimpie 0:0f7bbfde44b7 110 oneWire.reset(); // reset device
Wimpie 0:0f7bbfde44b7 111 if (_useAddress) {
Wimpie 0:0f7bbfde44b7 112 oneWire.matchROM(ROMCode); // select which device to talk to
Wimpie 0:0f7bbfde44b7 113 } else {
Wimpie 0:0f7bbfde44b7 114 oneWire.skipROM(); // broadcast
Wimpie 0:0f7bbfde44b7 115 }
Wimpie 0:0f7bbfde44b7 116 }
Wimpie 0:0f7bbfde44b7 117
Wimpie 0:0f7bbfde44b7 118 bool OneWireEEPROM::WriteMemory(uint8_t* Source, uint16_t Address, uint8_t Size) {
Wimpie 0:0f7bbfde44b7 119 uint8_t _ES; //store Endif Address , datastatus
Wimpie 0:0f7bbfde44b7 120 uint8_t B;
Wimpie 0:0f7bbfde44b7 121
Wimpie 0:0f7bbfde44b7 122 if (Address<_memsize) {
Wimpie 0:0f7bbfde44b7 123 uint8_t _TA1=(uint8_t)(Address & 0x00FF);
Wimpie 0:0f7bbfde44b7 124 uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8);
Wimpie 0:0f7bbfde44b7 125
Wimpie 0:0f7bbfde44b7 126 if ((Size<=PAGESIZE) and ((Size+Address)<=_memsize)) {
Wimpie 0:0f7bbfde44b7 127
Wimpie 0:0f7bbfde44b7 128 output.printf ("\r\nWriting to OneWireEEPROM %i Bytes",Size);
Wimpie 0:0f7bbfde44b7 129
Wimpie 0:0f7bbfde44b7 130 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 131 oneWire.writeByte(WRITESCRATCHPAD);
Wimpie 0:0f7bbfde44b7 132 oneWire.writeByte(_TA1); //begin address T7..T0
Wimpie 0:0f7bbfde44b7 133 oneWire.writeByte(_TA2); //begin address T15..T8
Wimpie 0:0f7bbfde44b7 134
Wimpie 0:0f7bbfde44b7 135 //write _memPage to scratchpad
Wimpie 0:0f7bbfde44b7 136
Wimpie 0:0f7bbfde44b7 137 for (int i = 0; i < Size; i++) {
Wimpie 0:0f7bbfde44b7 138 oneWire.writeByte(Source[i]);
Wimpie 0:0f7bbfde44b7 139 // pc_OneWireEEPROM.traceOut ("%X ",Source[i]);
Wimpie 0:0f7bbfde44b7 140 }
Wimpie 0:0f7bbfde44b7 141 // pc_OneWireEEPROM.traceOut ("\r\nTA1=%X",_TA1);
Wimpie 0:0f7bbfde44b7 142 // pc_OneWireEEPROM.traceOut ("\r\nTA2=%X\r\n",_TA2);
Wimpie 0:0f7bbfde44b7 143
Wimpie 0:0f7bbfde44b7 144 //read and check data in scratchpad
Wimpie 0:0f7bbfde44b7 145 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 146 oneWire.writeByte(READSCRATCHPAD);
Wimpie 0:0f7bbfde44b7 147 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 148 if (B != _TA1) { //check TA1, return if bad
Wimpie 0:0f7bbfde44b7 149 output.printf("\r\nWrite error in TA1 %X - %X\r\n",B,_TA1);
Wimpie 0:0f7bbfde44b7 150 return false;
Wimpie 0:0f7bbfde44b7 151 }
Wimpie 0:0f7bbfde44b7 152 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 153 if (B != _TA2) { //check TA2, return if bad
Wimpie 0:0f7bbfde44b7 154 output.printf("\r\nWrite error in TA2 %X - %X\r\n",B,_TA2);
Wimpie 0:0f7bbfde44b7 155 return false;
Wimpie 0:0f7bbfde44b7 156 }
Wimpie 0:0f7bbfde44b7 157 _ES = oneWire.readByte(); // ES Register
Wimpie 0:0f7bbfde44b7 158
Wimpie 0:0f7bbfde44b7 159 //check data written
Wimpie 0:0f7bbfde44b7 160 for (int i = 0; i < Size; i++) {
Wimpie 0:0f7bbfde44b7 161 B=oneWire.readByte();
Wimpie 0:0f7bbfde44b7 162 if (B != Source[i]) { //return if bad
Wimpie 0:0f7bbfde44b7 163 output.printf("\r\nWrite error in scratchpad on %i %X<->%X\r\n",i,B ,Source[i]);
Wimpie 0:0f7bbfde44b7 164 return false;
Wimpie 0:0f7bbfde44b7 165 }
Wimpie 0:0f7bbfde44b7 166 }
Wimpie 0:0f7bbfde44b7 167
Wimpie 0:0f7bbfde44b7 168 output.printf("\r\nES=%X\r\n",_ES);
Wimpie 0:0f7bbfde44b7 169
Wimpie 0:0f7bbfde44b7 170 //issue copy with auth data
Wimpie 0:0f7bbfde44b7 171 wait_ms(10);
Wimpie 0:0f7bbfde44b7 172 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 173 oneWire.writeByte(COPYSCRATCHPAD);
Wimpie 0:0f7bbfde44b7 174 oneWire.writeByte(_TA1);
Wimpie 0:0f7bbfde44b7 175 oneWire.writeByte(_TA2);
Wimpie 0:0f7bbfde44b7 176 oneWire.writeByte(_ES); //pull-up!
Wimpie 0:0f7bbfde44b7 177 wait_ms(10); //10ms min strong pullup delay -> time needed to copy from scratchpad to memory
Wimpie 0:0f7bbfde44b7 178
Wimpie 0:0f7bbfde44b7 179 oneWire.reset();
Wimpie 0:0f7bbfde44b7 180
Wimpie 0:0f7bbfde44b7 181 output.printf ("\r\nData written\r\n");
Wimpie 0:0f7bbfde44b7 182 return true;
Wimpie 0:0f7bbfde44b7 183 } else {
Wimpie 0:0f7bbfde44b7 184 output.printf ("\r\nTrying to write more then %i bytes-> %i\r\n",PAGESIZE,Size);
Wimpie 0:0f7bbfde44b7 185 return false;
Wimpie 0:0f7bbfde44b7 186 }
Wimpie 0:0f7bbfde44b7 187 } else {
Wimpie 0:0f7bbfde44b7 188 output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address);
Wimpie 0:0f7bbfde44b7 189 return false;
Wimpie 0:0f7bbfde44b7 190 }
Wimpie 0:0f7bbfde44b7 191 }
Wimpie 0:0f7bbfde44b7 192
Wimpie 0:0f7bbfde44b7 193
Wimpie 0:0f7bbfde44b7 194 int OneWireEEPROM::ReadMemory(uint8_t* Destination, uint16_t Address, uint16_t Size) {
Wimpie 0:0f7bbfde44b7 195 uint8_t tmpReader;
Wimpie 0:0f7bbfde44b7 196 bool readFF = 0;
Wimpie 0:0f7bbfde44b7 197 int memPtr;
Wimpie 0:0f7bbfde44b7 198
Wimpie 0:0f7bbfde44b7 199 if (Address<_memsize) {
Wimpie 0:0f7bbfde44b7 200
Wimpie 0:0f7bbfde44b7 201 uint8_t _TA1=(uint8_t)(Address & 0x00FF);
Wimpie 0:0f7bbfde44b7 202 uint8_t _TA2=(uint8_t)((Address & 0xFF00)>>8);
Wimpie 0:0f7bbfde44b7 203
Wimpie 0:0f7bbfde44b7 204 if ((Size+Address)<=_memsize) {
Wimpie 0:0f7bbfde44b7 205
Wimpie 0:0f7bbfde44b7 206 ResetAndAddress();
Wimpie 0:0f7bbfde44b7 207 oneWire.writeByte(READMEMORY);
Wimpie 0:0f7bbfde44b7 208 oneWire.writeByte(_TA1);
Wimpie 0:0f7bbfde44b7 209 oneWire.writeByte(_TA2);
Wimpie 0:0f7bbfde44b7 210
Wimpie 0:0f7bbfde44b7 211 output.printf ("\r\nReading... TA1=%X TA2=%X",_TA1, _TA2);
Wimpie 0:0f7bbfde44b7 212
Wimpie 0:0f7bbfde44b7 213 for (memPtr = 0; memPtr < Size; memPtr++) {
Wimpie 0:0f7bbfde44b7 214 tmpReader = oneWire.readByte();
Wimpie 0:0f7bbfde44b7 215 if (tmpReader == 0xff & !readFF)
Wimpie 0:0f7bbfde44b7 216 readFF = 1;
Wimpie 0:0f7bbfde44b7 217 else if (tmpReader == 0xff & readFF)
Wimpie 0:0f7bbfde44b7 218 // 0xff read twice, hopefully EoF as we break here :)
Wimpie 0:0f7bbfde44b7 219 break;
Wimpie 0:0f7bbfde44b7 220
Wimpie 0:0f7bbfde44b7 221 Destination[memPtr] = tmpReader;
Wimpie 0:0f7bbfde44b7 222 }
Wimpie 0:0f7bbfde44b7 223 output.printf ("-> %i byte(s)\r\n",memPtr);
Wimpie 0:0f7bbfde44b7 224 return memPtr;
Wimpie 0:0f7bbfde44b7 225
Wimpie 0:0f7bbfde44b7 226 } else {
Wimpie 0:0f7bbfde44b7 227 output.printf ("\r\nTrying to read outside MEMORY -> %i\r\n",Address+Size);
Wimpie 0:0f7bbfde44b7 228 return 0;
Wimpie 0:0f7bbfde44b7 229 }
Wimpie 0:0f7bbfde44b7 230 } else {
Wimpie 0:0f7bbfde44b7 231 output.printf ("\r\nAddress %X not available, EEPROM isn't that bigg..-> %i\r\n",Address);
Wimpie 0:0f7bbfde44b7 232 return 0;
Wimpie 0:0f7bbfde44b7 233 }
Wimpie 0:0f7bbfde44b7 234 }
Wimpie 0:0f7bbfde44b7 235
Wimpie 0:0f7bbfde44b7 236 void OneWireEEPROM::ShowMemory(int PageFrom, int PageTo) {
Wimpie 0:0f7bbfde44b7 237 int Size;
Wimpie 0:0f7bbfde44b7 238 if ((PageFrom>=0) and (PageFrom<_pages) and
Wimpie 0:0f7bbfde44b7 239 (PageTo>=0) and (PageTo<_pages)) {
Wimpie 0:0f7bbfde44b7 240
Wimpie 0:0f7bbfde44b7 241 uint8_t *MemAll = (uint8_t*) malloc(_memsize);
Wimpie 0:0f7bbfde44b7 242
Wimpie 0:0f7bbfde44b7 243 output.printf ("\r\nRead Page(s) from EEPROM\r\n");
Wimpie 0:0f7bbfde44b7 244
Wimpie 0:0f7bbfde44b7 245 Size=ReadMemory(MemAll,0x0000,_memsize);
Wimpie 0:0f7bbfde44b7 246
Wimpie 0:0f7bbfde44b7 247 for (int j=PageFrom;j<=PageTo;j++) {
Wimpie 0:0f7bbfde44b7 248 output.printf ("\r\nPage %2i ->",j);
Wimpie 0:0f7bbfde44b7 249 for (int i=0;i<PAGESIZE;i++) {
Wimpie 0:0f7bbfde44b7 250 if ((j*32+i)<= Size)
Wimpie 0:0f7bbfde44b7 251 output.printf("%2X ",MemAll[j*32+i]);
Wimpie 0:0f7bbfde44b7 252 }
Wimpie 0:0f7bbfde44b7 253 if ((j*32)>Size)
Wimpie 0:0f7bbfde44b7 254 break;
Wimpie 0:0f7bbfde44b7 255 }
Wimpie 0:0f7bbfde44b7 256 output.printf ("\r\n");
Wimpie 0:0f7bbfde44b7 257
Wimpie 0:0f7bbfde44b7 258 free(MemAll);
Wimpie 0:0f7bbfde44b7 259 }
Wimpie 0:0f7bbfde44b7 260 }
Wimpie 0:0f7bbfde44b7 261