1-Wire® library for mbed. Complete 1-Wire library that supports our silicon masters along with a bit-bang master on the MAX32600MBED platform with one common interface for mbed. Slave support has also been included and more slaves will be added as time permits.

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
IanBenzMaxim
Date:
Mon Jun 06 09:55:33 2016 -0500
Revision:
82:c11090a32471
Parent:
78:0cbbac7f2016
Child:
86:2ce08ca58b9e
Wrapped remaining bare data members in acessors.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 5:ce108eeb878d 1 /******************************************************************//**
j3 5:ce108eeb878d 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 5:ce108eeb878d 3 *
j3 5:ce108eeb878d 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 5:ce108eeb878d 5 * copy of this software and associated documentation files (the "Software"),
j3 5:ce108eeb878d 6 * to deal in the Software without restriction, including without limitation
j3 5:ce108eeb878d 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 5:ce108eeb878d 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 5:ce108eeb878d 9 * Software is furnished to do so, subject to the following conditions:
j3 5:ce108eeb878d 10 *
j3 5:ce108eeb878d 11 * The above copyright notice and this permission notice shall be included
j3 5:ce108eeb878d 12 * in all copies or substantial portions of the Software.
j3 5:ce108eeb878d 13 *
j3 5:ce108eeb878d 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 5:ce108eeb878d 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 5:ce108eeb878d 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 5:ce108eeb878d 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 5:ce108eeb878d 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 5:ce108eeb878d 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 5:ce108eeb878d 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 5:ce108eeb878d 21 *
j3 5:ce108eeb878d 22 * Except as contained in this notice, the name of Maxim Integrated
j3 5:ce108eeb878d 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 5:ce108eeb878d 24 * Products, Inc. Branding Policy.
j3 5:ce108eeb878d 25 *
j3 5:ce108eeb878d 26 * The mere transfer of this software does not imply any licenses
j3 5:ce108eeb878d 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 5:ce108eeb878d 28 * trademarks, maskwork rights, or any other form of intellectual
j3 5:ce108eeb878d 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 5:ce108eeb878d 30 * ownership rights.
j3 5:ce108eeb878d 31 **********************************************************************/
j3 5:ce108eeb878d 32
j3 15:f6cb0d906fb6 33 #include "OneWireMaster.h"
IanBenzMaxim 73:2cecc1372acc 34 #include "RomId.h"
IanBenzMaxim 82:c11090a32471 35 #include "crc.h"
IanBenzMaxim 27:d5aaefa252f1 36
IanBenzMaxim 76:84e6c4994e29 37 using OneWire::OneWireMaster;
IanBenzMaxim 82:c11090a32471 38 using namespace OneWire::crc;
j3 15:f6cb0d906fb6 39
IanBenzMaxim 77:529edb329ee0 40 enum OwRomCmd
IanBenzMaxim 77:529edb329ee0 41 {
IanBenzMaxim 77:529edb329ee0 42 ReadRomCmd = 0x33,
IanBenzMaxim 77:529edb329ee0 43 MatchRomCmd = 0x55,
IanBenzMaxim 77:529edb329ee0 44 SearchRomCmd = 0xF0,
IanBenzMaxim 77:529edb329ee0 45 SkipRomCmd = 0xCC,
IanBenzMaxim 77:529edb329ee0 46 ResumeCmd = 0xA5,
IanBenzMaxim 77:529edb329ee0 47 OverdriveSkipRomCmd = 0x3C,
IanBenzMaxim 77:529edb329ee0 48 OverdriveMatchRomCmd = 0x69
IanBenzMaxim 77:529edb329ee0 49 };
IanBenzMaxim 77:529edb329ee0 50
IanBenzMaxim 75:8b627804927c 51 OneWireMaster::CmdResult OneWireMaster::OWWriteBlock(const uint8_t *sendBuf, uint8_t sendLen)
IanBenzMaxim 71:562f5c702094 52 {
IanBenzMaxim 71:562f5c702094 53 CmdResult result;
IanBenzMaxim 74:23be10c32fa3 54
IanBenzMaxim 75:8b627804927c 55 for (uint8_t idx = 0; idx < sendLen; idx++)
IanBenzMaxim 71:562f5c702094 56 {
IanBenzMaxim 75:8b627804927c 57 result = OWWriteByte(sendBuf[idx]);
IanBenzMaxim 74:23be10c32fa3 58 if (result != Success)
IanBenzMaxim 71:562f5c702094 59 {
IanBenzMaxim 71:562f5c702094 60 break;
IanBenzMaxim 71:562f5c702094 61 }
IanBenzMaxim 71:562f5c702094 62 }
IanBenzMaxim 74:23be10c32fa3 63
IanBenzMaxim 71:562f5c702094 64 return result;
IanBenzMaxim 71:562f5c702094 65 }
IanBenzMaxim 71:562f5c702094 66
IanBenzMaxim 75:8b627804927c 67 OneWireMaster::CmdResult OneWireMaster::OWReadBlock(uint8_t *recvBuf, uint8_t recvLen)
IanBenzMaxim 71:562f5c702094 68 {
IanBenzMaxim 71:562f5c702094 69 CmdResult result;
IanBenzMaxim 74:23be10c32fa3 70
IanBenzMaxim 75:8b627804927c 71 for (uint8_t idx = 0; idx < recvLen; idx++)
IanBenzMaxim 71:562f5c702094 72 {
IanBenzMaxim 75:8b627804927c 73 result = OWReadByte(recvBuf[idx]);
IanBenzMaxim 74:23be10c32fa3 74 if (result != Success)
IanBenzMaxim 71:562f5c702094 75 {
IanBenzMaxim 71:562f5c702094 76 break;
IanBenzMaxim 71:562f5c702094 77 }
IanBenzMaxim 71:562f5c702094 78 }
IanBenzMaxim 74:23be10c32fa3 79
IanBenzMaxim 71:562f5c702094 80 return result;
IanBenzMaxim 71:562f5c702094 81 }
IanBenzMaxim 71:562f5c702094 82
IanBenzMaxim 75:8b627804927c 83 OneWireMaster::CmdResult OneWireMaster::OWTriplet(SearchDirection & searchDirection, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 32:bce180b544ed 84 {
IanBenzMaxim 32:bce180b544ed 85 CmdResult result;
IanBenzMaxim 32:bce180b544ed 86 result = OWReadBit(sbr);
IanBenzMaxim 32:bce180b544ed 87 if (result == Success)
IanBenzMaxim 74:23be10c32fa3 88 {
IanBenzMaxim 32:bce180b544ed 89 result = OWReadBit(tsb);
IanBenzMaxim 74:23be10c32fa3 90 }
IanBenzMaxim 32:bce180b544ed 91 if (result == Success)
IanBenzMaxim 32:bce180b544ed 92 {
IanBenzMaxim 57:1635f247ceae 93 if (sbr)
IanBenzMaxim 74:23be10c32fa3 94 {
IanBenzMaxim 75:8b627804927c 95 searchDirection = WriteOne;
IanBenzMaxim 74:23be10c32fa3 96 }
IanBenzMaxim 57:1635f247ceae 97 else if (tsb)
IanBenzMaxim 74:23be10c32fa3 98 {
IanBenzMaxim 75:8b627804927c 99 searchDirection = WriteZero;
IanBenzMaxim 74:23be10c32fa3 100 }
IanBenzMaxim 32:bce180b544ed 101 // else: use search_direction parameter
IanBenzMaxim 74:23be10c32fa3 102
IanBenzMaxim 75:8b627804927c 103 result = OWWriteBit((searchDirection == WriteOne) ? 1 : 0);
IanBenzMaxim 32:bce180b544ed 104 }
IanBenzMaxim 32:bce180b544ed 105 return result;
IanBenzMaxim 32:bce180b544ed 106 }
IanBenzMaxim 32:bce180b544ed 107
IanBenzMaxim 77:529edb329ee0 108 void OneWireMaster::SearchState::reset()
IanBenzMaxim 77:529edb329ee0 109 {
IanBenzMaxim 77:529edb329ee0 110 last_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 111 last_device_flag = false;
IanBenzMaxim 77:529edb329ee0 112 last_family_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 113 romId.reset();
IanBenzMaxim 77:529edb329ee0 114 }
IanBenzMaxim 77:529edb329ee0 115
IanBenzMaxim 77:529edb329ee0 116 void OneWireMaster::SearchState::findFamily(uint8_t familyCode)
IanBenzMaxim 77:529edb329ee0 117 {
IanBenzMaxim 77:529edb329ee0 118 reset();
IanBenzMaxim 77:529edb329ee0 119 romId.setFamilyCode(familyCode);
IanBenzMaxim 77:529edb329ee0 120 last_discrepancy = 64;
IanBenzMaxim 77:529edb329ee0 121 }
IanBenzMaxim 77:529edb329ee0 122
IanBenzMaxim 77:529edb329ee0 123 void OneWireMaster::SearchState::skipCurrentFamily()
IanBenzMaxim 77:529edb329ee0 124 {
IanBenzMaxim 77:529edb329ee0 125 // set the Last discrepancy to last family discrepancy
IanBenzMaxim 77:529edb329ee0 126 last_discrepancy = last_family_discrepancy;
IanBenzMaxim 77:529edb329ee0 127
IanBenzMaxim 77:529edb329ee0 128 // clear the last family discrpepancy
IanBenzMaxim 77:529edb329ee0 129 last_family_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 130
IanBenzMaxim 77:529edb329ee0 131 // check for end of list
IanBenzMaxim 77:529edb329ee0 132 if (last_discrepancy == 0)
IanBenzMaxim 77:529edb329ee0 133 {
IanBenzMaxim 77:529edb329ee0 134 last_device_flag = true;
IanBenzMaxim 77:529edb329ee0 135 }
IanBenzMaxim 77:529edb329ee0 136 }
IanBenzMaxim 77:529edb329ee0 137
IanBenzMaxim 77:529edb329ee0 138 OneWireMaster::CmdResult OneWireMaster::OWFirst(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 139 {
IanBenzMaxim 77:529edb329ee0 140 // Reset and begin a new search
IanBenzMaxim 77:529edb329ee0 141 searchState.reset();
IanBenzMaxim 77:529edb329ee0 142 return OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 143 }
IanBenzMaxim 77:529edb329ee0 144
IanBenzMaxim 77:529edb329ee0 145 OneWireMaster::CmdResult OneWireMaster::OWNext(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 146 {
IanBenzMaxim 77:529edb329ee0 147 // Continue the previous search
IanBenzMaxim 77:529edb329ee0 148 return OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 149 }
IanBenzMaxim 77:529edb329ee0 150
IanBenzMaxim 77:529edb329ee0 151 OneWireMaster::CmdResult OneWireMaster::OWVerify(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 152 {
IanBenzMaxim 77:529edb329ee0 153 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 154 SearchState searchState;
IanBenzMaxim 77:529edb329ee0 155
IanBenzMaxim 77:529edb329ee0 156 searchState.romId = romId;
IanBenzMaxim 77:529edb329ee0 157
IanBenzMaxim 77:529edb329ee0 158 // set search to find the same device
IanBenzMaxim 77:529edb329ee0 159 searchState.last_discrepancy = 64;
IanBenzMaxim 77:529edb329ee0 160 searchState.last_device_flag = false;
IanBenzMaxim 77:529edb329ee0 161
IanBenzMaxim 77:529edb329ee0 162 result = OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 163 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 164 {
IanBenzMaxim 77:529edb329ee0 165 // check if same device found
IanBenzMaxim 77:529edb329ee0 166 if (romId != searchState.romId)
IanBenzMaxim 77:529edb329ee0 167 {
IanBenzMaxim 77:529edb329ee0 168 result = OneWireMaster::OperationFailure;
IanBenzMaxim 77:529edb329ee0 169 }
IanBenzMaxim 77:529edb329ee0 170 }
IanBenzMaxim 77:529edb329ee0 171
IanBenzMaxim 77:529edb329ee0 172 return result;
IanBenzMaxim 77:529edb329ee0 173 }
IanBenzMaxim 77:529edb329ee0 174
IanBenzMaxim 77:529edb329ee0 175 OneWireMaster::CmdResult OneWireMaster::OWReadRom(RomId & romId)
IanBenzMaxim 77:529edb329ee0 176 {
IanBenzMaxim 77:529edb329ee0 177 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 178 RomId readId;
IanBenzMaxim 77:529edb329ee0 179
IanBenzMaxim 77:529edb329ee0 180 result = OWReset();
IanBenzMaxim 77:529edb329ee0 181 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 182 {
IanBenzMaxim 77:529edb329ee0 183 result = OWWriteByte(ReadRomCmd);
IanBenzMaxim 77:529edb329ee0 184 }
IanBenzMaxim 77:529edb329ee0 185
IanBenzMaxim 77:529edb329ee0 186 // read the ROM
IanBenzMaxim 77:529edb329ee0 187 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 188 {
IanBenzMaxim 77:529edb329ee0 189 result = OWReadBlock(readId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 190 }
IanBenzMaxim 77:529edb329ee0 191
IanBenzMaxim 77:529edb329ee0 192 // verify CRC8
IanBenzMaxim 77:529edb329ee0 193 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 194 {
IanBenzMaxim 77:529edb329ee0 195 if (readId.crc8Valid())
IanBenzMaxim 77:529edb329ee0 196 {
IanBenzMaxim 77:529edb329ee0 197 romId = readId;
IanBenzMaxim 77:529edb329ee0 198 }
IanBenzMaxim 77:529edb329ee0 199 else
IanBenzMaxim 77:529edb329ee0 200 {
IanBenzMaxim 77:529edb329ee0 201 result = OneWireMaster::OperationFailure;
IanBenzMaxim 77:529edb329ee0 202 }
IanBenzMaxim 77:529edb329ee0 203 }
IanBenzMaxim 77:529edb329ee0 204
IanBenzMaxim 77:529edb329ee0 205 return result;
IanBenzMaxim 77:529edb329ee0 206 }
IanBenzMaxim 77:529edb329ee0 207
IanBenzMaxim 77:529edb329ee0 208 OneWireMaster::CmdResult OneWireMaster::OWSkipRom()
IanBenzMaxim 77:529edb329ee0 209 {
IanBenzMaxim 77:529edb329ee0 210 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 211
IanBenzMaxim 77:529edb329ee0 212 result = OWReset();
IanBenzMaxim 77:529edb329ee0 213 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 214 {
IanBenzMaxim 77:529edb329ee0 215 result = OWWriteByte(SkipRomCmd);
IanBenzMaxim 77:529edb329ee0 216 }
IanBenzMaxim 77:529edb329ee0 217
IanBenzMaxim 77:529edb329ee0 218 return result;
IanBenzMaxim 77:529edb329ee0 219 }
IanBenzMaxim 77:529edb329ee0 220
IanBenzMaxim 77:529edb329ee0 221 OneWireMaster::CmdResult OneWireMaster::OWMatchRom(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 222 {
IanBenzMaxim 77:529edb329ee0 223 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 224
IanBenzMaxim 77:529edb329ee0 225 uint8_t buf[1 + RomId::byteLen];
IanBenzMaxim 77:529edb329ee0 226
IanBenzMaxim 77:529edb329ee0 227 // use MatchROM
IanBenzMaxim 77:529edb329ee0 228 result = OWReset();
IanBenzMaxim 77:529edb329ee0 229 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 230 {
IanBenzMaxim 77:529edb329ee0 231 buf[0] = MatchRomCmd;
IanBenzMaxim 77:529edb329ee0 232 std::memcpy(&buf[1], romId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 233 // send command and rom
IanBenzMaxim 77:529edb329ee0 234 result = OWWriteBlock(buf, 1 + RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 235 }
IanBenzMaxim 77:529edb329ee0 236
IanBenzMaxim 77:529edb329ee0 237 return result;
IanBenzMaxim 77:529edb329ee0 238 }
IanBenzMaxim 77:529edb329ee0 239
IanBenzMaxim 77:529edb329ee0 240 OneWireMaster::CmdResult OneWireMaster::OWOverdriveSkipRom()
IanBenzMaxim 77:529edb329ee0 241 {
IanBenzMaxim 77:529edb329ee0 242 OneWireMaster::CmdResult result = OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 77:529edb329ee0 243
IanBenzMaxim 77:529edb329ee0 244 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 245 {
IanBenzMaxim 77:529edb329ee0 246 result = OWReset();
IanBenzMaxim 77:529edb329ee0 247 }
IanBenzMaxim 77:529edb329ee0 248
IanBenzMaxim 77:529edb329ee0 249 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 250 {
IanBenzMaxim 77:529edb329ee0 251 result = OWWriteByte(OverdriveSkipRomCmd);
IanBenzMaxim 77:529edb329ee0 252 }
IanBenzMaxim 77:529edb329ee0 253
IanBenzMaxim 77:529edb329ee0 254 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 255 {
IanBenzMaxim 77:529edb329ee0 256 result = OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 77:529edb329ee0 257 }
IanBenzMaxim 77:529edb329ee0 258
IanBenzMaxim 77:529edb329ee0 259 return result;
IanBenzMaxim 77:529edb329ee0 260 }
IanBenzMaxim 77:529edb329ee0 261
IanBenzMaxim 77:529edb329ee0 262 OneWireMaster::CmdResult OneWireMaster::OWOverdriveMatchRom(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 263 {
IanBenzMaxim 77:529edb329ee0 264 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 265
IanBenzMaxim 77:529edb329ee0 266 // use overdrive MatchROM
IanBenzMaxim 77:529edb329ee0 267 OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 77:529edb329ee0 268
IanBenzMaxim 77:529edb329ee0 269 result = OWReset();
IanBenzMaxim 77:529edb329ee0 270 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 271 {
IanBenzMaxim 77:529edb329ee0 272 result = OWWriteByte(OverdriveMatchRomCmd);
IanBenzMaxim 77:529edb329ee0 273 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 274 {
IanBenzMaxim 77:529edb329ee0 275 OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 77:529edb329ee0 276 // send ROM
IanBenzMaxim 77:529edb329ee0 277 result = OWWriteBlock(romId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 278 }
IanBenzMaxim 77:529edb329ee0 279 }
IanBenzMaxim 77:529edb329ee0 280 return result;
IanBenzMaxim 77:529edb329ee0 281 }
IanBenzMaxim 77:529edb329ee0 282
IanBenzMaxim 77:529edb329ee0 283 OneWireMaster::CmdResult OneWireMaster::OWResume()
IanBenzMaxim 77:529edb329ee0 284 {
IanBenzMaxim 77:529edb329ee0 285 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 286
IanBenzMaxim 77:529edb329ee0 287 result = OWReset();
IanBenzMaxim 77:529edb329ee0 288 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 289 {
IanBenzMaxim 77:529edb329ee0 290 result = OWWriteByte(ResumeCmd);
IanBenzMaxim 77:529edb329ee0 291 }
IanBenzMaxim 77:529edb329ee0 292
IanBenzMaxim 77:529edb329ee0 293 return result;
IanBenzMaxim 77:529edb329ee0 294 }
IanBenzMaxim 77:529edb329ee0 295
IanBenzMaxim 77:529edb329ee0 296 OneWireMaster::CmdResult OneWireMaster::OWSearch(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 297 {
IanBenzMaxim 77:529edb329ee0 298 uint8_t id_bit_number;
IanBenzMaxim 77:529edb329ee0 299 uint8_t last_zero, rom_byte_number;
IanBenzMaxim 77:529edb329ee0 300 uint8_t id_bit, cmp_id_bit;
IanBenzMaxim 77:529edb329ee0 301 uint8_t rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 302 bool search_result;
IanBenzMaxim 77:529edb329ee0 303 uint8_t crc8 = 0;
IanBenzMaxim 77:529edb329ee0 304 OneWireMaster::SearchDirection search_direction;
IanBenzMaxim 77:529edb329ee0 305
IanBenzMaxim 77:529edb329ee0 306 // initialize for search
IanBenzMaxim 77:529edb329ee0 307 id_bit_number = 1;
IanBenzMaxim 77:529edb329ee0 308 last_zero = 0;
IanBenzMaxim 77:529edb329ee0 309 rom_byte_number = 0;
IanBenzMaxim 77:529edb329ee0 310 rom_byte_mask = 1;
IanBenzMaxim 77:529edb329ee0 311 search_result = false;
IanBenzMaxim 77:529edb329ee0 312
IanBenzMaxim 77:529edb329ee0 313 // if the last call was not the last one
IanBenzMaxim 77:529edb329ee0 314 if (!searchState.last_device_flag)
IanBenzMaxim 77:529edb329ee0 315 {
IanBenzMaxim 77:529edb329ee0 316 // 1-Wire reset
IanBenzMaxim 77:529edb329ee0 317 OneWireMaster::CmdResult result = OWReset();
IanBenzMaxim 77:529edb329ee0 318 if (result != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 319 {
IanBenzMaxim 77:529edb329ee0 320 // reset the search
IanBenzMaxim 77:529edb329ee0 321 searchState.reset();
IanBenzMaxim 77:529edb329ee0 322 return result;
IanBenzMaxim 77:529edb329ee0 323 }
IanBenzMaxim 77:529edb329ee0 324
IanBenzMaxim 77:529edb329ee0 325 // issue the search command
IanBenzMaxim 77:529edb329ee0 326 OWWriteByte(SearchRomCmd);
IanBenzMaxim 77:529edb329ee0 327
IanBenzMaxim 77:529edb329ee0 328 // loop to do the search
IanBenzMaxim 77:529edb329ee0 329 do
IanBenzMaxim 77:529edb329ee0 330 {
IanBenzMaxim 77:529edb329ee0 331 // if this discrepancy if before the Last Discrepancy
IanBenzMaxim 77:529edb329ee0 332 // on a previous next then pick the same as last time
IanBenzMaxim 77:529edb329ee0 333 if (id_bit_number < searchState.last_discrepancy)
IanBenzMaxim 77:529edb329ee0 334 {
IanBenzMaxim 77:529edb329ee0 335 if ((searchState.romId[rom_byte_number] & rom_byte_mask) > 0)
IanBenzMaxim 77:529edb329ee0 336 {
IanBenzMaxim 77:529edb329ee0 337 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 77:529edb329ee0 338 }
IanBenzMaxim 77:529edb329ee0 339 else
IanBenzMaxim 77:529edb329ee0 340 {
IanBenzMaxim 77:529edb329ee0 341 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 77:529edb329ee0 342 }
IanBenzMaxim 77:529edb329ee0 343 }
IanBenzMaxim 77:529edb329ee0 344 else
IanBenzMaxim 77:529edb329ee0 345 {
IanBenzMaxim 77:529edb329ee0 346 // if equal to last pick 1, if not then pick 0
IanBenzMaxim 77:529edb329ee0 347 if (id_bit_number == searchState.last_discrepancy)
IanBenzMaxim 77:529edb329ee0 348 {
IanBenzMaxim 77:529edb329ee0 349 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 77:529edb329ee0 350 }
IanBenzMaxim 77:529edb329ee0 351 else
IanBenzMaxim 77:529edb329ee0 352 {
IanBenzMaxim 77:529edb329ee0 353 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 77:529edb329ee0 354 }
IanBenzMaxim 77:529edb329ee0 355 }
IanBenzMaxim 77:529edb329ee0 356
IanBenzMaxim 77:529edb329ee0 357 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
IanBenzMaxim 77:529edb329ee0 358 result = OWTriplet(search_direction, id_bit, cmp_id_bit);
IanBenzMaxim 77:529edb329ee0 359 if (result != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 360 {
IanBenzMaxim 77:529edb329ee0 361 return result;
IanBenzMaxim 77:529edb329ee0 362 }
IanBenzMaxim 77:529edb329ee0 363
IanBenzMaxim 77:529edb329ee0 364 // check for no devices on 1-wire
IanBenzMaxim 77:529edb329ee0 365 if (id_bit && cmp_id_bit)
IanBenzMaxim 77:529edb329ee0 366 {
IanBenzMaxim 77:529edb329ee0 367 break;
IanBenzMaxim 77:529edb329ee0 368 }
IanBenzMaxim 77:529edb329ee0 369 else
IanBenzMaxim 77:529edb329ee0 370 {
IanBenzMaxim 77:529edb329ee0 371 if (!id_bit && !cmp_id_bit && (search_direction == OneWireMaster::WriteZero))
IanBenzMaxim 77:529edb329ee0 372 {
IanBenzMaxim 77:529edb329ee0 373 last_zero = id_bit_number;
IanBenzMaxim 77:529edb329ee0 374
IanBenzMaxim 77:529edb329ee0 375 // check for Last discrepancy in family
IanBenzMaxim 77:529edb329ee0 376 if (last_zero < 9)
IanBenzMaxim 77:529edb329ee0 377 {
IanBenzMaxim 77:529edb329ee0 378 searchState.last_family_discrepancy = last_zero;
IanBenzMaxim 77:529edb329ee0 379 }
IanBenzMaxim 77:529edb329ee0 380 }
IanBenzMaxim 77:529edb329ee0 381
IanBenzMaxim 77:529edb329ee0 382 // set or clear the bit in the ROM byte rom_byte_number
IanBenzMaxim 77:529edb329ee0 383 // with mask rom_byte_mask
IanBenzMaxim 77:529edb329ee0 384 if (search_direction == OneWireMaster::WriteOne)
IanBenzMaxim 77:529edb329ee0 385 {
IanBenzMaxim 77:529edb329ee0 386 searchState.romId[rom_byte_number] |= rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 387 }
IanBenzMaxim 77:529edb329ee0 388 else
IanBenzMaxim 77:529edb329ee0 389 {
IanBenzMaxim 77:529edb329ee0 390 searchState.romId[rom_byte_number] &= (uint8_t)~rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 391 }
IanBenzMaxim 77:529edb329ee0 392
IanBenzMaxim 77:529edb329ee0 393 // increment the byte counter id_bit_number
IanBenzMaxim 77:529edb329ee0 394 // and shift the mask rom_byte_mask
IanBenzMaxim 77:529edb329ee0 395 id_bit_number++;
IanBenzMaxim 77:529edb329ee0 396 rom_byte_mask <<= 1;
IanBenzMaxim 77:529edb329ee0 397
IanBenzMaxim 77:529edb329ee0 398 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
IanBenzMaxim 77:529edb329ee0 399 if (rom_byte_mask == 0)
IanBenzMaxim 77:529edb329ee0 400 {
IanBenzMaxim 82:c11090a32471 401 crc8 = calculateCrc8(crc8, searchState.romId[rom_byte_number]); // accumulate the CRC
IanBenzMaxim 77:529edb329ee0 402 rom_byte_number++;
IanBenzMaxim 77:529edb329ee0 403 rom_byte_mask = 1;
IanBenzMaxim 77:529edb329ee0 404 }
IanBenzMaxim 77:529edb329ee0 405 }
IanBenzMaxim 77:529edb329ee0 406 } while (rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7
IanBenzMaxim 77:529edb329ee0 407
IanBenzMaxim 77:529edb329ee0 408 // if the search was successful then
IanBenzMaxim 77:529edb329ee0 409 if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0)))
IanBenzMaxim 77:529edb329ee0 410 {
IanBenzMaxim 77:529edb329ee0 411 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
IanBenzMaxim 77:529edb329ee0 412 searchState.last_discrepancy = last_zero;
IanBenzMaxim 77:529edb329ee0 413
IanBenzMaxim 77:529edb329ee0 414 // check for last device
IanBenzMaxim 77:529edb329ee0 415 if (searchState.last_discrepancy == 0)
IanBenzMaxim 77:529edb329ee0 416 {
IanBenzMaxim 77:529edb329ee0 417 searchState.last_device_flag = true;
IanBenzMaxim 77:529edb329ee0 418 }
IanBenzMaxim 77:529edb329ee0 419
IanBenzMaxim 77:529edb329ee0 420 search_result = true;
IanBenzMaxim 77:529edb329ee0 421 }
IanBenzMaxim 77:529edb329ee0 422 }
IanBenzMaxim 77:529edb329ee0 423
IanBenzMaxim 77:529edb329ee0 424 // if no device found then reset counters so next 'search' will be like a first
IanBenzMaxim 77:529edb329ee0 425 if (!search_result || (searchState.romId.familyCode() == 0))
IanBenzMaxim 77:529edb329ee0 426 {
IanBenzMaxim 77:529edb329ee0 427 searchState.reset();
IanBenzMaxim 77:529edb329ee0 428 search_result = false;
IanBenzMaxim 77:529edb329ee0 429 }
IanBenzMaxim 77:529edb329ee0 430
IanBenzMaxim 77:529edb329ee0 431 return (search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure);
IanBenzMaxim 77:529edb329ee0 432 }