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:
j3
Date:
Mon Mar 21 23:18:45 2016 +0000
Revision:
23:e8e403d61359
Parent:
21:00c94aeb533e
Child:
26:a361e3f42ba5
Merged OneWireInterface into OneWireMaster for clarity

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 1:91e52f8ab8bf 1 /******************************************************************//**
j3 1:91e52f8ab8bf 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 1:91e52f8ab8bf 3 *
j3 1:91e52f8ab8bf 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 1:91e52f8ab8bf 5 * copy of this software and associated documentation files (the "Software"),
j3 1:91e52f8ab8bf 6 * to deal in the Software without restriction, including without limitation
j3 1:91e52f8ab8bf 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 1:91e52f8ab8bf 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 1:91e52f8ab8bf 9 * Software is furnished to do so, subject to the following conditions:
j3 1:91e52f8ab8bf 10 *
j3 1:91e52f8ab8bf 11 * The above copyright notice and this permission notice shall be included
j3 1:91e52f8ab8bf 12 * in all copies or substantial portions of the Software.
j3 1:91e52f8ab8bf 13 *
j3 1:91e52f8ab8bf 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 1:91e52f8ab8bf 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 1:91e52f8ab8bf 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 1:91e52f8ab8bf 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 1:91e52f8ab8bf 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 1:91e52f8ab8bf 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 1:91e52f8ab8bf 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 1:91e52f8ab8bf 21 *
j3 1:91e52f8ab8bf 22 * Except as contained in this notice, the name of Maxim Integrated
j3 1:91e52f8ab8bf 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 1:91e52f8ab8bf 24 * Products, Inc. Branding Policy.
j3 1:91e52f8ab8bf 25 *
j3 1:91e52f8ab8bf 26 * The mere transfer of this software does not imply any licenses
j3 1:91e52f8ab8bf 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 1:91e52f8ab8bf 28 * trademarks, maskwork rights, or any other form of intellectual
j3 1:91e52f8ab8bf 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 1:91e52f8ab8bf 30 * ownership rights.
j3 1:91e52f8ab8bf 31 **********************************************************************/
j3 1:91e52f8ab8bf 32
j3 1:91e52f8ab8bf 33
j3 1:91e52f8ab8bf 34 #include "ds248x.h"
j3 1:91e52f8ab8bf 35
j3 1:91e52f8ab8bf 36
j3 1:91e52f8ab8bf 37 //*********************************************************************
j3 5:ce108eeb878d 38 Ds248x::Ds248x(I2C &i2c_bus, DS248X_I2C_ADRS adrs)
j3 6:1faafa0b3cd7 39 :_p_i2c_bus(&i2c_bus), _i2c_owner(false)
j3 1:91e52f8ab8bf 40 {
j3 6:1faafa0b3cd7 41 set_i2c_adrs(adrs);
j3 1:91e52f8ab8bf 42 }
j3 1:91e52f8ab8bf 43
j3 1:91e52f8ab8bf 44
j3 1:91e52f8ab8bf 45 //*********************************************************************
j3 5:ce108eeb878d 46 Ds248x::Ds248x(PinName sda, PinName scl, DS248X_I2C_ADRS adrs)
j3 6:1faafa0b3cd7 47 :_p_i2c_bus(new I2C(sda, scl)), _i2c_owner(true)
j3 1:91e52f8ab8bf 48 {
j3 6:1faafa0b3cd7 49 set_i2c_adrs(adrs);
j3 1:91e52f8ab8bf 50 }
j3 1:91e52f8ab8bf 51
j3 1:91e52f8ab8bf 52
j3 1:91e52f8ab8bf 53 //*********************************************************************
j3 1:91e52f8ab8bf 54 Ds248x::~Ds248x()
j3 1:91e52f8ab8bf 55 {
j3 5:ce108eeb878d 56 if(_i2c_owner)
j3 1:91e52f8ab8bf 57 {
j3 1:91e52f8ab8bf 58 delete _p_i2c_bus;
j3 1:91e52f8ab8bf 59 }
j3 1:91e52f8ab8bf 60 }
j3 1:91e52f8ab8bf 61
j3 1:91e52f8ab8bf 62
j3 1:91e52f8ab8bf 63 //*********************************************************************
j3 23:e8e403d61359 64 OneWireMaster::CmdResult Ds248x::OWInitMaster(void)
j3 14:7b2886a50321 65 {
j3 14:7b2886a50321 66 return(detect());
j3 14:7b2886a50321 67 }
j3 14:7b2886a50321 68
j3 14:7b2886a50321 69
j3 14:7b2886a50321 70 //*********************************************************************
j3 23:e8e403d61359 71 OneWireMaster::CmdResult Ds248x::detect(void)
j3 2:02d228c25fd4 72 {
j3 23:e8e403d61359 73 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 74
j3 2:02d228c25fd4 75 // reset the ds2484 ON selected address
j3 17:b646b1e3970b 76 result = reset();
j3 23:e8e403d61359 77 if(result == OneWireMaster::Success)
j3 2:02d228c25fd4 78 {
j3 2:02d228c25fd4 79 // default configuration
j3 17:b646b1e3970b 80 _c1WS = 0;
j3 17:b646b1e3970b 81 _cSPU = 0;
j3 17:b646b1e3970b 82 _cPDN = 0;
j3 17:b646b1e3970b 83 _cAPU = 0;
j3 2:02d228c25fd4 84
j3 17:b646b1e3970b 85 result = write_config(_c1WS | _cSPU | _cPDN | _cAPU);
j3 2:02d228c25fd4 86 }
j3 2:02d228c25fd4 87
j3 17:b646b1e3970b 88 return result;
j3 2:02d228c25fd4 89 }
j3 2:02d228c25fd4 90
j3 2:02d228c25fd4 91
j3 2:02d228c25fd4 92 //*********************************************************************
j3 23:e8e403d61359 93 OneWireMaster::CmdResult Ds248x::reset(void)
j3 1:91e52f8ab8bf 94 {
j3 23:e8e403d61359 95 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 96
j3 2:02d228c25fd4 97 char status;
j3 2:02d228c25fd4 98 char packet[] = {CMD_DRST};
j3 2:02d228c25fd4 99
j3 2:02d228c25fd4 100 // Device Reset
j3 2:02d228c25fd4 101 // S AD,0 [A] DRST [A] Sr AD,1 [A] [SS] A\ P
j3 2:02d228c25fd4 102 // [] indicates from slave
j3 2:02d228c25fd4 103 // SS status byte to read to verify state
j3 2:02d228c25fd4 104
j3 17:b646b1e3970b 105 if(_p_i2c_bus->write(_w_adrs, packet, 1) != I2C_WRITE_OK)
j3 17:b646b1e3970b 106 {
j3 23:e8e403d61359 107 result = OneWireMaster::CommunicationWriteError;
j3 17:b646b1e3970b 108 }
j3 17:b646b1e3970b 109 else
j3 17:b646b1e3970b 110 {
j3 17:b646b1e3970b 111 if(_p_i2c_bus->read(_r_adrs, &status, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 112 {
j3 23:e8e403d61359 113 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 114 }
j3 17:b646b1e3970b 115 else
j3 17:b646b1e3970b 116 {
j3 17:b646b1e3970b 117 if((status & 0xF7) == 0x10)
j3 17:b646b1e3970b 118 {
j3 23:e8e403d61359 119 result = OneWireMaster::Success;
j3 17:b646b1e3970b 120 }
j3 17:b646b1e3970b 121 else
j3 17:b646b1e3970b 122 {
j3 23:e8e403d61359 123 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 124 }
j3 17:b646b1e3970b 125 }
j3 17:b646b1e3970b 126 }
j3 2:02d228c25fd4 127
j3 17:b646b1e3970b 128 return result;
j3 2:02d228c25fd4 129 }
j3 2:02d228c25fd4 130
j3 2:02d228c25fd4 131
j3 2:02d228c25fd4 132 //*********************************************************************
j3 23:e8e403d61359 133 OneWireMaster::CmdResult Ds248x::write_config(uint8_t config)
j3 2:02d228c25fd4 134 {
j3 23:e8e403d61359 135 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 136
j3 2:02d228c25fd4 137 char read_config;
j3 2:02d228c25fd4 138 char packet [] = {CMD_WCFG, (config | (~config << 4))};
j3 2:02d228c25fd4 139
j3 17:b646b1e3970b 140 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 2:02d228c25fd4 141 {
j3 23:e8e403d61359 142 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 143 }
j3 2:02d228c25fd4 144 else
j3 2:02d228c25fd4 145 {
j3 17:b646b1e3970b 146 if(_p_i2c_bus->read(_r_adrs, &read_config, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 147 {
j3 23:e8e403d61359 148 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 149 }
j3 17:b646b1e3970b 150 else
j3 17:b646b1e3970b 151 {
j3 17:b646b1e3970b 152 // check for failure due to incorrect read back
j3 17:b646b1e3970b 153 if (config != read_config)
j3 17:b646b1e3970b 154 {
j3 17:b646b1e3970b 155 reset();
j3 23:e8e403d61359 156 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 157 }
j3 17:b646b1e3970b 158 else
j3 17:b646b1e3970b 159 {
j3 23:e8e403d61359 160 result = OneWireMaster::Success;
j3 17:b646b1e3970b 161 }
j3 17:b646b1e3970b 162 }
j3 2:02d228c25fd4 163 }
j3 2:02d228c25fd4 164
j3 17:b646b1e3970b 165 return result;
j3 1:91e52f8ab8bf 166 }
j3 1:91e52f8ab8bf 167
j3 1:91e52f8ab8bf 168
j3 1:91e52f8ab8bf 169 //*********************************************************************
j3 23:e8e403d61359 170 OneWireMaster::CmdResult Ds248x::channel_select(uint8_t channel)
j3 1:91e52f8ab8bf 171 {
j3 23:e8e403d61359 172 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 173
j3 2:02d228c25fd4 174 char ch, ch_read, check;
j3 2:02d228c25fd4 175 char packet [2];
j3 2:02d228c25fd4 176
j3 2:02d228c25fd4 177 packet[0] = CMD_CHSL;
j3 2:02d228c25fd4 178
j3 2:02d228c25fd4 179 // Channel Select (Case A)
j3 2:02d228c25fd4 180 // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P
j3 2:02d228c25fd4 181 // [] indicates from slave
j3 2:02d228c25fd4 182 // CC channel value
j3 2:02d228c25fd4 183 // RR channel read back
j3 2:02d228c25fd4 184
j3 2:02d228c25fd4 185 switch (channel)
j3 2:02d228c25fd4 186 {
j3 2:02d228c25fd4 187 default: case 0: ch = 0xF0; ch_read = 0xB8; break;
j3 2:02d228c25fd4 188 case 1: ch = 0xE1; ch_read = 0xB1; break;
j3 2:02d228c25fd4 189 case 2: ch = 0xD2; ch_read = 0xAA; break;
j3 2:02d228c25fd4 190 case 3: ch = 0xC3; ch_read = 0xA3; break;
j3 2:02d228c25fd4 191 case 4: ch = 0xB4; ch_read = 0x9C; break;
j3 2:02d228c25fd4 192 case 5: ch = 0xA5; ch_read = 0x95; break;
j3 2:02d228c25fd4 193 case 6: ch = 0x96; ch_read = 0x8E; break;
j3 2:02d228c25fd4 194 case 7: ch = 0x87; ch_read = 0x87; break;
j3 2:02d228c25fd4 195 };
j3 2:02d228c25fd4 196
j3 2:02d228c25fd4 197 packet[1] = ch;
j3 2:02d228c25fd4 198
j3 17:b646b1e3970b 199 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 17:b646b1e3970b 200 {
j3 23:e8e403d61359 201 result = OneWireMaster::CommunicationWriteError;
j3 17:b646b1e3970b 202 }
j3 17:b646b1e3970b 203 else
j3 17:b646b1e3970b 204 {
j3 17:b646b1e3970b 205 if(_p_i2c_bus->read(_r_adrs, &check, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 206 {
j3 23:e8e403d61359 207 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 208 }
j3 17:b646b1e3970b 209 else
j3 17:b646b1e3970b 210 {
j3 17:b646b1e3970b 211 // check for failure due to incorrect read back of channel
j3 17:b646b1e3970b 212 if (check == ch_read)
j3 17:b646b1e3970b 213 {
j3 23:e8e403d61359 214 result = OneWireMaster::Success;
j3 17:b646b1e3970b 215 }
j3 17:b646b1e3970b 216 else
j3 17:b646b1e3970b 217 {
j3 23:e8e403d61359 218 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 219 }
j3 17:b646b1e3970b 220 }
j3 17:b646b1e3970b 221 }
j3 2:02d228c25fd4 222
j3 17:b646b1e3970b 223 return result;
j3 2:02d228c25fd4 224 }
j3 2:02d228c25fd4 225
j3 2:02d228c25fd4 226
j3 2:02d228c25fd4 227 //*********************************************************************
j3 23:e8e403d61359 228 OneWireMaster::CmdResult Ds248x::adjust_timing(uint8_t param, uint8_t val)
j3 2:02d228c25fd4 229 {
j3 23:e8e403d61359 230 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 231
j3 2:02d228c25fd4 232 char read_port_config;
j3 2:02d228c25fd4 233 char control_byte;
j3 2:02d228c25fd4 234
j3 2:02d228c25fd4 235 control_byte = (((param & 0x0F) << 4) | (val & 0x0F));
j3 2:02d228c25fd4 236
j3 2:02d228c25fd4 237 char packet [] = {CMD_A1WP, control_byte};
j3 2:02d228c25fd4 238
j3 17:b646b1e3970b 239 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 17:b646b1e3970b 240 {
j3 23:e8e403d61359 241 result = OneWireMaster::CommunicationWriteError;
j3 17:b646b1e3970b 242 }
j3 17:b646b1e3970b 243 else
j3 2:02d228c25fd4 244 {
j3 17:b646b1e3970b 245 if(_p_i2c_bus->read(_r_adrs, &read_port_config, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 246 {
j3 23:e8e403d61359 247 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 248 }
j3 17:b646b1e3970b 249 else
j3 17:b646b1e3970b 250 {
j3 17:b646b1e3970b 251 // check for failure due to incorrect read back
j3 17:b646b1e3970b 252 if ((control_byte & 0x0F) != read_port_config)
j3 17:b646b1e3970b 253 {
j3 23:e8e403d61359 254 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 255 reset();
j3 17:b646b1e3970b 256 }
j3 17:b646b1e3970b 257 else
j3 17:b646b1e3970b 258 {
j3 23:e8e403d61359 259 result = OneWireMaster::Success;
j3 17:b646b1e3970b 260 }
j3 17:b646b1e3970b 261 }
j3 2:02d228c25fd4 262 }
j3 17:b646b1e3970b 263
j3 17:b646b1e3970b 264 return result;
j3 1:91e52f8ab8bf 265 }
j3 1:91e52f8ab8bf 266
j3 1:91e52f8ab8bf 267
j3 1:91e52f8ab8bf 268 //*********************************************************************
j3 23:e8e403d61359 269 OneWireMaster::CmdResult Ds248x::search_triplet(uint8_t search_direction, uint8_t & status)
j3 1:91e52f8ab8bf 270 {
j3 23:e8e403d61359 271 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 272
j3 2:02d228c25fd4 273 uint8_t poll_count = 0;
j3 2:02d228c25fd4 274 char packet [] = {CMD_1WT, search_direction ? 0x80 : 0x00};
j3 17:b646b1e3970b 275 char read_data;
j3 2:02d228c25fd4 276
j3 2:02d228c25fd4 277 // 1-Wire Triplet (Case B)
j3 2:02d228c25fd4 278 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 279 // \--------/
j3 2:02d228c25fd4 280 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 281 // [] indicates from slave
j3 2:02d228c25fd4 282 // SS indicates byte containing search direction bit value in msbit
j3 2:02d228c25fd4 283
j3 17:b646b1e3970b 284 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 2:02d228c25fd4 285 {
j3 23:e8e403d61359 286 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 287 }
j3 2:02d228c25fd4 288 else
j3 2:02d228c25fd4 289 {
j3 17:b646b1e3970b 290 // loop checking 1WB bit for completion of 1-Wire operation
j3 17:b646b1e3970b 291 // abort if poll limit reached
j3 17:b646b1e3970b 292
j3 17:b646b1e3970b 293 //dummy write for loop
j3 23:e8e403d61359 294 result = OneWireMaster::Success; //so far
j3 17:b646b1e3970b 295 do
j3 17:b646b1e3970b 296 {
j3 17:b646b1e3970b 297 if(_p_i2c_bus->read(_r_adrs, &read_data, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 298 {
j3 23:e8e403d61359 299 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 300 }
j3 17:b646b1e3970b 301 }
j3 23:e8e403d61359 302 while ((read_data & STATUS_1WB) && (poll_count++ < POLL_LIMIT) && (result != OneWireMaster::CommunicationReadError));
j3 17:b646b1e3970b 303
j3 23:e8e403d61359 304 if((result == OneWireMaster::CommunicationReadError) || (poll_count >= POLL_LIMIT))
j3 17:b646b1e3970b 305 {
j3 17:b646b1e3970b 306 // check for failure due to poll limit reached
j3 17:b646b1e3970b 307 if(poll_count >= POLL_LIMIT)
j3 17:b646b1e3970b 308 {
j3 17:b646b1e3970b 309 // handle error
j3 17:b646b1e3970b 310 // ...
j3 17:b646b1e3970b 311 reset();
j3 23:e8e403d61359 312 result = OneWireMaster::TimeoutError;
j3 17:b646b1e3970b 313 }
j3 17:b646b1e3970b 314 }
j3 17:b646b1e3970b 315 else
j3 17:b646b1e3970b 316 {
j3 17:b646b1e3970b 317 status = read_data;
j3 23:e8e403d61359 318 result = OneWireMaster::Success;
j3 17:b646b1e3970b 319 }
j3 2:02d228c25fd4 320 }
j3 17:b646b1e3970b 321
j3 17:b646b1e3970b 322 return result;
j3 1:91e52f8ab8bf 323 }
j3 1:91e52f8ab8bf 324
j3 1:91e52f8ab8bf 325
j3 1:91e52f8ab8bf 326 //*********************************************************************
j3 23:e8e403d61359 327 OneWireMaster::CmdResult Ds248x::OWReset(void)
j3 2:02d228c25fd4 328 {
j3 23:e8e403d61359 329 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 330
j3 2:02d228c25fd4 331 uint8_t poll_count = 0;
j3 2:02d228c25fd4 332 char status;
j3 2:02d228c25fd4 333 char packet [] = {CMD_1WRS};
j3 1:91e52f8ab8bf 334
j3 2:02d228c25fd4 335 // 1-Wire reset (Case B)
j3 2:02d228c25fd4 336 // S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 337 // \--------/
j3 2:02d228c25fd4 338 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 339 // [] indicates from slave
j3 2:02d228c25fd4 340
j3 17:b646b1e3970b 341 if(_p_i2c_bus->write(_w_adrs, packet, 1) != I2C_WRITE_OK)
j3 2:02d228c25fd4 342 {
j3 23:e8e403d61359 343 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 344 }
j3 2:02d228c25fd4 345 else
j3 2:02d228c25fd4 346 {
j3 17:b646b1e3970b 347 // loop checking 1WB bit for completion of 1-Wire operation
j3 17:b646b1e3970b 348 // abort if poll limit reached
j3 17:b646b1e3970b 349 //dummy write for loop
j3 23:e8e403d61359 350 result = OneWireMaster::Success; //so far
j3 17:b646b1e3970b 351 do
j3 2:02d228c25fd4 352 {
j3 17:b646b1e3970b 353 if(_p_i2c_bus->read(_r_adrs, &status, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 354 {
j3 23:e8e403d61359 355 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 356 }
j3 17:b646b1e3970b 357 }
j3 23:e8e403d61359 358 while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT) && (result != OneWireMaster::CommunicationReadError));
j3 17:b646b1e3970b 359
j3 23:e8e403d61359 360 if((result == OneWireMaster::CommunicationReadError) || (poll_count >= POLL_LIMIT))
j3 17:b646b1e3970b 361 {
j3 17:b646b1e3970b 362 // check for failure due to poll limit reached
j3 17:b646b1e3970b 363 if(poll_count >= POLL_LIMIT)
j3 17:b646b1e3970b 364 {
j3 17:b646b1e3970b 365 // handle error
j3 17:b646b1e3970b 366 // ...
j3 17:b646b1e3970b 367 reset();
j3 23:e8e403d61359 368 result = OneWireMaster::TimeoutError;
j3 17:b646b1e3970b 369 }
j3 2:02d228c25fd4 370 }
j3 2:02d228c25fd4 371 else
j3 2:02d228c25fd4 372 {
j3 17:b646b1e3970b 373 // check for short condition
j3 17:b646b1e3970b 374 if (status & STATUS_SD)
j3 17:b646b1e3970b 375 {
j3 17:b646b1e3970b 376 _short_detected = true;
j3 17:b646b1e3970b 377 }
j3 17:b646b1e3970b 378 else
j3 17:b646b1e3970b 379 {
j3 17:b646b1e3970b 380 _short_detected = false;
j3 17:b646b1e3970b 381 }
j3 17:b646b1e3970b 382
j3 17:b646b1e3970b 383 // check for presence detect
j3 17:b646b1e3970b 384 if (status & STATUS_PPD)
j3 17:b646b1e3970b 385 {
j3 23:e8e403d61359 386 result = OneWireMaster::Success;
j3 17:b646b1e3970b 387 }
j3 17:b646b1e3970b 388 else
j3 17:b646b1e3970b 389 {
j3 23:e8e403d61359 390 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 391 }
j3 2:02d228c25fd4 392 }
j3 2:02d228c25fd4 393 }
j3 17:b646b1e3970b 394
j3 17:b646b1e3970b 395 return result;
j3 1:91e52f8ab8bf 396 }
j3 1:91e52f8ab8bf 397
j3 1:91e52f8ab8bf 398
j3 1:91e52f8ab8bf 399 //*********************************************************************
j3 23:e8e403d61359 400 OneWireMaster::CmdResult Ds248x::OWTouchBit(uint8_t & sendrecvbit)
j3 1:91e52f8ab8bf 401 {
j3 23:e8e403d61359 402 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 403
j3 2:02d228c25fd4 404 uint8_t poll_count = 0;
j3 2:02d228c25fd4 405 char status;
j3 17:b646b1e3970b 406 char packet[] = {CMD_1WSB, sendrecvbit ? 0x80 : 0x00};
j3 2:02d228c25fd4 407
j3 2:02d228c25fd4 408 // 1-Wire bit (Case B)
j3 2:02d228c25fd4 409 // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 410 // \--------/
j3 2:02d228c25fd4 411 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 412 // [] indicates from slave
j3 2:02d228c25fd4 413 // BB indicates byte containing bit value in msbit
j3 2:02d228c25fd4 414
j3 17:b646b1e3970b 415 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 2:02d228c25fd4 416 {
j3 23:e8e403d61359 417 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 418 }
j3 2:02d228c25fd4 419 else
j3 2:02d228c25fd4 420 {
j3 17:b646b1e3970b 421 // loop checking 1WB bit for completion of 1-Wire operation
j3 17:b646b1e3970b 422 // abort if poll limit reached
j3 17:b646b1e3970b 423 //dummy write for loop
j3 23:e8e403d61359 424 result = OneWireMaster::Success; //so far
j3 17:b646b1e3970b 425 do
j3 2:02d228c25fd4 426 {
j3 17:b646b1e3970b 427 if(_p_i2c_bus->read(_r_adrs, &status, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 428 {
j3 23:e8e403d61359 429 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 430 }
j3 17:b646b1e3970b 431 }
j3 23:e8e403d61359 432 while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT) && (result != OneWireMaster::CommunicationReadError));
j3 17:b646b1e3970b 433
j3 23:e8e403d61359 434 if((result == OneWireMaster::CommunicationReadError) || (poll_count >= POLL_LIMIT))
j3 17:b646b1e3970b 435 {
j3 17:b646b1e3970b 436 // check for failure due to poll limit reached
j3 17:b646b1e3970b 437 if (poll_count >= POLL_LIMIT)
j3 17:b646b1e3970b 438 {
j3 17:b646b1e3970b 439 // handle error
j3 17:b646b1e3970b 440 // ...
j3 17:b646b1e3970b 441 reset();
j3 23:e8e403d61359 442 result = OneWireMaster::TimeoutError;
j3 17:b646b1e3970b 443 }
j3 2:02d228c25fd4 444 }
j3 2:02d228c25fd4 445 else
j3 2:02d228c25fd4 446 {
j3 17:b646b1e3970b 447 // return bit state through out param
j3 17:b646b1e3970b 448 if (status & STATUS_SBR)
j3 17:b646b1e3970b 449 {
j3 17:b646b1e3970b 450 sendrecvbit = 1;
j3 17:b646b1e3970b 451
j3 17:b646b1e3970b 452 }
j3 17:b646b1e3970b 453 else
j3 17:b646b1e3970b 454 {
j3 17:b646b1e3970b 455 sendrecvbit = 0;
j3 17:b646b1e3970b 456 }
j3 23:e8e403d61359 457 result = OneWireMaster::Success;
j3 2:02d228c25fd4 458 }
j3 2:02d228c25fd4 459 }
j3 17:b646b1e3970b 460
j3 17:b646b1e3970b 461 return result;
j3 1:91e52f8ab8bf 462 }
j3 1:91e52f8ab8bf 463
j3 1:91e52f8ab8bf 464
j3 1:91e52f8ab8bf 465 //*********************************************************************
j3 23:e8e403d61359 466 OneWireMaster::CmdResult Ds248x::OWWriteByte(uint8_t sendbyte)
j3 1:91e52f8ab8bf 467 {
j3 23:e8e403d61359 468 OneWireMaster::CmdResult result;
j3 1:91e52f8ab8bf 469
j3 2:02d228c25fd4 470 uint8_t poll_count = 0;
j3 2:02d228c25fd4 471 char status;
j3 2:02d228c25fd4 472 char packet [] = {CMD_1WWB, sendbyte};
j3 2:02d228c25fd4 473
j3 2:02d228c25fd4 474 // 1-Wire Write Byte (Case B)
j3 2:02d228c25fd4 475 // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 476 // \--------/
j3 2:02d228c25fd4 477 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 478 // [] indicates from slave
j3 2:02d228c25fd4 479 // DD data to write
j3 2:02d228c25fd4 480
j3 17:b646b1e3970b 481 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 2:02d228c25fd4 482 {
j3 23:e8e403d61359 483 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 484 }
j3 2:02d228c25fd4 485 else
j3 2:02d228c25fd4 486 {
j3 17:b646b1e3970b 487 // loop checking 1WB bit for completion of 1-Wire operation
j3 17:b646b1e3970b 488 // abort if poll limit reached
j3 17:b646b1e3970b 489 //dummy write for loop
j3 23:e8e403d61359 490 result = OneWireMaster::Success; //so far
j3 17:b646b1e3970b 491 do
j3 17:b646b1e3970b 492 {
j3 17:b646b1e3970b 493 if(_p_i2c_bus->read(_r_adrs, &status, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 494 {
j3 23:e8e403d61359 495 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 496 }
j3 17:b646b1e3970b 497 }
j3 23:e8e403d61359 498 while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT) && (result != OneWireMaster::CommunicationReadError));
j3 17:b646b1e3970b 499
j3 23:e8e403d61359 500 if((result == OneWireMaster::CommunicationReadError) || (poll_count >= POLL_LIMIT))
j3 17:b646b1e3970b 501 {
j3 17:b646b1e3970b 502 // check for failure due to poll limit reached
j3 17:b646b1e3970b 503 if (poll_count >= POLL_LIMIT)
j3 17:b646b1e3970b 504 {
j3 17:b646b1e3970b 505 // handle error
j3 17:b646b1e3970b 506 // ...
j3 17:b646b1e3970b 507 reset();
j3 23:e8e403d61359 508 result = OneWireMaster::TimeoutError;
j3 17:b646b1e3970b 509 }
j3 17:b646b1e3970b 510 }
j3 17:b646b1e3970b 511 else
j3 17:b646b1e3970b 512 {
j3 23:e8e403d61359 513 result = OneWireMaster::Success;
j3 17:b646b1e3970b 514 }
j3 2:02d228c25fd4 515 }
j3 2:02d228c25fd4 516
j3 17:b646b1e3970b 517 return result;
j3 1:91e52f8ab8bf 518 }
j3 1:91e52f8ab8bf 519
j3 1:91e52f8ab8bf 520
j3 1:91e52f8ab8bf 521 //*********************************************************************
j3 23:e8e403d61359 522 OneWireMaster::CmdResult Ds248x::OWReadByte(uint8_t & recvbyte)
j3 1:91e52f8ab8bf 523 {
j3 23:e8e403d61359 524 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 525
j3 2:02d228c25fd4 526 uint8_t poll_count = 0;
j3 2:02d228c25fd4 527 char data, status;
j3 2:02d228c25fd4 528 char packet[2] = {CMD_1WRB, 0};
j3 2:02d228c25fd4 529
j3 2:02d228c25fd4 530 // 1-Wire Read Bytes (Case C)
j3 2:02d228c25fd4 531 // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A\
j3 2:02d228c25fd4 532 // \--------/
j3 2:02d228c25fd4 533 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 534 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
j3 2:02d228c25fd4 535 //
j3 2:02d228c25fd4 536 // [] indicates from slave
j3 2:02d228c25fd4 537 // DD data read
j3 2:02d228c25fd4 538
j3 17:b646b1e3970b 539 if(_p_i2c_bus->write(_w_adrs, packet, 1) != I2C_WRITE_OK)
j3 2:02d228c25fd4 540 {
j3 23:e8e403d61359 541 result = OneWireMaster::CommunicationWriteError;
j3 2:02d228c25fd4 542 }
j3 2:02d228c25fd4 543 else
j3 2:02d228c25fd4 544 {
j3 17:b646b1e3970b 545 // loop checking 1WB bit for completion of 1-Wire operation
j3 17:b646b1e3970b 546 // abort if poll limit reached
j3 17:b646b1e3970b 547 //dummy write for loop
j3 23:e8e403d61359 548 result = OneWireMaster::Success; //so far
j3 17:b646b1e3970b 549 do
j3 17:b646b1e3970b 550 {
j3 17:b646b1e3970b 551 if(_p_i2c_bus->read(_r_adrs, &status, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 552 {
j3 23:e8e403d61359 553 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 554 }
j3 17:b646b1e3970b 555 }
j3 23:e8e403d61359 556 while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT) && (result != OneWireMaster::CommunicationReadError));
j3 17:b646b1e3970b 557
j3 23:e8e403d61359 558 if((result == OneWireMaster::CommunicationReadError) || (poll_count >= POLL_LIMIT))
j3 17:b646b1e3970b 559 {
j3 17:b646b1e3970b 560 // check for failure due to poll limit reached
j3 17:b646b1e3970b 561 if (poll_count >= POLL_LIMIT)
j3 17:b646b1e3970b 562 {
j3 17:b646b1e3970b 563 // handle error
j3 17:b646b1e3970b 564 // ...
j3 17:b646b1e3970b 565 reset();
j3 23:e8e403d61359 566 result = OneWireMaster::TimeoutError;
j3 17:b646b1e3970b 567 }
j3 17:b646b1e3970b 568 }
j3 17:b646b1e3970b 569 else
j3 17:b646b1e3970b 570 {
j3 17:b646b1e3970b 571 packet[0] = CMD_SRP;
j3 17:b646b1e3970b 572 packet[1] = 0xE1;
j3 17:b646b1e3970b 573
j3 17:b646b1e3970b 574 if(_p_i2c_bus->write(_w_adrs, packet, 2) != I2C_WRITE_OK)
j3 17:b646b1e3970b 575 {
j3 23:e8e403d61359 576 result = OneWireMaster::CommunicationWriteError;
j3 17:b646b1e3970b 577 }
j3 17:b646b1e3970b 578 else
j3 17:b646b1e3970b 579 {
j3 17:b646b1e3970b 580 if(_p_i2c_bus->read(_r_adrs, &data, 1) != I2C_READ_OK)
j3 17:b646b1e3970b 581 {
j3 23:e8e403d61359 582 result = OneWireMaster::CommunicationReadError;
j3 17:b646b1e3970b 583 }
j3 17:b646b1e3970b 584 else
j3 17:b646b1e3970b 585 {
j3 17:b646b1e3970b 586 recvbyte = data;
j3 23:e8e403d61359 587 result = OneWireMaster::Success;
j3 17:b646b1e3970b 588 }
j3 17:b646b1e3970b 589 }
j3 17:b646b1e3970b 590 }
j3 2:02d228c25fd4 591 }
j3 2:02d228c25fd4 592
j3 17:b646b1e3970b 593 return result;
j3 17:b646b1e3970b 594 }
j3 17:b646b1e3970b 595
j3 17:b646b1e3970b 596
j3 17:b646b1e3970b 597 //*********************************************************************
j3 23:e8e403d61359 598 OneWireMaster::CmdResult Ds248x::OWWriteBlock(const uint8_t *tran_buf, uint8_t tran_len)
j3 17:b646b1e3970b 599 {
j3 23:e8e403d61359 600 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 601
j3 17:b646b1e3970b 602 for(uint8_t idx = 0; idx < tran_len; idx++)
j3 17:b646b1e3970b 603 {
j3 17:b646b1e3970b 604 result = OWWriteByte(tran_buf[idx]);
j3 23:e8e403d61359 605 if(result != OneWireMaster::Success)
j3 17:b646b1e3970b 606 {
j3 17:b646b1e3970b 607 break;
j3 17:b646b1e3970b 608 }
j3 17:b646b1e3970b 609 }
j3 17:b646b1e3970b 610
j3 17:b646b1e3970b 611 return result;
j3 17:b646b1e3970b 612 }
j3 17:b646b1e3970b 613
j3 17:b646b1e3970b 614
j3 17:b646b1e3970b 615 //*********************************************************************
j3 23:e8e403d61359 616 OneWireMaster::CmdResult Ds248x::OWReadBlock(uint8_t *rx_buf, uint8_t rx_len)
j3 17:b646b1e3970b 617 {
j3 23:e8e403d61359 618 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 619
j3 17:b646b1e3970b 620 for(uint8_t idx = 0; idx < rx_len; idx++)
j3 17:b646b1e3970b 621 {
j3 17:b646b1e3970b 622 //OwReadByte() uses pass by reference
j3 17:b646b1e3970b 623 result = OWReadByte(rx_buf[idx]);
j3 23:e8e403d61359 624 if(result != OneWireMaster::Success)
j3 17:b646b1e3970b 625 {
j3 17:b646b1e3970b 626 break;
j3 17:b646b1e3970b 627 }
j3 17:b646b1e3970b 628 }
j3 17:b646b1e3970b 629
j3 17:b646b1e3970b 630 return result;
j3 1:91e52f8ab8bf 631 }
j3 1:91e52f8ab8bf 632
j3 1:91e52f8ab8bf 633
j3 1:91e52f8ab8bf 634 //*********************************************************************
j3 23:e8e403d61359 635 OneWireMaster::CmdResult Ds248x::OWSearch(RomId & romId)
j3 1:91e52f8ab8bf 636 {
j3 17:b646b1e3970b 637 int id_bit_number;
j3 17:b646b1e3970b 638 int last_zero, rom_byte_number;
j3 17:b646b1e3970b 639 int id_bit, cmp_id_bit;
j3 17:b646b1e3970b 640 unsigned char rom_byte_mask, status;
j3 17:b646b1e3970b 641 bool search_result;
j3 17:b646b1e3970b 642 unsigned char crc8 = 0;
j3 17:b646b1e3970b 643 SEARCH_DIRECTION search_direction;
j3 17:b646b1e3970b 644
j3 17:b646b1e3970b 645 // initialize for search
j3 17:b646b1e3970b 646 id_bit_number = 1;
j3 17:b646b1e3970b 647 last_zero = 0;
j3 17:b646b1e3970b 648 rom_byte_number = 0;
j3 17:b646b1e3970b 649 rom_byte_mask = 1;
j3 17:b646b1e3970b 650 search_result = false;
j3 2:02d228c25fd4 651
j3 17:b646b1e3970b 652 // if the last call was not the last one
j3 17:b646b1e3970b 653 if (!_last_device_flag)
j3 17:b646b1e3970b 654 {
j3 17:b646b1e3970b 655 // 1-Wire reset
j3 23:e8e403d61359 656 OneWireMaster::CmdResult result = OWReset();
j3 23:e8e403d61359 657 if (result != OneWireMaster::Success)
j3 17:b646b1e3970b 658 {
j3 17:b646b1e3970b 659 // reset the search
j3 17:b646b1e3970b 660 _last_discrepancy = 0;
j3 17:b646b1e3970b 661 _last_device_flag = false;
j3 17:b646b1e3970b 662 _last_family_discrepancy = 0;
j3 17:b646b1e3970b 663 return result;
j3 17:b646b1e3970b 664 }
j3 17:b646b1e3970b 665
j3 17:b646b1e3970b 666 // issue the search command
j3 17:b646b1e3970b 667 OWWriteByte(0xF0);
j3 2:02d228c25fd4 668
j3 17:b646b1e3970b 669 // loop to do the search
j3 17:b646b1e3970b 670 do
j3 17:b646b1e3970b 671 {
j3 17:b646b1e3970b 672 // if this discrepancy if before the Last Discrepancy
j3 17:b646b1e3970b 673 // on a previous next then pick the same as last time
j3 17:b646b1e3970b 674 if (id_bit_number < _last_discrepancy)
j3 17:b646b1e3970b 675 {
j3 17:b646b1e3970b 676 if ((romId[rom_byte_number] & rom_byte_mask) > 0)
j3 17:b646b1e3970b 677 search_direction = DIRECTION_WRITE_ONE;
j3 17:b646b1e3970b 678 else
j3 17:b646b1e3970b 679 search_direction = DIRECTION_WRITE_ZERO;
j3 17:b646b1e3970b 680 }
j3 17:b646b1e3970b 681 else
j3 17:b646b1e3970b 682 {
j3 17:b646b1e3970b 683 // if equal to last pick 1, if not then pick 0
j3 17:b646b1e3970b 684 if (id_bit_number == _last_discrepancy)
j3 17:b646b1e3970b 685 search_direction = DIRECTION_WRITE_ONE;
j3 17:b646b1e3970b 686 else
j3 17:b646b1e3970b 687 search_direction = DIRECTION_WRITE_ZERO;
j3 17:b646b1e3970b 688 }
j3 2:02d228c25fd4 689
j3 17:b646b1e3970b 690 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
j3 17:b646b1e3970b 691 search_triplet(search_direction, status);
j3 17:b646b1e3970b 692
j3 17:b646b1e3970b 693 // check bit results in status byte
j3 17:b646b1e3970b 694 id_bit = ((status & STATUS_SBR) == STATUS_SBR);
j3 17:b646b1e3970b 695 cmp_id_bit = ((status & STATUS_TSB) == STATUS_TSB);
j3 17:b646b1e3970b 696 search_direction = ((status & STATUS_DIR) == STATUS_DIR) ? DIRECTION_WRITE_ONE : DIRECTION_WRITE_ZERO;
j3 17:b646b1e3970b 697
j3 17:b646b1e3970b 698 // check for no devices on 1-wire
j3 17:b646b1e3970b 699 if ((id_bit) && (cmp_id_bit))
j3 17:b646b1e3970b 700 break;
j3 17:b646b1e3970b 701 else
j3 17:b646b1e3970b 702 {
j3 17:b646b1e3970b 703 if ((!id_bit) && (!cmp_id_bit) && (search_direction == DIRECTION_WRITE_ZERO))
j3 2:02d228c25fd4 704 {
j3 17:b646b1e3970b 705 last_zero = id_bit_number;
j3 17:b646b1e3970b 706
j3 17:b646b1e3970b 707 // check for Last discrepancy in family
j3 17:b646b1e3970b 708 if (last_zero < 9)
j3 17:b646b1e3970b 709 _last_family_discrepancy = last_zero;
j3 2:02d228c25fd4 710 }
j3 2:02d228c25fd4 711
j3 17:b646b1e3970b 712 // set or clear the bit in the ROM byte rom_byte_number
j3 17:b646b1e3970b 713 // with mask rom_byte_mask
j3 17:b646b1e3970b 714 if (search_direction == DIRECTION_WRITE_ONE)
j3 17:b646b1e3970b 715 romId[rom_byte_number] |= rom_byte_mask;
j3 17:b646b1e3970b 716 else
j3 17:b646b1e3970b 717 romId[rom_byte_number] &= (unsigned char)~rom_byte_mask;
j3 2:02d228c25fd4 718
j3 17:b646b1e3970b 719 // increment the byte counter id_bit_number
j3 17:b646b1e3970b 720 // and shift the mask rom_byte_mask
j3 17:b646b1e3970b 721 id_bit_number++;
j3 17:b646b1e3970b 722 rom_byte_mask <<= 1;
j3 2:02d228c25fd4 723
j3 17:b646b1e3970b 724 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
j3 17:b646b1e3970b 725 if (rom_byte_mask == 0)
j3 17:b646b1e3970b 726 {
j3 17:b646b1e3970b 727 crc8 = romId.calculateCRC8(crc8, romId[rom_byte_number]); // accumulate the CRC
j3 17:b646b1e3970b 728 rom_byte_number++;
j3 17:b646b1e3970b 729 rom_byte_mask = 1;
j3 17:b646b1e3970b 730 }
j3 17:b646b1e3970b 731 }
j3 17:b646b1e3970b 732 }
j3 17:b646b1e3970b 733 while(rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7
j3 2:02d228c25fd4 734
j3 17:b646b1e3970b 735 // if the search was successful then
j3 17:b646b1e3970b 736 if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0)))
j3 17:b646b1e3970b 737 {
j3 17:b646b1e3970b 738 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
j3 17:b646b1e3970b 739 _last_discrepancy = last_zero;
j3 2:02d228c25fd4 740
j3 17:b646b1e3970b 741 // check for last device
j3 17:b646b1e3970b 742 if (_last_discrepancy == 0)
j3 17:b646b1e3970b 743 _last_device_flag = true;
j3 2:02d228c25fd4 744
j3 17:b646b1e3970b 745 search_result = true;
j3 17:b646b1e3970b 746 }
j3 17:b646b1e3970b 747 }
j3 2:02d228c25fd4 748
j3 17:b646b1e3970b 749 // if no device found then reset counters so next 'search' will be like a first
j3 17:b646b1e3970b 750 if (!search_result || (romId.familyCode() == 0))
j3 17:b646b1e3970b 751 {
j3 17:b646b1e3970b 752 _last_discrepancy = 0;
j3 17:b646b1e3970b 753 _last_device_flag = false;
j3 17:b646b1e3970b 754 _last_family_discrepancy = 0;
j3 17:b646b1e3970b 755 search_result = false;
j3 17:b646b1e3970b 756 }
j3 2:02d228c25fd4 757
j3 23:e8e403d61359 758 return search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure;
j3 1:91e52f8ab8bf 759 }
j3 1:91e52f8ab8bf 760
j3 1:91e52f8ab8bf 761
j3 1:91e52f8ab8bf 762 //*********************************************************************
j3 23:e8e403d61359 763 OneWireMaster::CmdResult Ds248x::OWSpeed(OW_SPEED new_speed)
j3 1:91e52f8ab8bf 764 {
j3 2:02d228c25fd4 765 // set the speed
j3 5:ce108eeb878d 766 if (new_speed == SPEED_OVERDRIVE)
j3 2:02d228c25fd4 767 {
j3 2:02d228c25fd4 768 _c1WS = CONFIG_1WS;
j3 2:02d228c25fd4 769 }
j3 2:02d228c25fd4 770 else
j3 2:02d228c25fd4 771 {
j3 17:b646b1e3970b 772 _c1WS = 0;
j3 2:02d228c25fd4 773 }
j3 2:02d228c25fd4 774
j3 17:b646b1e3970b 775 // write the new config, and return result of op
j3 17:b646b1e3970b 776 return write_config(_c1WS | _cSPU | _cPDN | _cAPU);
j3 1:91e52f8ab8bf 777 }
j3 1:91e52f8ab8bf 778
j3 1:91e52f8ab8bf 779
j3 1:91e52f8ab8bf 780 //*********************************************************************
j3 23:e8e403d61359 781 OneWireMaster::CmdResult Ds248x::OWLevel(OW_LEVEL new_level)
j3 1:91e52f8ab8bf 782 {
j3 23:e8e403d61359 783 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 784
j3 2:02d228c25fd4 785 // function only will turn back to non-strong pull-up
j3 5:ce108eeb878d 786 if (new_level != LEVEL_NORMAL)
j3 2:02d228c25fd4 787 {
j3 23:e8e403d61359 788 result = OneWireMaster::OperationFailure;
j3 2:02d228c25fd4 789 }
j3 2:02d228c25fd4 790 else
j3 2:02d228c25fd4 791 {
j3 2:02d228c25fd4 792 // clear the strong pull-up bit in the global config state
j3 17:b646b1e3970b 793 _cSPU = 0;
j3 17:b646b1e3970b 794
j3 17:b646b1e3970b 795 result = write_config(_c1WS | _cSPU | _cPDN | _cAPU);
j3 2:02d228c25fd4 796 }
j3 2:02d228c25fd4 797
j3 17:b646b1e3970b 798 return result;
j3 1:91e52f8ab8bf 799 }
j3 1:91e52f8ab8bf 800
j3 1:91e52f8ab8bf 801
j3 1:91e52f8ab8bf 802 //*********************************************************************
j3 23:e8e403d61359 803 OneWireMaster::CmdResult Ds248x::OWWriteBytePower(uint8_t sendbyte)
j3 1:91e52f8ab8bf 804 {
j3 23:e8e403d61359 805 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 806
j3 2:02d228c25fd4 807 // set strong pull-up enable
j3 2:02d228c25fd4 808 _cSPU = CONFIG_SPU;
j3 2:02d228c25fd4 809
j3 2:02d228c25fd4 810 // write the new config
j3 17:b646b1e3970b 811 result = write_config(_c1WS | _cSPU | _cPDN | _cAPU);
j3 23:e8e403d61359 812 if (result == OneWireMaster::Success)
j3 2:02d228c25fd4 813 {
j3 2:02d228c25fd4 814 // perform write byte
j3 17:b646b1e3970b 815 result = OWWriteByte(sendbyte);
j3 2:02d228c25fd4 816 }
j3 2:02d228c25fd4 817
j3 17:b646b1e3970b 818 return result;
j3 1:91e52f8ab8bf 819 }
j3 1:91e52f8ab8bf 820
j3 1:91e52f8ab8bf 821
j3 1:91e52f8ab8bf 822 //*********************************************************************
j3 23:e8e403d61359 823 OneWireMaster::CmdResult Ds248x::OWReadBitPower(uint8_t applyPowerResponse)
j3 1:91e52f8ab8bf 824 {
j3 23:e8e403d61359 825 OneWireMaster::CmdResult result;
j3 2:02d228c25fd4 826 uint8_t rdbit;
j3 2:02d228c25fd4 827
j3 2:02d228c25fd4 828 // set strong pull-up enable
j3 2:02d228c25fd4 829 _cSPU = CONFIG_SPU;
j3 2:02d228c25fd4 830
j3 2:02d228c25fd4 831 // write the new config
j3 17:b646b1e3970b 832 result = write_config(_c1WS | _cSPU | _cPDN | _cAPU);
j3 23:e8e403d61359 833 if (result == OneWireMaster::Success)
j3 2:02d228c25fd4 834 {
j3 2:02d228c25fd4 835 // perform read bit
j3 17:b646b1e3970b 836 result = OWReadBit(rdbit);
j3 23:e8e403d61359 837 if(result == OneWireMaster::Success)
j3 2:02d228c25fd4 838 {
j3 17:b646b1e3970b 839 // check if response was correct, if not then turn off strong pull-up
j3 17:b646b1e3970b 840 if (rdbit != applyPowerResponse)
j3 17:b646b1e3970b 841 {
j3 17:b646b1e3970b 842 OWLevel(LEVEL_NORMAL);
j3 23:e8e403d61359 843 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 844 }
j3 2:02d228c25fd4 845 }
j3 2:02d228c25fd4 846 }
j3 2:02d228c25fd4 847
j3 17:b646b1e3970b 848 return result;
j3 1:91e52f8ab8bf 849 }
j3 1:91e52f8ab8bf 850
j3 1:91e52f8ab8bf 851
j3 23:e8e403d61359 852 OneWireMaster::CmdResult Ds248x::OWReadBytePower(uint8_t & recvbyte)
IanBenzMaxim 21:00c94aeb533e 853 {
j3 23:e8e403d61359 854 OneWireMaster::CmdResult result = Success;
IanBenzMaxim 21:00c94aeb533e 855 uint8_t recvbit;
IanBenzMaxim 21:00c94aeb533e 856
IanBenzMaxim 21:00c94aeb533e 857 recvbyte = 0;
IanBenzMaxim 21:00c94aeb533e 858 for (unsigned int i = 1; i <= 8; i++)
IanBenzMaxim 21:00c94aeb533e 859 {
IanBenzMaxim 21:00c94aeb533e 860 // Set strong pull-up on last bit
IanBenzMaxim 21:00c94aeb533e 861 if (i == 8)
IanBenzMaxim 21:00c94aeb533e 862 {
IanBenzMaxim 21:00c94aeb533e 863 // set strong pull-up enable
IanBenzMaxim 21:00c94aeb533e 864 _cSPU = CONFIG_SPU;
IanBenzMaxim 21:00c94aeb533e 865
IanBenzMaxim 21:00c94aeb533e 866 // write the new config
IanBenzMaxim 21:00c94aeb533e 867 result = write_config(_c1WS | _cSPU | _cPDN | _cAPU);
IanBenzMaxim 21:00c94aeb533e 868 if (result != Success)
IanBenzMaxim 21:00c94aeb533e 869 break;
IanBenzMaxim 21:00c94aeb533e 870 }
IanBenzMaxim 21:00c94aeb533e 871 result = OWReadBit(recvbit);
IanBenzMaxim 21:00c94aeb533e 872 if (result != Success)
IanBenzMaxim 21:00c94aeb533e 873 break;
IanBenzMaxim 21:00c94aeb533e 874 recvbyte = (recvbyte << 1) | recvbit;
IanBenzMaxim 21:00c94aeb533e 875 }
IanBenzMaxim 21:00c94aeb533e 876
IanBenzMaxim 21:00c94aeb533e 877 return result;
IanBenzMaxim 21:00c94aeb533e 878 }
IanBenzMaxim 21:00c94aeb533e 879
IanBenzMaxim 21:00c94aeb533e 880
j3 1:91e52f8ab8bf 881 //*********************************************************************
j3 6:1faafa0b3cd7 882 void Ds248x::set_i2c_adrs(DS248X_I2C_ADRS adrs)
j3 6:1faafa0b3cd7 883 {
j3 6:1faafa0b3cd7 884 _w_adrs = (adrs << 1);
j3 6:1faafa0b3cd7 885 _r_adrs = (_w_adrs | 1);
j3 6:1faafa0b3cd7 886 }