Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Wed Jun 15 15:00:06 2016 -0500
Revision:
86:2ce08ca58b9e
Parent:
82:c11090a32471
Child:
90:c233d1c265ff
Updated to match new directory structure.

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 86:2ce08ca58b9e 34 #include "Utilities/crc.h"
IanBenzMaxim 27:d5aaefa252f1 35
IanBenzMaxim 76:84e6c4994e29 36 using OneWire::OneWireMaster;
IanBenzMaxim 82:c11090a32471 37 using namespace OneWire::crc;
j3 15:f6cb0d906fb6 38
IanBenzMaxim 77:529edb329ee0 39 enum OwRomCmd
IanBenzMaxim 77:529edb329ee0 40 {
IanBenzMaxim 77:529edb329ee0 41 ReadRomCmd = 0x33,
IanBenzMaxim 77:529edb329ee0 42 MatchRomCmd = 0x55,
IanBenzMaxim 77:529edb329ee0 43 SearchRomCmd = 0xF0,
IanBenzMaxim 77:529edb329ee0 44 SkipRomCmd = 0xCC,
IanBenzMaxim 77:529edb329ee0 45 ResumeCmd = 0xA5,
IanBenzMaxim 77:529edb329ee0 46 OverdriveSkipRomCmd = 0x3C,
IanBenzMaxim 77:529edb329ee0 47 OverdriveMatchRomCmd = 0x69
IanBenzMaxim 77:529edb329ee0 48 };
IanBenzMaxim 77:529edb329ee0 49
IanBenzMaxim 75:8b627804927c 50 OneWireMaster::CmdResult OneWireMaster::OWWriteBlock(const uint8_t *sendBuf, uint8_t sendLen)
IanBenzMaxim 71:562f5c702094 51 {
IanBenzMaxim 71:562f5c702094 52 CmdResult result;
IanBenzMaxim 74:23be10c32fa3 53
IanBenzMaxim 75:8b627804927c 54 for (uint8_t idx = 0; idx < sendLen; idx++)
IanBenzMaxim 71:562f5c702094 55 {
IanBenzMaxim 75:8b627804927c 56 result = OWWriteByte(sendBuf[idx]);
IanBenzMaxim 74:23be10c32fa3 57 if (result != Success)
IanBenzMaxim 71:562f5c702094 58 {
IanBenzMaxim 71:562f5c702094 59 break;
IanBenzMaxim 71:562f5c702094 60 }
IanBenzMaxim 71:562f5c702094 61 }
IanBenzMaxim 74:23be10c32fa3 62
IanBenzMaxim 71:562f5c702094 63 return result;
IanBenzMaxim 71:562f5c702094 64 }
IanBenzMaxim 71:562f5c702094 65
IanBenzMaxim 75:8b627804927c 66 OneWireMaster::CmdResult OneWireMaster::OWReadBlock(uint8_t *recvBuf, uint8_t recvLen)
IanBenzMaxim 71:562f5c702094 67 {
IanBenzMaxim 71:562f5c702094 68 CmdResult result;
IanBenzMaxim 74:23be10c32fa3 69
IanBenzMaxim 75:8b627804927c 70 for (uint8_t idx = 0; idx < recvLen; idx++)
IanBenzMaxim 71:562f5c702094 71 {
IanBenzMaxim 75:8b627804927c 72 result = OWReadByte(recvBuf[idx]);
IanBenzMaxim 74:23be10c32fa3 73 if (result != Success)
IanBenzMaxim 71:562f5c702094 74 {
IanBenzMaxim 71:562f5c702094 75 break;
IanBenzMaxim 71:562f5c702094 76 }
IanBenzMaxim 71:562f5c702094 77 }
IanBenzMaxim 74:23be10c32fa3 78
IanBenzMaxim 71:562f5c702094 79 return result;
IanBenzMaxim 71:562f5c702094 80 }
IanBenzMaxim 71:562f5c702094 81
IanBenzMaxim 75:8b627804927c 82 OneWireMaster::CmdResult OneWireMaster::OWTriplet(SearchDirection & searchDirection, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 32:bce180b544ed 83 {
IanBenzMaxim 32:bce180b544ed 84 CmdResult result;
IanBenzMaxim 32:bce180b544ed 85 result = OWReadBit(sbr);
IanBenzMaxim 32:bce180b544ed 86 if (result == Success)
IanBenzMaxim 74:23be10c32fa3 87 {
IanBenzMaxim 32:bce180b544ed 88 result = OWReadBit(tsb);
IanBenzMaxim 74:23be10c32fa3 89 }
IanBenzMaxim 32:bce180b544ed 90 if (result == Success)
IanBenzMaxim 32:bce180b544ed 91 {
IanBenzMaxim 57:1635f247ceae 92 if (sbr)
IanBenzMaxim 74:23be10c32fa3 93 {
IanBenzMaxim 75:8b627804927c 94 searchDirection = WriteOne;
IanBenzMaxim 74:23be10c32fa3 95 }
IanBenzMaxim 57:1635f247ceae 96 else if (tsb)
IanBenzMaxim 74:23be10c32fa3 97 {
IanBenzMaxim 75:8b627804927c 98 searchDirection = WriteZero;
IanBenzMaxim 74:23be10c32fa3 99 }
IanBenzMaxim 32:bce180b544ed 100 // else: use search_direction parameter
IanBenzMaxim 74:23be10c32fa3 101
IanBenzMaxim 75:8b627804927c 102 result = OWWriteBit((searchDirection == WriteOne) ? 1 : 0);
IanBenzMaxim 32:bce180b544ed 103 }
IanBenzMaxim 32:bce180b544ed 104 return result;
IanBenzMaxim 32:bce180b544ed 105 }
IanBenzMaxim 32:bce180b544ed 106
IanBenzMaxim 77:529edb329ee0 107 void OneWireMaster::SearchState::reset()
IanBenzMaxim 77:529edb329ee0 108 {
IanBenzMaxim 77:529edb329ee0 109 last_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 110 last_device_flag = false;
IanBenzMaxim 77:529edb329ee0 111 last_family_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 112 romId.reset();
IanBenzMaxim 77:529edb329ee0 113 }
IanBenzMaxim 77:529edb329ee0 114
IanBenzMaxim 77:529edb329ee0 115 void OneWireMaster::SearchState::findFamily(uint8_t familyCode)
IanBenzMaxim 77:529edb329ee0 116 {
IanBenzMaxim 77:529edb329ee0 117 reset();
IanBenzMaxim 77:529edb329ee0 118 romId.setFamilyCode(familyCode);
IanBenzMaxim 77:529edb329ee0 119 last_discrepancy = 64;
IanBenzMaxim 77:529edb329ee0 120 }
IanBenzMaxim 77:529edb329ee0 121
IanBenzMaxim 77:529edb329ee0 122 void OneWireMaster::SearchState::skipCurrentFamily()
IanBenzMaxim 77:529edb329ee0 123 {
IanBenzMaxim 77:529edb329ee0 124 // set the Last discrepancy to last family discrepancy
IanBenzMaxim 77:529edb329ee0 125 last_discrepancy = last_family_discrepancy;
IanBenzMaxim 77:529edb329ee0 126
IanBenzMaxim 77:529edb329ee0 127 // clear the last family discrpepancy
IanBenzMaxim 77:529edb329ee0 128 last_family_discrepancy = 0;
IanBenzMaxim 77:529edb329ee0 129
IanBenzMaxim 77:529edb329ee0 130 // check for end of list
IanBenzMaxim 77:529edb329ee0 131 if (last_discrepancy == 0)
IanBenzMaxim 77:529edb329ee0 132 {
IanBenzMaxim 77:529edb329ee0 133 last_device_flag = true;
IanBenzMaxim 77:529edb329ee0 134 }
IanBenzMaxim 77:529edb329ee0 135 }
IanBenzMaxim 77:529edb329ee0 136
IanBenzMaxim 77:529edb329ee0 137 OneWireMaster::CmdResult OneWireMaster::OWFirst(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 138 {
IanBenzMaxim 77:529edb329ee0 139 // Reset and begin a new search
IanBenzMaxim 77:529edb329ee0 140 searchState.reset();
IanBenzMaxim 77:529edb329ee0 141 return OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 142 }
IanBenzMaxim 77:529edb329ee0 143
IanBenzMaxim 77:529edb329ee0 144 OneWireMaster::CmdResult OneWireMaster::OWNext(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 145 {
IanBenzMaxim 77:529edb329ee0 146 // Continue the previous search
IanBenzMaxim 77:529edb329ee0 147 return OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 148 }
IanBenzMaxim 77:529edb329ee0 149
IanBenzMaxim 77:529edb329ee0 150 OneWireMaster::CmdResult OneWireMaster::OWVerify(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 151 {
IanBenzMaxim 77:529edb329ee0 152 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 153 SearchState searchState;
IanBenzMaxim 77:529edb329ee0 154
IanBenzMaxim 77:529edb329ee0 155 searchState.romId = romId;
IanBenzMaxim 77:529edb329ee0 156
IanBenzMaxim 77:529edb329ee0 157 // set search to find the same device
IanBenzMaxim 77:529edb329ee0 158 searchState.last_discrepancy = 64;
IanBenzMaxim 77:529edb329ee0 159 searchState.last_device_flag = false;
IanBenzMaxim 77:529edb329ee0 160
IanBenzMaxim 77:529edb329ee0 161 result = OWSearch(searchState);
IanBenzMaxim 77:529edb329ee0 162 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 163 {
IanBenzMaxim 77:529edb329ee0 164 // check if same device found
IanBenzMaxim 77:529edb329ee0 165 if (romId != searchState.romId)
IanBenzMaxim 77:529edb329ee0 166 {
IanBenzMaxim 77:529edb329ee0 167 result = OneWireMaster::OperationFailure;
IanBenzMaxim 77:529edb329ee0 168 }
IanBenzMaxim 77:529edb329ee0 169 }
IanBenzMaxim 77:529edb329ee0 170
IanBenzMaxim 77:529edb329ee0 171 return result;
IanBenzMaxim 77:529edb329ee0 172 }
IanBenzMaxim 77:529edb329ee0 173
IanBenzMaxim 77:529edb329ee0 174 OneWireMaster::CmdResult OneWireMaster::OWReadRom(RomId & romId)
IanBenzMaxim 77:529edb329ee0 175 {
IanBenzMaxim 77:529edb329ee0 176 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 177 RomId readId;
IanBenzMaxim 77:529edb329ee0 178
IanBenzMaxim 77:529edb329ee0 179 result = OWReset();
IanBenzMaxim 77:529edb329ee0 180 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 181 {
IanBenzMaxim 77:529edb329ee0 182 result = OWWriteByte(ReadRomCmd);
IanBenzMaxim 77:529edb329ee0 183 }
IanBenzMaxim 77:529edb329ee0 184
IanBenzMaxim 77:529edb329ee0 185 // read the ROM
IanBenzMaxim 77:529edb329ee0 186 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 187 {
IanBenzMaxim 77:529edb329ee0 188 result = OWReadBlock(readId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 189 }
IanBenzMaxim 77:529edb329ee0 190
IanBenzMaxim 77:529edb329ee0 191 // verify CRC8
IanBenzMaxim 77:529edb329ee0 192 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 193 {
IanBenzMaxim 77:529edb329ee0 194 if (readId.crc8Valid())
IanBenzMaxim 77:529edb329ee0 195 {
IanBenzMaxim 77:529edb329ee0 196 romId = readId;
IanBenzMaxim 77:529edb329ee0 197 }
IanBenzMaxim 77:529edb329ee0 198 else
IanBenzMaxim 77:529edb329ee0 199 {
IanBenzMaxim 77:529edb329ee0 200 result = OneWireMaster::OperationFailure;
IanBenzMaxim 77:529edb329ee0 201 }
IanBenzMaxim 77:529edb329ee0 202 }
IanBenzMaxim 77:529edb329ee0 203
IanBenzMaxim 77:529edb329ee0 204 return result;
IanBenzMaxim 77:529edb329ee0 205 }
IanBenzMaxim 77:529edb329ee0 206
IanBenzMaxim 77:529edb329ee0 207 OneWireMaster::CmdResult OneWireMaster::OWSkipRom()
IanBenzMaxim 77:529edb329ee0 208 {
IanBenzMaxim 77:529edb329ee0 209 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 210
IanBenzMaxim 77:529edb329ee0 211 result = OWReset();
IanBenzMaxim 77:529edb329ee0 212 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 213 {
IanBenzMaxim 77:529edb329ee0 214 result = OWWriteByte(SkipRomCmd);
IanBenzMaxim 77:529edb329ee0 215 }
IanBenzMaxim 77:529edb329ee0 216
IanBenzMaxim 77:529edb329ee0 217 return result;
IanBenzMaxim 77:529edb329ee0 218 }
IanBenzMaxim 77:529edb329ee0 219
IanBenzMaxim 77:529edb329ee0 220 OneWireMaster::CmdResult OneWireMaster::OWMatchRom(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 221 {
IanBenzMaxim 77:529edb329ee0 222 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 223
IanBenzMaxim 77:529edb329ee0 224 uint8_t buf[1 + RomId::byteLen];
IanBenzMaxim 77:529edb329ee0 225
IanBenzMaxim 77:529edb329ee0 226 // use MatchROM
IanBenzMaxim 77:529edb329ee0 227 result = OWReset();
IanBenzMaxim 77:529edb329ee0 228 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 229 {
IanBenzMaxim 77:529edb329ee0 230 buf[0] = MatchRomCmd;
IanBenzMaxim 77:529edb329ee0 231 std::memcpy(&buf[1], romId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 232 // send command and rom
IanBenzMaxim 77:529edb329ee0 233 result = OWWriteBlock(buf, 1 + RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 234 }
IanBenzMaxim 77:529edb329ee0 235
IanBenzMaxim 77:529edb329ee0 236 return result;
IanBenzMaxim 77:529edb329ee0 237 }
IanBenzMaxim 77:529edb329ee0 238
IanBenzMaxim 77:529edb329ee0 239 OneWireMaster::CmdResult OneWireMaster::OWOverdriveSkipRom()
IanBenzMaxim 77:529edb329ee0 240 {
IanBenzMaxim 77:529edb329ee0 241 OneWireMaster::CmdResult result = OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 77:529edb329ee0 242
IanBenzMaxim 77:529edb329ee0 243 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 244 {
IanBenzMaxim 77:529edb329ee0 245 result = OWReset();
IanBenzMaxim 77:529edb329ee0 246 }
IanBenzMaxim 77:529edb329ee0 247
IanBenzMaxim 77:529edb329ee0 248 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 249 {
IanBenzMaxim 77:529edb329ee0 250 result = OWWriteByte(OverdriveSkipRomCmd);
IanBenzMaxim 77:529edb329ee0 251 }
IanBenzMaxim 77:529edb329ee0 252
IanBenzMaxim 77:529edb329ee0 253 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 254 {
IanBenzMaxim 77:529edb329ee0 255 result = OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 77:529edb329ee0 256 }
IanBenzMaxim 77:529edb329ee0 257
IanBenzMaxim 77:529edb329ee0 258 return result;
IanBenzMaxim 77:529edb329ee0 259 }
IanBenzMaxim 77:529edb329ee0 260
IanBenzMaxim 77:529edb329ee0 261 OneWireMaster::CmdResult OneWireMaster::OWOverdriveMatchRom(const RomId & romId)
IanBenzMaxim 77:529edb329ee0 262 {
IanBenzMaxim 77:529edb329ee0 263 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 264
IanBenzMaxim 77:529edb329ee0 265 // use overdrive MatchROM
IanBenzMaxim 77:529edb329ee0 266 OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 77:529edb329ee0 267
IanBenzMaxim 77:529edb329ee0 268 result = OWReset();
IanBenzMaxim 77:529edb329ee0 269 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 270 {
IanBenzMaxim 77:529edb329ee0 271 result = OWWriteByte(OverdriveMatchRomCmd);
IanBenzMaxim 77:529edb329ee0 272 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 273 {
IanBenzMaxim 77:529edb329ee0 274 OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 77:529edb329ee0 275 // send ROM
IanBenzMaxim 77:529edb329ee0 276 result = OWWriteBlock(romId, RomId::byteLen);
IanBenzMaxim 77:529edb329ee0 277 }
IanBenzMaxim 77:529edb329ee0 278 }
IanBenzMaxim 77:529edb329ee0 279 return result;
IanBenzMaxim 77:529edb329ee0 280 }
IanBenzMaxim 77:529edb329ee0 281
IanBenzMaxim 77:529edb329ee0 282 OneWireMaster::CmdResult OneWireMaster::OWResume()
IanBenzMaxim 77:529edb329ee0 283 {
IanBenzMaxim 77:529edb329ee0 284 OneWireMaster::CmdResult result;
IanBenzMaxim 77:529edb329ee0 285
IanBenzMaxim 77:529edb329ee0 286 result = OWReset();
IanBenzMaxim 77:529edb329ee0 287 if (result == OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 288 {
IanBenzMaxim 77:529edb329ee0 289 result = OWWriteByte(ResumeCmd);
IanBenzMaxim 77:529edb329ee0 290 }
IanBenzMaxim 77:529edb329ee0 291
IanBenzMaxim 77:529edb329ee0 292 return result;
IanBenzMaxim 77:529edb329ee0 293 }
IanBenzMaxim 77:529edb329ee0 294
IanBenzMaxim 77:529edb329ee0 295 OneWireMaster::CmdResult OneWireMaster::OWSearch(SearchState & searchState)
IanBenzMaxim 77:529edb329ee0 296 {
IanBenzMaxim 77:529edb329ee0 297 uint8_t id_bit_number;
IanBenzMaxim 77:529edb329ee0 298 uint8_t last_zero, rom_byte_number;
IanBenzMaxim 77:529edb329ee0 299 uint8_t id_bit, cmp_id_bit;
IanBenzMaxim 77:529edb329ee0 300 uint8_t rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 301 bool search_result;
IanBenzMaxim 77:529edb329ee0 302 uint8_t crc8 = 0;
IanBenzMaxim 77:529edb329ee0 303 OneWireMaster::SearchDirection search_direction;
IanBenzMaxim 77:529edb329ee0 304
IanBenzMaxim 77:529edb329ee0 305 // initialize for search
IanBenzMaxim 77:529edb329ee0 306 id_bit_number = 1;
IanBenzMaxim 77:529edb329ee0 307 last_zero = 0;
IanBenzMaxim 77:529edb329ee0 308 rom_byte_number = 0;
IanBenzMaxim 77:529edb329ee0 309 rom_byte_mask = 1;
IanBenzMaxim 77:529edb329ee0 310 search_result = false;
IanBenzMaxim 77:529edb329ee0 311
IanBenzMaxim 77:529edb329ee0 312 // if the last call was not the last one
IanBenzMaxim 77:529edb329ee0 313 if (!searchState.last_device_flag)
IanBenzMaxim 77:529edb329ee0 314 {
IanBenzMaxim 77:529edb329ee0 315 // 1-Wire reset
IanBenzMaxim 77:529edb329ee0 316 OneWireMaster::CmdResult result = OWReset();
IanBenzMaxim 77:529edb329ee0 317 if (result != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 318 {
IanBenzMaxim 77:529edb329ee0 319 // reset the search
IanBenzMaxim 77:529edb329ee0 320 searchState.reset();
IanBenzMaxim 77:529edb329ee0 321 return result;
IanBenzMaxim 77:529edb329ee0 322 }
IanBenzMaxim 77:529edb329ee0 323
IanBenzMaxim 77:529edb329ee0 324 // issue the search command
IanBenzMaxim 77:529edb329ee0 325 OWWriteByte(SearchRomCmd);
IanBenzMaxim 77:529edb329ee0 326
IanBenzMaxim 77:529edb329ee0 327 // loop to do the search
IanBenzMaxim 77:529edb329ee0 328 do
IanBenzMaxim 77:529edb329ee0 329 {
IanBenzMaxim 77:529edb329ee0 330 // if this discrepancy if before the Last Discrepancy
IanBenzMaxim 77:529edb329ee0 331 // on a previous next then pick the same as last time
IanBenzMaxim 77:529edb329ee0 332 if (id_bit_number < searchState.last_discrepancy)
IanBenzMaxim 77:529edb329ee0 333 {
IanBenzMaxim 77:529edb329ee0 334 if ((searchState.romId[rom_byte_number] & rom_byte_mask) > 0)
IanBenzMaxim 77:529edb329ee0 335 {
IanBenzMaxim 77:529edb329ee0 336 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 77:529edb329ee0 337 }
IanBenzMaxim 77:529edb329ee0 338 else
IanBenzMaxim 77:529edb329ee0 339 {
IanBenzMaxim 77:529edb329ee0 340 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 77:529edb329ee0 341 }
IanBenzMaxim 77:529edb329ee0 342 }
IanBenzMaxim 77:529edb329ee0 343 else
IanBenzMaxim 77:529edb329ee0 344 {
IanBenzMaxim 77:529edb329ee0 345 // if equal to last pick 1, if not then pick 0
IanBenzMaxim 77:529edb329ee0 346 if (id_bit_number == searchState.last_discrepancy)
IanBenzMaxim 77:529edb329ee0 347 {
IanBenzMaxim 77:529edb329ee0 348 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 77:529edb329ee0 349 }
IanBenzMaxim 77:529edb329ee0 350 else
IanBenzMaxim 77:529edb329ee0 351 {
IanBenzMaxim 77:529edb329ee0 352 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 77:529edb329ee0 353 }
IanBenzMaxim 77:529edb329ee0 354 }
IanBenzMaxim 77:529edb329ee0 355
IanBenzMaxim 77:529edb329ee0 356 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
IanBenzMaxim 77:529edb329ee0 357 result = OWTriplet(search_direction, id_bit, cmp_id_bit);
IanBenzMaxim 77:529edb329ee0 358 if (result != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 359 {
IanBenzMaxim 77:529edb329ee0 360 return result;
IanBenzMaxim 77:529edb329ee0 361 }
IanBenzMaxim 77:529edb329ee0 362
IanBenzMaxim 77:529edb329ee0 363 // check for no devices on 1-wire
IanBenzMaxim 77:529edb329ee0 364 if (id_bit && cmp_id_bit)
IanBenzMaxim 77:529edb329ee0 365 {
IanBenzMaxim 77:529edb329ee0 366 break;
IanBenzMaxim 77:529edb329ee0 367 }
IanBenzMaxim 77:529edb329ee0 368 else
IanBenzMaxim 77:529edb329ee0 369 {
IanBenzMaxim 77:529edb329ee0 370 if (!id_bit && !cmp_id_bit && (search_direction == OneWireMaster::WriteZero))
IanBenzMaxim 77:529edb329ee0 371 {
IanBenzMaxim 77:529edb329ee0 372 last_zero = id_bit_number;
IanBenzMaxim 77:529edb329ee0 373
IanBenzMaxim 77:529edb329ee0 374 // check for Last discrepancy in family
IanBenzMaxim 77:529edb329ee0 375 if (last_zero < 9)
IanBenzMaxim 77:529edb329ee0 376 {
IanBenzMaxim 77:529edb329ee0 377 searchState.last_family_discrepancy = last_zero;
IanBenzMaxim 77:529edb329ee0 378 }
IanBenzMaxim 77:529edb329ee0 379 }
IanBenzMaxim 77:529edb329ee0 380
IanBenzMaxim 77:529edb329ee0 381 // set or clear the bit in the ROM byte rom_byte_number
IanBenzMaxim 77:529edb329ee0 382 // with mask rom_byte_mask
IanBenzMaxim 77:529edb329ee0 383 if (search_direction == OneWireMaster::WriteOne)
IanBenzMaxim 77:529edb329ee0 384 {
IanBenzMaxim 77:529edb329ee0 385 searchState.romId[rom_byte_number] |= rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 386 }
IanBenzMaxim 77:529edb329ee0 387 else
IanBenzMaxim 77:529edb329ee0 388 {
IanBenzMaxim 77:529edb329ee0 389 searchState.romId[rom_byte_number] &= (uint8_t)~rom_byte_mask;
IanBenzMaxim 77:529edb329ee0 390 }
IanBenzMaxim 77:529edb329ee0 391
IanBenzMaxim 77:529edb329ee0 392 // increment the byte counter id_bit_number
IanBenzMaxim 77:529edb329ee0 393 // and shift the mask rom_byte_mask
IanBenzMaxim 77:529edb329ee0 394 id_bit_number++;
IanBenzMaxim 77:529edb329ee0 395 rom_byte_mask <<= 1;
IanBenzMaxim 77:529edb329ee0 396
IanBenzMaxim 77:529edb329ee0 397 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
IanBenzMaxim 77:529edb329ee0 398 if (rom_byte_mask == 0)
IanBenzMaxim 77:529edb329ee0 399 {
IanBenzMaxim 82:c11090a32471 400 crc8 = calculateCrc8(crc8, searchState.romId[rom_byte_number]); // accumulate the CRC
IanBenzMaxim 77:529edb329ee0 401 rom_byte_number++;
IanBenzMaxim 77:529edb329ee0 402 rom_byte_mask = 1;
IanBenzMaxim 77:529edb329ee0 403 }
IanBenzMaxim 77:529edb329ee0 404 }
IanBenzMaxim 77:529edb329ee0 405 } while (rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7
IanBenzMaxim 77:529edb329ee0 406
IanBenzMaxim 77:529edb329ee0 407 // if the search was successful then
IanBenzMaxim 77:529edb329ee0 408 if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0)))
IanBenzMaxim 77:529edb329ee0 409 {
IanBenzMaxim 77:529edb329ee0 410 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
IanBenzMaxim 77:529edb329ee0 411 searchState.last_discrepancy = last_zero;
IanBenzMaxim 77:529edb329ee0 412
IanBenzMaxim 77:529edb329ee0 413 // check for last device
IanBenzMaxim 77:529edb329ee0 414 if (searchState.last_discrepancy == 0)
IanBenzMaxim 77:529edb329ee0 415 {
IanBenzMaxim 77:529edb329ee0 416 searchState.last_device_flag = true;
IanBenzMaxim 77:529edb329ee0 417 }
IanBenzMaxim 77:529edb329ee0 418
IanBenzMaxim 77:529edb329ee0 419 search_result = true;
IanBenzMaxim 77:529edb329ee0 420 }
IanBenzMaxim 77:529edb329ee0 421 }
IanBenzMaxim 77:529edb329ee0 422
IanBenzMaxim 77:529edb329ee0 423 // if no device found then reset counters so next 'search' will be like a first
IanBenzMaxim 77:529edb329ee0 424 if (!search_result || (searchState.romId.familyCode() == 0))
IanBenzMaxim 77:529edb329ee0 425 {
IanBenzMaxim 77:529edb329ee0 426 searchState.reset();
IanBenzMaxim 77:529edb329ee0 427 search_result = false;
IanBenzMaxim 77:529edb329ee0 428 }
IanBenzMaxim 77:529edb329ee0 429
IanBenzMaxim 77:529edb329ee0 430 return (search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure);
IanBenzMaxim 77:529edb329ee0 431 }