Version finale

Dependencies:   mbed

Fork of Main_V3_Old by EI2I_4_projet_1_2017-2018

Committer:
ramialjed
Date:
Mon Jan 15 16:34:24 2018 +0000
Revision:
7:2748b1a2742c
Parent:
4:784c4b53a3d4
Version finale

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChrisnieM 4:784c4b53a3d4 1 /*
ChrisnieM 4:784c4b53a3d4 2 * OneWireCRC. This is a port to mbed of Jim Studt's Adruino One Wire
ChrisnieM 4:784c4b53a3d4 3 * library. Please see additional copyrights below this one, including
ChrisnieM 4:784c4b53a3d4 4 * references to other copyrights.
ChrisnieM 4:784c4b53a3d4 5 *
ChrisnieM 4:784c4b53a3d4 6 * Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk>
ChrisnieM 4:784c4b53a3d4 7 *
ChrisnieM 4:784c4b53a3d4 8 * This file is part of OneWireCRC.
ChrisnieM 4:784c4b53a3d4 9 *
ChrisnieM 4:784c4b53a3d4 10 * OneWireCRC is free software: you can redistribute it and/or modify
ChrisnieM 4:784c4b53a3d4 11 * it under the terms of the GNU General Public License as published by
ChrisnieM 4:784c4b53a3d4 12 * the Free Software Foundation, either version 3 of the License, or
ChrisnieM 4:784c4b53a3d4 13 * (at your option) any later version.
ChrisnieM 4:784c4b53a3d4 14 *
ChrisnieM 4:784c4b53a3d4 15 * OneWireCRC is distributed in the hope that it will be useful,
ChrisnieM 4:784c4b53a3d4 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ChrisnieM 4:784c4b53a3d4 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ChrisnieM 4:784c4b53a3d4 18 * GNU General Public License for more details.
ChrisnieM 4:784c4b53a3d4 19 *
ChrisnieM 4:784c4b53a3d4 20 * You should have received a copy of the GNU General Public License
ChrisnieM 4:784c4b53a3d4 21 * along with OneWireCRC. If not, see <http://www.gnu.org/licenses/>.
ChrisnieM 4:784c4b53a3d4 22 */
ChrisnieM 4:784c4b53a3d4 23 /*
ChrisnieM 4:784c4b53a3d4 24 Copyright (c) 2007, Jim Studt
ChrisnieM 4:784c4b53a3d4 25
ChrisnieM 4:784c4b53a3d4 26 Updated to work with arduino-0008 and to include skip() as of
ChrisnieM 4:784c4b53a3d4 27 2007/07/06. --RJL20
ChrisnieM 4:784c4b53a3d4 28
ChrisnieM 4:784c4b53a3d4 29 Modified to calculate the 8-bit CRC directly, avoiding the need for
ChrisnieM 4:784c4b53a3d4 30 the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010
ChrisnieM 4:784c4b53a3d4 31 -- Tom Pollard, Jan 23, 2008
ChrisnieM 4:784c4b53a3d4 32
ChrisnieM 4:784c4b53a3d4 33 Permission is hereby granted, free of charge, to any person obtaining
ChrisnieM 4:784c4b53a3d4 34 a copy of this software and associated documentation files (the
ChrisnieM 4:784c4b53a3d4 35 "Software"), to deal in the Software without restriction, including
ChrisnieM 4:784c4b53a3d4 36 without limitation the rights to use, copy, modify, merge, publish,
ChrisnieM 4:784c4b53a3d4 37 distribute, sublicense, and/or sell copies of the Software, and to
ChrisnieM 4:784c4b53a3d4 38 permit persons to whom the Software is furnished to do so, subject to
ChrisnieM 4:784c4b53a3d4 39 the following conditions:
ChrisnieM 4:784c4b53a3d4 40
ChrisnieM 4:784c4b53a3d4 41 The above copyright notice and this permission notice shall be
ChrisnieM 4:784c4b53a3d4 42 included in all copies or substantial portions of the Software.
ChrisnieM 4:784c4b53a3d4 43
ChrisnieM 4:784c4b53a3d4 44 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
ChrisnieM 4:784c4b53a3d4 45 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
ChrisnieM 4:784c4b53a3d4 46 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ChrisnieM 4:784c4b53a3d4 47 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
ChrisnieM 4:784c4b53a3d4 48 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
ChrisnieM 4:784c4b53a3d4 49 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
ChrisnieM 4:784c4b53a3d4 50 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ChrisnieM 4:784c4b53a3d4 51
ChrisnieM 4:784c4b53a3d4 52 Much of the code was inspired by Derek Yerger's code, though I don't
ChrisnieM 4:784c4b53a3d4 53 think much of that remains. In any event that was..
ChrisnieM 4:784c4b53a3d4 54 (copyleft) 2006 by Derek Yerger - Free to distribute freely.
ChrisnieM 4:784c4b53a3d4 55
ChrisnieM 4:784c4b53a3d4 56 The CRC code was excerpted and inspired by the Dallas Semiconductor
ChrisnieM 4:784c4b53a3d4 57 sample code bearing this copyright.
ChrisnieM 4:784c4b53a3d4 58 //---------------------------------------------------------------------------
ChrisnieM 4:784c4b53a3d4 59 // Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
ChrisnieM 4:784c4b53a3d4 60 //
ChrisnieM 4:784c4b53a3d4 61 // Permission is hereby granted, free of charge, to any person obtaining a
ChrisnieM 4:784c4b53a3d4 62 // copy of this software and associated documentation files (the "Software"),
ChrisnieM 4:784c4b53a3d4 63 // to deal in the Software without restriction, including without limitation
ChrisnieM 4:784c4b53a3d4 64 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
ChrisnieM 4:784c4b53a3d4 65 // and/or sell copies of the Software, and to permit persons to whom the
ChrisnieM 4:784c4b53a3d4 66 // Software is furnished to do so, subject to the following conditions:
ChrisnieM 4:784c4b53a3d4 67 //
ChrisnieM 4:784c4b53a3d4 68 // The above copyright notice and this permission notice shall be included
ChrisnieM 4:784c4b53a3d4 69 // in all copies or substantial portions of the Software.
ChrisnieM 4:784c4b53a3d4 70 //
ChrisnieM 4:784c4b53a3d4 71 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
ChrisnieM 4:784c4b53a3d4 72 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
ChrisnieM 4:784c4b53a3d4 73 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
ChrisnieM 4:784c4b53a3d4 74 // IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
ChrisnieM 4:784c4b53a3d4 75 // OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ChrisnieM 4:784c4b53a3d4 76 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
ChrisnieM 4:784c4b53a3d4 77 // OTHER DEALINGS IN THE SOFTWARE.
ChrisnieM 4:784c4b53a3d4 78 //
ChrisnieM 4:784c4b53a3d4 79 // Except as contained in this notice, the name of Dallas Semiconductor
ChrisnieM 4:784c4b53a3d4 80 // shall not be used except as stated in the Dallas Semiconductor
ChrisnieM 4:784c4b53a3d4 81 // Branding Policy.
ChrisnieM 4:784c4b53a3d4 82 //--------------------------------------------------------------------------
ChrisnieM 4:784c4b53a3d4 83 */
ChrisnieM 4:784c4b53a3d4 84
ChrisnieM 4:784c4b53a3d4 85 #include "OneWireCRC.h"
ChrisnieM 4:784c4b53a3d4 86 #include "OneWireDefs.h"
ChrisnieM 4:784c4b53a3d4 87
ChrisnieM 4:784c4b53a3d4 88 // recommended data sheet timings in micro seconds
ChrisnieM 4:784c4b53a3d4 89 const int standardT[] = {6, 64, 60, 10, 9, 55, 0, 480, 70, 410};
ChrisnieM 4:784c4b53a3d4 90 const int overdriveT[] = {1.5, 7.5, 7.5, 2.5, 0.75, 7, 2.5, 70, 8.5, 40};
ChrisnieM 4:784c4b53a3d4 91
ChrisnieM 4:784c4b53a3d4 92 OneWireCRC::OneWireCRC(PinName oneWire, eSpeed speed) : oneWirePort(oneWire)
ChrisnieM 4:784c4b53a3d4 93 {
ChrisnieM 4:784c4b53a3d4 94 if (STANDARD == speed) timing = standardT;
ChrisnieM 4:784c4b53a3d4 95 else timing = overdriveT; // overdrive
ChrisnieM 4:784c4b53a3d4 96
ChrisnieM 4:784c4b53a3d4 97 resetSearch(); // reset address search state
ChrisnieM 4:784c4b53a3d4 98 }
ChrisnieM 4:784c4b53a3d4 99
ChrisnieM 4:784c4b53a3d4 100 // Generate a 1-wire reset, return 1 if no presence detect was found,
ChrisnieM 4:784c4b53a3d4 101 // return 0 otherwise.
ChrisnieM 4:784c4b53a3d4 102 // (NOTE: does not handle alarm presence from DS2404/DS1994)
ChrisnieM 4:784c4b53a3d4 103 int OneWireCRC::reset()
ChrisnieM 4:784c4b53a3d4 104 {
ChrisnieM 4:784c4b53a3d4 105
ChrisnieM 4:784c4b53a3d4 106 BYTE result = 0; // sample presence pulse result
ChrisnieM 4:784c4b53a3d4 107
ChrisnieM 4:784c4b53a3d4 108 wait_us(timing[6]);
ChrisnieM 4:784c4b53a3d4 109 oneWirePort.output();
ChrisnieM 4:784c4b53a3d4 110 oneWirePort = 0;
ChrisnieM 4:784c4b53a3d4 111 wait_us(timing[7]);
ChrisnieM 4:784c4b53a3d4 112 oneWirePort.input();
ChrisnieM 4:784c4b53a3d4 113 wait_us(timing[8]);
ChrisnieM 4:784c4b53a3d4 114 result = !(oneWirePort & 0x01);
ChrisnieM 4:784c4b53a3d4 115 wait_us(timing[9]);
ChrisnieM 4:784c4b53a3d4 116
ChrisnieM 4:784c4b53a3d4 117 return result;
ChrisnieM 4:784c4b53a3d4 118 }
ChrisnieM 4:784c4b53a3d4 119
ChrisnieM 4:784c4b53a3d4 120 //
ChrisnieM 4:784c4b53a3d4 121 // Write a bit. Port and bit is used to cut lookup time and provide
ChrisnieM 4:784c4b53a3d4 122 // more certain timing.
ChrisnieM 4:784c4b53a3d4 123 //
ChrisnieM 4:784c4b53a3d4 124 void OneWireCRC::writeBit(int bit)
ChrisnieM 4:784c4b53a3d4 125 {
ChrisnieM 4:784c4b53a3d4 126 bit = bit & 0x01;
ChrisnieM 4:784c4b53a3d4 127
ChrisnieM 4:784c4b53a3d4 128 if (bit)
ChrisnieM 4:784c4b53a3d4 129 {
ChrisnieM 4:784c4b53a3d4 130 // Write '1' bit
ChrisnieM 4:784c4b53a3d4 131 oneWirePort.output();
ChrisnieM 4:784c4b53a3d4 132 oneWirePort = 0;
ChrisnieM 4:784c4b53a3d4 133 wait_us(timing[0]);
ChrisnieM 4:784c4b53a3d4 134 oneWirePort.input();
ChrisnieM 4:784c4b53a3d4 135 wait_us(timing[1]);
ChrisnieM 4:784c4b53a3d4 136 }
ChrisnieM 4:784c4b53a3d4 137 else
ChrisnieM 4:784c4b53a3d4 138 {
ChrisnieM 4:784c4b53a3d4 139 // Write '0' bit
ChrisnieM 4:784c4b53a3d4 140 oneWirePort.output();
ChrisnieM 4:784c4b53a3d4 141 oneWirePort = 0;
ChrisnieM 4:784c4b53a3d4 142 wait_us(timing[2]);
ChrisnieM 4:784c4b53a3d4 143 oneWirePort.input();
ChrisnieM 4:784c4b53a3d4 144 wait_us(timing[3]);
ChrisnieM 4:784c4b53a3d4 145 }
ChrisnieM 4:784c4b53a3d4 146 }
ChrisnieM 4:784c4b53a3d4 147
ChrisnieM 4:784c4b53a3d4 148 //
ChrisnieM 4:784c4b53a3d4 149 // Read a bit. Port and bit is used to cut lookup time and provide
ChrisnieM 4:784c4b53a3d4 150 // more certain timing.
ChrisnieM 4:784c4b53a3d4 151 //
ChrisnieM 4:784c4b53a3d4 152 int OneWireCRC::readBit()
ChrisnieM 4:784c4b53a3d4 153 {
ChrisnieM 4:784c4b53a3d4 154 BYTE result;
ChrisnieM 4:784c4b53a3d4 155
ChrisnieM 4:784c4b53a3d4 156 oneWirePort.output();
ChrisnieM 4:784c4b53a3d4 157 oneWirePort = 0;
ChrisnieM 4:784c4b53a3d4 158 wait_us(timing[0]);
ChrisnieM 4:784c4b53a3d4 159 oneWirePort.input();
ChrisnieM 4:784c4b53a3d4 160 wait_us(timing[4]);
ChrisnieM 4:784c4b53a3d4 161 result = oneWirePort & 0x01;
ChrisnieM 4:784c4b53a3d4 162 wait_us(timing[5]);
ChrisnieM 4:784c4b53a3d4 163
ChrisnieM 4:784c4b53a3d4 164 return result;
ChrisnieM 4:784c4b53a3d4 165 }
ChrisnieM 4:784c4b53a3d4 166
ChrisnieM 4:784c4b53a3d4 167 //
ChrisnieM 4:784c4b53a3d4 168 // Write a byte. The writing code uses the active drivers to raise the
ChrisnieM 4:784c4b53a3d4 169 // pin high, if you need power after the write (e.g. DS18S20 in
ChrisnieM 4:784c4b53a3d4 170 // parasite power mode) then set 'power' to 1, otherwise the pin will
ChrisnieM 4:784c4b53a3d4 171 // go tri-state at the end of the write to avoid heating in a short or
ChrisnieM 4:784c4b53a3d4 172 // other mishap.
ChrisnieM 4:784c4b53a3d4 173 //
ChrisnieM 4:784c4b53a3d4 174 void OneWireCRC::writeByte(int data)
ChrisnieM 4:784c4b53a3d4 175 {
ChrisnieM 4:784c4b53a3d4 176 // Loop to write each bit in the byte, LS-bit first
ChrisnieM 4:784c4b53a3d4 177 for (int loop = 0; loop < 8; loop++)
ChrisnieM 4:784c4b53a3d4 178 {
ChrisnieM 4:784c4b53a3d4 179 writeBit(data & 0x01);
ChrisnieM 4:784c4b53a3d4 180
ChrisnieM 4:784c4b53a3d4 181 // shift the data byte for the next bit
ChrisnieM 4:784c4b53a3d4 182 data >>= 1;
ChrisnieM 4:784c4b53a3d4 183 }
ChrisnieM 4:784c4b53a3d4 184 }
ChrisnieM 4:784c4b53a3d4 185
ChrisnieM 4:784c4b53a3d4 186 //
ChrisnieM 4:784c4b53a3d4 187 // Read a byte
ChrisnieM 4:784c4b53a3d4 188 //
ChrisnieM 4:784c4b53a3d4 189 int OneWireCRC::readByte()
ChrisnieM 4:784c4b53a3d4 190 {
ChrisnieM 4:784c4b53a3d4 191 int result = 0;
ChrisnieM 4:784c4b53a3d4 192
ChrisnieM 4:784c4b53a3d4 193 for (int loop = 0; loop < 8; loop++)
ChrisnieM 4:784c4b53a3d4 194 {
ChrisnieM 4:784c4b53a3d4 195 // shift the result to get it ready for the next bit
ChrisnieM 4:784c4b53a3d4 196 result >>= 1;
ChrisnieM 4:784c4b53a3d4 197
ChrisnieM 4:784c4b53a3d4 198 // if result is one, then set MS bit
ChrisnieM 4:784c4b53a3d4 199 if (readBit()) result |= 0x80;
ChrisnieM 4:784c4b53a3d4 200 }
ChrisnieM 4:784c4b53a3d4 201
ChrisnieM 4:784c4b53a3d4 202 return result;
ChrisnieM 4:784c4b53a3d4 203 }
ChrisnieM 4:784c4b53a3d4 204
ChrisnieM 4:784c4b53a3d4 205 int OneWireCRC::touchByte(int data)
ChrisnieM 4:784c4b53a3d4 206 {
ChrisnieM 4:784c4b53a3d4 207 int result = 0;
ChrisnieM 4:784c4b53a3d4 208
ChrisnieM 4:784c4b53a3d4 209 for (int loop = 0; loop < 8; loop++)
ChrisnieM 4:784c4b53a3d4 210 {
ChrisnieM 4:784c4b53a3d4 211 // shift the result to get it ready for the next bit
ChrisnieM 4:784c4b53a3d4 212 result >>= 1;
ChrisnieM 4:784c4b53a3d4 213
ChrisnieM 4:784c4b53a3d4 214 // If sending a '1' then read a bit else write a '0'
ChrisnieM 4:784c4b53a3d4 215 if (data & 0x01)
ChrisnieM 4:784c4b53a3d4 216 {
ChrisnieM 4:784c4b53a3d4 217 if (readBit()) result |= 0x80;
ChrisnieM 4:784c4b53a3d4 218 }
ChrisnieM 4:784c4b53a3d4 219 else writeBit(0);
ChrisnieM 4:784c4b53a3d4 220
ChrisnieM 4:784c4b53a3d4 221 // shift the data byte for the next bit
ChrisnieM 4:784c4b53a3d4 222 data >>= 1;
ChrisnieM 4:784c4b53a3d4 223 }
ChrisnieM 4:784c4b53a3d4 224
ChrisnieM 4:784c4b53a3d4 225 return result;
ChrisnieM 4:784c4b53a3d4 226 }
ChrisnieM 4:784c4b53a3d4 227
ChrisnieM 4:784c4b53a3d4 228 void OneWireCRC::block(BYTE* data, int data_len)
ChrisnieM 4:784c4b53a3d4 229 {
ChrisnieM 4:784c4b53a3d4 230 for (int loop = 0; loop < data_len; loop++)
ChrisnieM 4:784c4b53a3d4 231 {
ChrisnieM 4:784c4b53a3d4 232 data[loop] = touchByte(data[loop]);
ChrisnieM 4:784c4b53a3d4 233 }
ChrisnieM 4:784c4b53a3d4 234 }
ChrisnieM 4:784c4b53a3d4 235
ChrisnieM 4:784c4b53a3d4 236 int OneWireCRC::overdriveSkip(BYTE* data, int data_len)
ChrisnieM 4:784c4b53a3d4 237 {
ChrisnieM 4:784c4b53a3d4 238 // set the speed to 'standard'
ChrisnieM 4:784c4b53a3d4 239 timing = standardT;
ChrisnieM 4:784c4b53a3d4 240
ChrisnieM 4:784c4b53a3d4 241 // reset all devices
ChrisnieM 4:784c4b53a3d4 242 if (reset()) return 0; // if no devices found
ChrisnieM 4:784c4b53a3d4 243
ChrisnieM 4:784c4b53a3d4 244 // overdrive skip command
ChrisnieM 4:784c4b53a3d4 245 writeByte(OVERDRIVE_SKIP);
ChrisnieM 4:784c4b53a3d4 246
ChrisnieM 4:784c4b53a3d4 247 // set the speed to 'overdrive'
ChrisnieM 4:784c4b53a3d4 248 timing = overdriveT;
ChrisnieM 4:784c4b53a3d4 249
ChrisnieM 4:784c4b53a3d4 250 // do a 1-Wire reset in 'overdrive' and return presence result
ChrisnieM 4:784c4b53a3d4 251 return reset();
ChrisnieM 4:784c4b53a3d4 252 }
ChrisnieM 4:784c4b53a3d4 253
ChrisnieM 4:784c4b53a3d4 254 //
ChrisnieM 4:784c4b53a3d4 255 // Do a ROM select
ChrisnieM 4:784c4b53a3d4 256 //
ChrisnieM 4:784c4b53a3d4 257 void OneWireCRC::matchROM(BYTE rom[8])
ChrisnieM 4:784c4b53a3d4 258 {
ChrisnieM 4:784c4b53a3d4 259 writeByte(MATCH_ROM); // Choose ROM
ChrisnieM 4:784c4b53a3d4 260
ChrisnieM 4:784c4b53a3d4 261 for(int i = 0; i < 8; i++) writeByte(rom[i]);
ChrisnieM 4:784c4b53a3d4 262 }
ChrisnieM 4:784c4b53a3d4 263
ChrisnieM 4:784c4b53a3d4 264 //
ChrisnieM 4:784c4b53a3d4 265 // Do a ROM skip
ChrisnieM 4:784c4b53a3d4 266 //
ChrisnieM 4:784c4b53a3d4 267 void OneWireCRC::skipROM()
ChrisnieM 4:784c4b53a3d4 268 {
ChrisnieM 4:784c4b53a3d4 269 writeByte(SKIP_ROM); // Skip ROM
ChrisnieM 4:784c4b53a3d4 270 }
ChrisnieM 4:784c4b53a3d4 271
ChrisnieM 4:784c4b53a3d4 272 //
ChrisnieM 4:784c4b53a3d4 273 // You need to use this function to start a search again from the beginning.
ChrisnieM 4:784c4b53a3d4 274 // You do not need to do it for the first search, though you could.
ChrisnieM 4:784c4b53a3d4 275 //
ChrisnieM 4:784c4b53a3d4 276 void OneWireCRC::resetSearch()
ChrisnieM 4:784c4b53a3d4 277 {
ChrisnieM 4:784c4b53a3d4 278 searchJunction = -1;
ChrisnieM 4:784c4b53a3d4 279 searchExhausted = false;
ChrisnieM 4:784c4b53a3d4 280 for (int i = 0; i < 8; i++)
ChrisnieM 4:784c4b53a3d4 281 {
ChrisnieM 4:784c4b53a3d4 282 address[i] = 0;
ChrisnieM 4:784c4b53a3d4 283 }
ChrisnieM 4:784c4b53a3d4 284 }
ChrisnieM 4:784c4b53a3d4 285
ChrisnieM 4:784c4b53a3d4 286 //
ChrisnieM 4:784c4b53a3d4 287 // Perform a search. If this function returns a '1' then it has
ChrisnieM 4:784c4b53a3d4 288 // enumerated the next device and you may retrieve the ROM from the
ChrisnieM 4:784c4b53a3d4 289 // OneWire::address variable. If there are no devices, no further
ChrisnieM 4:784c4b53a3d4 290 // devices, or something horrible happens in the middle of the
ChrisnieM 4:784c4b53a3d4 291 // enumeration then a 0 is returned. If a new device is found then
ChrisnieM 4:784c4b53a3d4 292 // its address is copied to newAddr. Use OneWire::reset_search() to
ChrisnieM 4:784c4b53a3d4 293 // start over.
ChrisnieM 4:784c4b53a3d4 294 //
ChrisnieM 4:784c4b53a3d4 295 BYTE OneWireCRC::search(BYTE* newAddr)
ChrisnieM 4:784c4b53a3d4 296 {
ChrisnieM 4:784c4b53a3d4 297 BYTE i;
ChrisnieM 4:784c4b53a3d4 298 int lastJunction = -1;
ChrisnieM 4:784c4b53a3d4 299 BYTE done = 1;
ChrisnieM 4:784c4b53a3d4 300
ChrisnieM 4:784c4b53a3d4 301 if (searchExhausted) return 0;
ChrisnieM 4:784c4b53a3d4 302
ChrisnieM 4:784c4b53a3d4 303 if (!reset()) return 0;
ChrisnieM 4:784c4b53a3d4 304
ChrisnieM 4:784c4b53a3d4 305 writeByte(SEARCH_ROM);
ChrisnieM 4:784c4b53a3d4 306
ChrisnieM 4:784c4b53a3d4 307 for(i = 0; i < 64; i++)
ChrisnieM 4:784c4b53a3d4 308 {
ChrisnieM 4:784c4b53a3d4 309 BYTE a = readBit( );
ChrisnieM 4:784c4b53a3d4 310 BYTE nota = readBit( );
ChrisnieM 4:784c4b53a3d4 311 BYTE ibyte = i/8;
ChrisnieM 4:784c4b53a3d4 312 BYTE ibit = 1 << (i & 7);
ChrisnieM 4:784c4b53a3d4 313
ChrisnieM 4:784c4b53a3d4 314 // I don't think this should happen, this means nothing responded, but maybe if
ChrisnieM 4:784c4b53a3d4 315 // something vanishes during the search it will come up.
ChrisnieM 4:784c4b53a3d4 316 if (a && nota) return 0;
ChrisnieM 4:784c4b53a3d4 317
ChrisnieM 4:784c4b53a3d4 318 if (!a && !nota)
ChrisnieM 4:784c4b53a3d4 319 {
ChrisnieM 4:784c4b53a3d4 320 if (i == searchJunction)
ChrisnieM 4:784c4b53a3d4 321 {
ChrisnieM 4:784c4b53a3d4 322 // this is our time to decide differently, we went zero last time, go one.
ChrisnieM 4:784c4b53a3d4 323 a = 1;
ChrisnieM 4:784c4b53a3d4 324 searchJunction = lastJunction;
ChrisnieM 4:784c4b53a3d4 325 }
ChrisnieM 4:784c4b53a3d4 326 else if (i < searchJunction)
ChrisnieM 4:784c4b53a3d4 327 {
ChrisnieM 4:784c4b53a3d4 328 // take whatever we took last time, look in address
ChrisnieM 4:784c4b53a3d4 329 if (address[ibyte] & ibit) a = 1;
ChrisnieM 4:784c4b53a3d4 330 else
ChrisnieM 4:784c4b53a3d4 331 {
ChrisnieM 4:784c4b53a3d4 332 // Only 0s count as pending junctions, we've already exhasuted the 0 side of 1s
ChrisnieM 4:784c4b53a3d4 333 a = 0;
ChrisnieM 4:784c4b53a3d4 334 done = 0;
ChrisnieM 4:784c4b53a3d4 335 lastJunction = i;
ChrisnieM 4:784c4b53a3d4 336 }
ChrisnieM 4:784c4b53a3d4 337 }
ChrisnieM 4:784c4b53a3d4 338 else
ChrisnieM 4:784c4b53a3d4 339 {
ChrisnieM 4:784c4b53a3d4 340 // we are blazing new tree, take the 0
ChrisnieM 4:784c4b53a3d4 341 a = 0;
ChrisnieM 4:784c4b53a3d4 342 searchJunction = i;
ChrisnieM 4:784c4b53a3d4 343 done = 0;
ChrisnieM 4:784c4b53a3d4 344 }
ChrisnieM 4:784c4b53a3d4 345 lastJunction = i;
ChrisnieM 4:784c4b53a3d4 346 }
ChrisnieM 4:784c4b53a3d4 347
ChrisnieM 4:784c4b53a3d4 348 if (a) address[ibyte] |= ibit;
ChrisnieM 4:784c4b53a3d4 349 else address[ibyte] &= ~ibit;
ChrisnieM 4:784c4b53a3d4 350
ChrisnieM 4:784c4b53a3d4 351 writeBit(a);
ChrisnieM 4:784c4b53a3d4 352 }
ChrisnieM 4:784c4b53a3d4 353
ChrisnieM 4:784c4b53a3d4 354 if (done) searchExhausted = true;
ChrisnieM 4:784c4b53a3d4 355
ChrisnieM 4:784c4b53a3d4 356 for (i = 0; i < 8; i++) newAddr[i] = address[i];
ChrisnieM 4:784c4b53a3d4 357
ChrisnieM 4:784c4b53a3d4 358 return 1;
ChrisnieM 4:784c4b53a3d4 359 }
ChrisnieM 4:784c4b53a3d4 360
ChrisnieM 4:784c4b53a3d4 361 // The 1-Wire CRC scheme is described in Maxim Application Note 27:
ChrisnieM 4:784c4b53a3d4 362 // "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
ChrisnieM 4:784c4b53a3d4 363 //
ChrisnieM 4:784c4b53a3d4 364
ChrisnieM 4:784c4b53a3d4 365 #if ONEWIRE_CRC8_TABLE
ChrisnieM 4:784c4b53a3d4 366 // This table comes from Dallas sample code where it is freely reusable,
ChrisnieM 4:784c4b53a3d4 367 // though Copyright (C) 2000 Dallas Semiconductor Corporation
ChrisnieM 4:784c4b53a3d4 368 static BYTE dscrc_table[] =
ChrisnieM 4:784c4b53a3d4 369 {
ChrisnieM 4:784c4b53a3d4 370 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
ChrisnieM 4:784c4b53a3d4 371 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
ChrisnieM 4:784c4b53a3d4 372 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
ChrisnieM 4:784c4b53a3d4 373 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
ChrisnieM 4:784c4b53a3d4 374 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
ChrisnieM 4:784c4b53a3d4 375 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
ChrisnieM 4:784c4b53a3d4 376 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
ChrisnieM 4:784c4b53a3d4 377 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
ChrisnieM 4:784c4b53a3d4 378 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
ChrisnieM 4:784c4b53a3d4 379 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
ChrisnieM 4:784c4b53a3d4 380 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
ChrisnieM 4:784c4b53a3d4 381 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
ChrisnieM 4:784c4b53a3d4 382 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
ChrisnieM 4:784c4b53a3d4 383 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
ChrisnieM 4:784c4b53a3d4 384 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
ChrisnieM 4:784c4b53a3d4 385 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
ChrisnieM 4:784c4b53a3d4 386
ChrisnieM 4:784c4b53a3d4 387 //
ChrisnieM 4:784c4b53a3d4 388 // Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM
ChrisnieM 4:784c4b53a3d4 389 // and the registers. (note: this might better be done without the
ChrisnieM 4:784c4b53a3d4 390 // table, it would probably be smaller and certainly fast enough
ChrisnieM 4:784c4b53a3d4 391 // compared to all those delayMicrosecond() calls. But I got
ChrisnieM 4:784c4b53a3d4 392 // confused, so I use this table from the examples.)
ChrisnieM 4:784c4b53a3d4 393 //
ChrisnieM 4:784c4b53a3d4 394 BYTE OneWireCRC::crc8(BYTE* addr, BYTE len)
ChrisnieM 4:784c4b53a3d4 395 {
ChrisnieM 4:784c4b53a3d4 396 BYTE i;
ChrisnieM 4:784c4b53a3d4 397 BYTE crc = 0;
ChrisnieM 4:784c4b53a3d4 398
ChrisnieM 4:784c4b53a3d4 399 for (i = 0; i < len; i++)
ChrisnieM 4:784c4b53a3d4 400 {
ChrisnieM 4:784c4b53a3d4 401 crc = dscrc_table[crc ^ addr[i] ];
ChrisnieM 4:784c4b53a3d4 402 }
ChrisnieM 4:784c4b53a3d4 403
ChrisnieM 4:784c4b53a3d4 404 return crc;
ChrisnieM 4:784c4b53a3d4 405 }
ChrisnieM 4:784c4b53a3d4 406 #else
ChrisnieM 4:784c4b53a3d4 407 //
ChrisnieM 4:784c4b53a3d4 408 // Compute a Dallas Semiconductor 8 bit CRC directly.
ChrisnieM 4:784c4b53a3d4 409 //
ChrisnieM 4:784c4b53a3d4 410 BYTE OneWireCRC::crc8(BYTE* addr, BYTE len)
ChrisnieM 4:784c4b53a3d4 411 {
ChrisnieM 4:784c4b53a3d4 412 BYTE i, j;
ChrisnieM 4:784c4b53a3d4 413 BYTE crc = 0;
ChrisnieM 4:784c4b53a3d4 414
ChrisnieM 4:784c4b53a3d4 415 for (i = 0; i < len; i++)
ChrisnieM 4:784c4b53a3d4 416 {
ChrisnieM 4:784c4b53a3d4 417 BYTE inbyte = addr[i];
ChrisnieM 4:784c4b53a3d4 418 for (j = 0; j < 8; j++)
ChrisnieM 4:784c4b53a3d4 419 {
ChrisnieM 4:784c4b53a3d4 420 BYTE mix = (crc ^ inbyte) & 0x01;
ChrisnieM 4:784c4b53a3d4 421 crc >>= 1;
ChrisnieM 4:784c4b53a3d4 422 if (mix) crc ^= 0x8C;
ChrisnieM 4:784c4b53a3d4 423 inbyte >>= 1;
ChrisnieM 4:784c4b53a3d4 424 }
ChrisnieM 4:784c4b53a3d4 425 }
ChrisnieM 4:784c4b53a3d4 426
ChrisnieM 4:784c4b53a3d4 427 return crc;
ChrisnieM 4:784c4b53a3d4 428 }
ChrisnieM 4:784c4b53a3d4 429 #endif
ChrisnieM 4:784c4b53a3d4 430
ChrisnieM 4:784c4b53a3d4 431 static short oddparity[16] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 };
ChrisnieM 4:784c4b53a3d4 432
ChrisnieM 4:784c4b53a3d4 433 //
ChrisnieM 4:784c4b53a3d4 434 // Compute a Dallas Semiconductor 16 bit CRC. I have never seen one of
ChrisnieM 4:784c4b53a3d4 435 // these, but here it is.
ChrisnieM 4:784c4b53a3d4 436 //
ChrisnieM 4:784c4b53a3d4 437 unsigned short OneWireCRC::crc16(unsigned short* data, unsigned short len)
ChrisnieM 4:784c4b53a3d4 438 {
ChrisnieM 4:784c4b53a3d4 439 unsigned short i;
ChrisnieM 4:784c4b53a3d4 440 unsigned short crc = 0;
ChrisnieM 4:784c4b53a3d4 441
ChrisnieM 4:784c4b53a3d4 442 for ( i = 0; i < len; i++)
ChrisnieM 4:784c4b53a3d4 443 {
ChrisnieM 4:784c4b53a3d4 444 unsigned short cdata = data[len];
ChrisnieM 4:784c4b53a3d4 445
ChrisnieM 4:784c4b53a3d4 446 cdata = (cdata ^ (crc & 0xff)) & 0xff;
ChrisnieM 4:784c4b53a3d4 447 crc >>= 8;
ChrisnieM 4:784c4b53a3d4 448
ChrisnieM 4:784c4b53a3d4 449 if (oddparity[cdata & 0xf] ^ oddparity[cdata >> 4]) crc ^= 0xc001;
ChrisnieM 4:784c4b53a3d4 450
ChrisnieM 4:784c4b53a3d4 451 cdata <<= 6;
ChrisnieM 4:784c4b53a3d4 452 crc ^= cdata;
ChrisnieM 4:784c4b53a3d4 453 cdata <<= 1;
ChrisnieM 4:784c4b53a3d4 454 crc ^= cdata;
ChrisnieM 4:784c4b53a3d4 455 }
ChrisnieM 4:784c4b53a3d4 456
ChrisnieM 4:784c4b53a3d4 457 return crc;
ChrisnieM 4:784c4b53a3d4 458 }
ChrisnieM 4:784c4b53a3d4 459