Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Thu May 12 14:38:16 2016 -0500
Revision:
73:2cecc1372acc
Parent:
OneWire_Masters/DS248x/ds248x.cpp@72:6892702709ee
Child:
74:23be10c32fa3
Added namespaces. Renamed files and directories for consistency. Use <stdint.h> instead of <cstdint> since it is not supported by C++98.

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
IanBenzMaxim 73:2cecc1372acc 33 #include "DS248x.h"
IanBenzMaxim 73:2cecc1372acc 34 #include "I2C.h"
j3 1:91e52f8ab8bf 35
IanBenzMaxim 73:2cecc1372acc 36 using OneWire::Masters::OneWireMaster;
IanBenzMaxim 73:2cecc1372acc 37 using OneWire::Masters::DS248x;
j3 1:91e52f8ab8bf 38
IanBenzMaxim 69:f915c4c59a69 39 enum DS248X_STATUS_BITS
IanBenzMaxim 69:f915c4c59a69 40 {
IanBenzMaxim 69:f915c4c59a69 41 STATUS_1WB = 0x01,
IanBenzMaxim 69:f915c4c59a69 42 STATUS_PPD = 0x02,
IanBenzMaxim 69:f915c4c59a69 43 STATUS_SD = 0x04,
IanBenzMaxim 69:f915c4c59a69 44 STATUS_LL = 0x08,
IanBenzMaxim 69:f915c4c59a69 45 STATUS_RST = 0x10,
IanBenzMaxim 69:f915c4c59a69 46 STATUS_SBR = 0x20,
IanBenzMaxim 69:f915c4c59a69 47 STATUS_TSB = 0x40,
IanBenzMaxim 69:f915c4c59a69 48 STATUS_DIR = 0x80
IanBenzMaxim 69:f915c4c59a69 49 };
IanBenzMaxim 69:f915c4c59a69 50
IanBenzMaxim 69:f915c4c59a69 51 static const int I2C_WRITE_OK = 0;
IanBenzMaxim 69:f915c4c59a69 52 static const int I2C_READ_OK = 0;
IanBenzMaxim 69:f915c4c59a69 53
IanBenzMaxim 73:2cecc1372acc 54 uint8_t DS248x::Config::readByte() const
IanBenzMaxim 69:f915c4c59a69 55 {
IanBenzMaxim 73:2cecc1372acc 56 uint8_t config = 0;
IanBenzMaxim 71:562f5c702094 57 if (get1WS())
IanBenzMaxim 69:f915c4c59a69 58 config |= 0x08;
IanBenzMaxim 71:562f5c702094 59 if (getSPU())
IanBenzMaxim 69:f915c4c59a69 60 config |= 0x04;
IanBenzMaxim 71:562f5c702094 61 if (getPDN())
IanBenzMaxim 69:f915c4c59a69 62 config |= 0x02;
IanBenzMaxim 71:562f5c702094 63 if (getAPU())
IanBenzMaxim 69:f915c4c59a69 64 config |= 0x01;
IanBenzMaxim 69:f915c4c59a69 65 return config;
IanBenzMaxim 69:f915c4c59a69 66 }
IanBenzMaxim 69:f915c4c59a69 67
IanBenzMaxim 73:2cecc1372acc 68 uint8_t DS248x::Config::writeByte() const
IanBenzMaxim 69:f915c4c59a69 69 {
IanBenzMaxim 73:2cecc1372acc 70 uint8_t config = readByte();
IanBenzMaxim 69:f915c4c59a69 71 return ((~config << 4) | config);
IanBenzMaxim 69:f915c4c59a69 72 }
IanBenzMaxim 69:f915c4c59a69 73
IanBenzMaxim 73:2cecc1372acc 74 void DS248x::Config::reset()
IanBenzMaxim 69:f915c4c59a69 75 {
IanBenzMaxim 71:562f5c702094 76 set1WS(false);
IanBenzMaxim 71:562f5c702094 77 setSPU(false);
IanBenzMaxim 71:562f5c702094 78 setPDN(false);
IanBenzMaxim 71:562f5c702094 79 setAPU(true);
IanBenzMaxim 69:f915c4c59a69 80 }
IanBenzMaxim 69:f915c4c59a69 81
IanBenzMaxim 73:2cecc1372acc 82 DS248x::DS248x(mbed::I2C & i2c_bus, uint8_t adrs)
IanBenzMaxim 73:2cecc1372acc 83 :_p_i2c_bus(&i2c_bus), _adrs(adrs), _i2c_owner(false)
IanBenzMaxim 73:2cecc1372acc 84 {
IanBenzMaxim 69:f915c4c59a69 85
j3 1:91e52f8ab8bf 86 }
j3 1:91e52f8ab8bf 87
IanBenzMaxim 73:2cecc1372acc 88 DS248x::DS248x(PinName sda, PinName scl, uint8_t adrs)
IanBenzMaxim 73:2cecc1372acc 89 :_p_i2c_bus(new mbed::I2C(sda, scl)), _adrs(adrs), _i2c_owner(true)
IanBenzMaxim 73:2cecc1372acc 90 {
j3 1:91e52f8ab8bf 91
j3 1:91e52f8ab8bf 92 }
j3 1:91e52f8ab8bf 93
IanBenzMaxim 73:2cecc1372acc 94 DS248x::~DS248x()
j3 1:91e52f8ab8bf 95 {
j3 5:ce108eeb878d 96 if(_i2c_owner)
j3 1:91e52f8ab8bf 97 {
j3 1:91e52f8ab8bf 98 delete _p_i2c_bus;
j3 1:91e52f8ab8bf 99 }
j3 1:91e52f8ab8bf 100 }
j3 1:91e52f8ab8bf 101
IanBenzMaxim 73:2cecc1372acc 102 OneWireMaster::CmdResult DS248x::OWInitMaster(void)
j3 14:7b2886a50321 103 {
IanBenzMaxim 69:f915c4c59a69 104 OneWireMaster::CmdResult result;
j3 14:7b2886a50321 105
IanBenzMaxim 69:f915c4c59a69 106 // reset DS2465
j3 17:b646b1e3970b 107 result = reset();
IanBenzMaxim 69:f915c4c59a69 108 if (result != OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 109 return result;
IanBenzMaxim 69:f915c4c59a69 110
IanBenzMaxim 69:f915c4c59a69 111 // write the default configuration setup
IanBenzMaxim 69:f915c4c59a69 112 Config defaultConfig;
IanBenzMaxim 69:f915c4c59a69 113 result = writeConfig(defaultConfig, true);
j3 17:b646b1e3970b 114 return result;
j3 2:02d228c25fd4 115 }
j3 2:02d228c25fd4 116
IanBenzMaxim 73:2cecc1372acc 117 OneWireMaster::CmdResult DS248x::reset(void)
IanBenzMaxim 69:f915c4c59a69 118 {
j3 2:02d228c25fd4 119 // Device Reset
j3 2:02d228c25fd4 120 // S AD,0 [A] DRST [A] Sr AD,1 [A] [SS] A\ P
j3 2:02d228c25fd4 121 // [] indicates from slave
j3 2:02d228c25fd4 122 // SS status byte to read to verify state
j3 2:02d228c25fd4 123
IanBenzMaxim 69:f915c4c59a69 124 OneWireMaster::CmdResult result;
IanBenzMaxim 73:2cecc1372acc 125 uint8_t buf;
IanBenzMaxim 69:f915c4c59a69 126
IanBenzMaxim 69:f915c4c59a69 127 result = sendCommand(CMD_DRST);
IanBenzMaxim 69:f915c4c59a69 128
IanBenzMaxim 69:f915c4c59a69 129 if (result == OneWireMaster::Success)
IanBenzMaxim 73:2cecc1372acc 130 result = readRegister(StatusReg, buf, true);
IanBenzMaxim 69:f915c4c59a69 131
IanBenzMaxim 69:f915c4c59a69 132 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 133 {
IanBenzMaxim 73:2cecc1372acc 134 if ((buf & 0xF7) != 0x10)
IanBenzMaxim 73:2cecc1372acc 135 result = OneWireMaster::OperationFailure;
IanBenzMaxim 69:f915c4c59a69 136 }
IanBenzMaxim 69:f915c4c59a69 137
IanBenzMaxim 69:f915c4c59a69 138 if (result == OneWireMaster::Success)
IanBenzMaxim 73:2cecc1372acc 139 OWReset(); // do a command to get 1-Wire master reset out of holding state
IanBenzMaxim 69:f915c4c59a69 140
IanBenzMaxim 69:f915c4c59a69 141 return result;
j3 2:02d228c25fd4 142 }
j3 2:02d228c25fd4 143
IanBenzMaxim 73:2cecc1372acc 144 OneWireMaster::CmdResult DS248x::selectChannel(uint8_t channel)
j3 2:02d228c25fd4 145 {
j3 23:e8e403d61359 146 OneWireMaster::CmdResult result;
IanBenzMaxim 69:f915c4c59a69 147 uint8_t ch, ch_read;
j3 2:02d228c25fd4 148
j3 2:02d228c25fd4 149 // Channel Select (Case A)
j3 2:02d228c25fd4 150 // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P
j3 2:02d228c25fd4 151 // [] indicates from slave
j3 2:02d228c25fd4 152 // CC channel value
j3 2:02d228c25fd4 153 // RR channel read back
j3 2:02d228c25fd4 154
j3 2:02d228c25fd4 155 switch (channel)
j3 2:02d228c25fd4 156 {
j3 2:02d228c25fd4 157 default: case 0: ch = 0xF0; ch_read = 0xB8; break;
j3 2:02d228c25fd4 158 case 1: ch = 0xE1; ch_read = 0xB1; break;
j3 2:02d228c25fd4 159 case 2: ch = 0xD2; ch_read = 0xAA; break;
j3 2:02d228c25fd4 160 case 3: ch = 0xC3; ch_read = 0xA3; break;
j3 2:02d228c25fd4 161 case 4: ch = 0xB4; ch_read = 0x9C; break;
j3 2:02d228c25fd4 162 case 5: ch = 0xA5; ch_read = 0x95; break;
j3 2:02d228c25fd4 163 case 6: ch = 0x96; ch_read = 0x8E; break;
j3 2:02d228c25fd4 164 case 7: ch = 0x87; ch_read = 0x87; break;
j3 2:02d228c25fd4 165 };
j3 2:02d228c25fd4 166
IanBenzMaxim 69:f915c4c59a69 167 result = sendCommand(CMD_CHSL, ch);
IanBenzMaxim 69:f915c4c59a69 168 if (result == OneWireMaster::Success)
j3 17:b646b1e3970b 169 {
IanBenzMaxim 73:2cecc1372acc 170 result = readRegister(ChannelSelectReg, ch, true);
IanBenzMaxim 69:f915c4c59a69 171 if (result == OneWireMaster::Success)
j3 17:b646b1e3970b 172 {
j3 17:b646b1e3970b 173 // check for failure due to incorrect read back of channel
IanBenzMaxim 69:f915c4c59a69 174 if (ch != ch_read)
j3 17:b646b1e3970b 175 {
j3 23:e8e403d61359 176 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 177 }
j3 2:02d228c25fd4 178 }
j3 2:02d228c25fd4 179 }
j3 17:b646b1e3970b 180
j3 17:b646b1e3970b 181 return result;
j3 1:91e52f8ab8bf 182 }
j3 1:91e52f8ab8bf 183
IanBenzMaxim 73:2cecc1372acc 184 OneWireMaster::CmdResult DS248x::adjustOwPort(OwAdjustParam param, uint8_t val)
j3 1:91e52f8ab8bf 185 {
j3 23:e8e403d61359 186 OneWireMaster::CmdResult result;
j3 17:b646b1e3970b 187
IanBenzMaxim 69:f915c4c59a69 188 uint8_t read_port_config;
IanBenzMaxim 69:f915c4c59a69 189 uint8_t control_byte;
IanBenzMaxim 69:f915c4c59a69 190
IanBenzMaxim 69:f915c4c59a69 191 control_byte = (((param & 0x0F) << 4) | (val & 0x0F));
IanBenzMaxim 69:f915c4c59a69 192
IanBenzMaxim 69:f915c4c59a69 193 result = sendCommand(CMD_A1WP, control_byte);
IanBenzMaxim 69:f915c4c59a69 194 if (result != Success)
IanBenzMaxim 26:a361e3f42ba5 195 return result;
IanBenzMaxim 69:f915c4c59a69 196
IanBenzMaxim 73:2cecc1372acc 197 result = readRegister(PortConfigReg, read_port_config, true);
IanBenzMaxim 69:f915c4c59a69 198 if (result != Success)
IanBenzMaxim 69:f915c4c59a69 199 return result;
IanBenzMaxim 69:f915c4c59a69 200
IanBenzMaxim 69:f915c4c59a69 201 if ((control_byte & 0x0F) != read_port_config)
IanBenzMaxim 69:f915c4c59a69 202 result = OneWireMaster::OperationFailure;
IanBenzMaxim 26:a361e3f42ba5 203
IanBenzMaxim 69:f915c4c59a69 204 return result;
IanBenzMaxim 69:f915c4c59a69 205 }
IanBenzMaxim 69:f915c4c59a69 206
IanBenzMaxim 73:2cecc1372acc 207 OneWireMaster::CmdResult DS248x::OWTriplet(SearchDirection & search_direction, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 69:f915c4c59a69 208 {
IanBenzMaxim 69:f915c4c59a69 209 // 1-Wire Triplet (Case B)
IanBenzMaxim 69:f915c4c59a69 210 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 69:f915c4c59a69 211 // \--------/
IanBenzMaxim 69:f915c4c59a69 212 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 213 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 214 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 69:f915c4c59a69 215
IanBenzMaxim 69:f915c4c59a69 216 OneWireMaster::CmdResult result;
IanBenzMaxim 73:2cecc1372acc 217 result = sendCommand(CMD_1WT, (uint8_t)((search_direction == DIRECTION_WRITE_ONE) ? 0x80 : 0x00));
IanBenzMaxim 69:f915c4c59a69 218 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 219 {
IanBenzMaxim 73:2cecc1372acc 220 uint8_t status;
IanBenzMaxim 69:f915c4c59a69 221 result = pollBusy(&status);
IanBenzMaxim 69:f915c4c59a69 222 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 223 {
IanBenzMaxim 69:f915c4c59a69 224 // check bit results in status byte
IanBenzMaxim 69:f915c4c59a69 225 sbr = ((status & STATUS_SBR) == STATUS_SBR);
IanBenzMaxim 69:f915c4c59a69 226 tsb = ((status & STATUS_TSB) == STATUS_TSB);
IanBenzMaxim 69:f915c4c59a69 227 search_direction = ((status & STATUS_DIR) == STATUS_DIR) ? DIRECTION_WRITE_ONE : DIRECTION_WRITE_ZERO;
IanBenzMaxim 69:f915c4c59a69 228 }
IanBenzMaxim 69:f915c4c59a69 229 }
IanBenzMaxim 69:f915c4c59a69 230 return result;
IanBenzMaxim 69:f915c4c59a69 231 }
IanBenzMaxim 69:f915c4c59a69 232
IanBenzMaxim 73:2cecc1372acc 233 OneWireMaster::CmdResult DS248x::OWReset(void)
IanBenzMaxim 69:f915c4c59a69 234 {
IanBenzMaxim 69:f915c4c59a69 235 // 1-Wire reset (Case B)
IanBenzMaxim 69:f915c4c59a69 236 // S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 69:f915c4c59a69 237 // \--------/
IanBenzMaxim 69:f915c4c59a69 238 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 239 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 240
IanBenzMaxim 69:f915c4c59a69 241 OneWireMaster::CmdResult result;
IanBenzMaxim 73:2cecc1372acc 242 uint8_t buf;
IanBenzMaxim 69:f915c4c59a69 243
IanBenzMaxim 69:f915c4c59a69 244 result = sendCommand(CMD_1WRS);
IanBenzMaxim 69:f915c4c59a69 245
IanBenzMaxim 69:f915c4c59a69 246 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 247 result = pollBusy(&buf);
IanBenzMaxim 69:f915c4c59a69 248
IanBenzMaxim 69:f915c4c59a69 249 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 250 {
IanBenzMaxim 69:f915c4c59a69 251 // check for presence detect
IanBenzMaxim 69:f915c4c59a69 252 if ((buf & STATUS_PPD) != STATUS_PPD)
IanBenzMaxim 69:f915c4c59a69 253 result = OneWireMaster::OperationFailure;
IanBenzMaxim 69:f915c4c59a69 254 }
IanBenzMaxim 69:f915c4c59a69 255
IanBenzMaxim 69:f915c4c59a69 256 return result;
IanBenzMaxim 69:f915c4c59a69 257 }
IanBenzMaxim 69:f915c4c59a69 258
IanBenzMaxim 73:2cecc1372acc 259 OneWireMaster::CmdResult DS248x::OWTouchBitSetLevel(uint8_t & sendrecvbit, OWLevel after_level)
IanBenzMaxim 69:f915c4c59a69 260 {
j3 2:02d228c25fd4 261 // 1-Wire bit (Case B)
j3 2:02d228c25fd4 262 // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 263 // \--------/
j3 2:02d228c25fd4 264 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 265 // [] indicates from slave
j3 2:02d228c25fd4 266 // BB indicates byte containing bit value in msbit
j3 2:02d228c25fd4 267
IanBenzMaxim 69:f915c4c59a69 268 OneWireMaster::CmdResult result;
IanBenzMaxim 69:f915c4c59a69 269
IanBenzMaxim 69:f915c4c59a69 270 result = configureLevel(after_level);
IanBenzMaxim 69:f915c4c59a69 271 if (result != OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 272 return result;
IanBenzMaxim 69:f915c4c59a69 273
IanBenzMaxim 73:2cecc1372acc 274 uint8_t status;
IanBenzMaxim 69:f915c4c59a69 275
IanBenzMaxim 73:2cecc1372acc 276 result = sendCommand(CMD_1WSB, (uint8_t)(sendrecvbit ? 0x80 : 0x00));
IanBenzMaxim 69:f915c4c59a69 277
IanBenzMaxim 69:f915c4c59a69 278 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 279 result = pollBusy(&status);
IanBenzMaxim 69:f915c4c59a69 280
IanBenzMaxim 69:f915c4c59a69 281 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 282 sendrecvbit = (status & STATUS_SBR);
IanBenzMaxim 69:f915c4c59a69 283
IanBenzMaxim 69:f915c4c59a69 284 return result;
j3 1:91e52f8ab8bf 285 }
j3 1:91e52f8ab8bf 286
IanBenzMaxim 73:2cecc1372acc 287 OneWireMaster::CmdResult DS248x::OWWriteByteSetLevel(uint8_t sendbyte, OWLevel after_level)
j3 1:91e52f8ab8bf 288 {
j3 2:02d228c25fd4 289 // 1-Wire Write Byte (Case B)
j3 2:02d228c25fd4 290 // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 291 // \--------/
j3 2:02d228c25fd4 292 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 293 // [] indicates from slave
j3 2:02d228c25fd4 294 // DD data to write
j3 2:02d228c25fd4 295
IanBenzMaxim 69:f915c4c59a69 296 OneWireMaster::CmdResult result;
IanBenzMaxim 69:f915c4c59a69 297
IanBenzMaxim 69:f915c4c59a69 298 result = configureLevel(after_level);
IanBenzMaxim 69:f915c4c59a69 299 if (result != OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 300 return result;
IanBenzMaxim 69:f915c4c59a69 301
IanBenzMaxim 69:f915c4c59a69 302 result = sendCommand(CMD_1WWB, sendbyte);
IanBenzMaxim 69:f915c4c59a69 303 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 304 result = pollBusy();
j3 2:02d228c25fd4 305
IanBenzMaxim 69:f915c4c59a69 306 return result;
j3 1:91e52f8ab8bf 307 }
j3 1:91e52f8ab8bf 308
IanBenzMaxim 73:2cecc1372acc 309 OneWireMaster::CmdResult DS248x::OWReadByteSetLevel(uint8_t & recvbyte, OWLevel after_level)
j3 1:91e52f8ab8bf 310 {
IanBenzMaxim 69:f915c4c59a69 311 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 69:f915c4c59a69 312 // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A\
IanBenzMaxim 69:f915c4c59a69 313 // \--------/
IanBenzMaxim 69:f915c4c59a69 314 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 315 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 69:f915c4c59a69 316 //
IanBenzMaxim 69:f915c4c59a69 317 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 318 // DD data read
IanBenzMaxim 26:a361e3f42ba5 319
IanBenzMaxim 69:f915c4c59a69 320 OneWireMaster::CmdResult result;
IanBenzMaxim 73:2cecc1372acc 321 uint8_t buf;
IanBenzMaxim 69:f915c4c59a69 322
IanBenzMaxim 69:f915c4c59a69 323 result = configureLevel(after_level);
IanBenzMaxim 69:f915c4c59a69 324 if (result != OneWireMaster::Success)
j3 17:b646b1e3970b 325 return result;
IanBenzMaxim 69:f915c4c59a69 326
IanBenzMaxim 69:f915c4c59a69 327 result = sendCommand(CMD_1WRB);
IanBenzMaxim 69:f915c4c59a69 328
IanBenzMaxim 69:f915c4c59a69 329 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 330 result = pollBusy();
IanBenzMaxim 69:f915c4c59a69 331
IanBenzMaxim 69:f915c4c59a69 332 if (result == OneWireMaster::Success)
IanBenzMaxim 73:2cecc1372acc 333 result = readRegister(ReadDataReg, buf);
IanBenzMaxim 69:f915c4c59a69 334
IanBenzMaxim 69:f915c4c59a69 335 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 336 recvbyte = buf;
IanBenzMaxim 69:f915c4c59a69 337
IanBenzMaxim 69:f915c4c59a69 338 return result;
j3 17:b646b1e3970b 339 }
j3 17:b646b1e3970b 340
IanBenzMaxim 73:2cecc1372acc 341 OneWireMaster::CmdResult DS248x::OWSetSpeed(OWSpeed new_speed)
j3 1:91e52f8ab8bf 342 {
IanBenzMaxim 69:f915c4c59a69 343 // Requested speed is already set
IanBenzMaxim 71:562f5c702094 344 if (m_curConfig.get1WS() == (new_speed == SPEED_OVERDRIVE))
IanBenzMaxim 69:f915c4c59a69 345 return OneWireMaster::Success;
IanBenzMaxim 69:f915c4c59a69 346
IanBenzMaxim 69:f915c4c59a69 347 // set the speed
IanBenzMaxim 69:f915c4c59a69 348 Config newConfig = m_curConfig;
IanBenzMaxim 71:562f5c702094 349 newConfig.set1WS(new_speed == SPEED_OVERDRIVE);
j3 2:02d228c25fd4 350
IanBenzMaxim 69:f915c4c59a69 351 // write the new config
IanBenzMaxim 69:f915c4c59a69 352 return writeConfig(newConfig, true);
j3 1:91e52f8ab8bf 353 }
j3 1:91e52f8ab8bf 354
IanBenzMaxim 73:2cecc1372acc 355 OneWireMaster::CmdResult DS248x::OWSetLevel(OWLevel new_level)
j3 1:91e52f8ab8bf 356 {
IanBenzMaxim 69:f915c4c59a69 357 if (new_level == LEVEL_STRONG)
IanBenzMaxim 73:2cecc1372acc 358 {
IanBenzMaxim 69:f915c4c59a69 359 return OneWireMaster::OperationFailure;
IanBenzMaxim 73:2cecc1372acc 360 }
IanBenzMaxim 73:2cecc1372acc 361
IanBenzMaxim 69:f915c4c59a69 362 return configureLevel(new_level);
IanBenzMaxim 21:00c94aeb533e 363 }
IanBenzMaxim 21:00c94aeb533e 364
IanBenzMaxim 73:2cecc1372acc 365 OneWireMaster::CmdResult DS248x::writeConfig(const Config & config, bool verify)
j3 6:1faafa0b3cd7 366 {
IanBenzMaxim 73:2cecc1372acc 367 uint8_t configBuf;
IanBenzMaxim 69:f915c4c59a69 368 OneWireMaster::CmdResult result;
IanBenzMaxim 69:f915c4c59a69 369
IanBenzMaxim 69:f915c4c59a69 370 configBuf = config.writeByte();
IanBenzMaxim 69:f915c4c59a69 371 result = sendCommand(CMD_WCFG, configBuf);
IanBenzMaxim 69:f915c4c59a69 372 if (verify)
IanBenzMaxim 69:f915c4c59a69 373 {
IanBenzMaxim 69:f915c4c59a69 374 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 375 {
IanBenzMaxim 73:2cecc1372acc 376 result = readRegister(ConfigReg, configBuf);
IanBenzMaxim 69:f915c4c59a69 377 }
IanBenzMaxim 69:f915c4c59a69 378 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 379 {
IanBenzMaxim 69:f915c4c59a69 380 if (configBuf != config.readByte())
IanBenzMaxim 69:f915c4c59a69 381 result = OneWireMaster::OperationFailure;
IanBenzMaxim 69:f915c4c59a69 382 }
IanBenzMaxim 69:f915c4c59a69 383 }
IanBenzMaxim 69:f915c4c59a69 384
IanBenzMaxim 69:f915c4c59a69 385 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 386 m_curConfig = config;
IanBenzMaxim 69:f915c4c59a69 387
IanBenzMaxim 69:f915c4c59a69 388 return result;
IanBenzMaxim 69:f915c4c59a69 389 }
IanBenzMaxim 69:f915c4c59a69 390
IanBenzMaxim 73:2cecc1372acc 391 OneWireMaster::CmdResult DS248x::readRegister(Register reg, uint8_t & buf, bool skipSetPointer) const
IanBenzMaxim 69:f915c4c59a69 392 {
IanBenzMaxim 69:f915c4c59a69 393 CmdResult result;
IanBenzMaxim 69:f915c4c59a69 394 result = sendCommand(CMD_SRP, reg);
IanBenzMaxim 69:f915c4c59a69 395 if (result == Success)
IanBenzMaxim 69:f915c4c59a69 396 {
IanBenzMaxim 73:2cecc1372acc 397 if (_p_i2c_bus->read(_adrs, reinterpret_cast<char *>(&buf), 1) != I2C_READ_OK)
IanBenzMaxim 73:2cecc1372acc 398 {
IanBenzMaxim 69:f915c4c59a69 399 result = CommunicationReadError;
IanBenzMaxim 73:2cecc1372acc 400 }
IanBenzMaxim 69:f915c4c59a69 401 }
IanBenzMaxim 69:f915c4c59a69 402 return result;
IanBenzMaxim 69:f915c4c59a69 403 }
IanBenzMaxim 69:f915c4c59a69 404
IanBenzMaxim 73:2cecc1372acc 405 OneWireMaster::CmdResult DS248x::pollBusy(uint8_t * pStatus)
IanBenzMaxim 69:f915c4c59a69 406 {
IanBenzMaxim 69:f915c4c59a69 407 const unsigned int pollLimit = 200;
IanBenzMaxim 69:f915c4c59a69 408
IanBenzMaxim 69:f915c4c59a69 409 OneWireMaster::CmdResult result;
IanBenzMaxim 73:2cecc1372acc 410 uint8_t status;
IanBenzMaxim 69:f915c4c59a69 411 unsigned int pollCount = 0;
IanBenzMaxim 69:f915c4c59a69 412
IanBenzMaxim 69:f915c4c59a69 413 do
IanBenzMaxim 69:f915c4c59a69 414 {
IanBenzMaxim 73:2cecc1372acc 415 result = readRegister(StatusReg, status, true);
IanBenzMaxim 69:f915c4c59a69 416 if (result != OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 417 return result;
IanBenzMaxim 69:f915c4c59a69 418 if (pStatus != NULL)
IanBenzMaxim 69:f915c4c59a69 419 *pStatus = status;
IanBenzMaxim 69:f915c4c59a69 420 if (pollCount++ >= pollLimit)
IanBenzMaxim 69:f915c4c59a69 421 return OneWireMaster::TimeoutError;
IanBenzMaxim 69:f915c4c59a69 422 } while (status & STATUS_1WB);
IanBenzMaxim 69:f915c4c59a69 423
IanBenzMaxim 69:f915c4c59a69 424 return OneWireMaster::Success;
IanBenzMaxim 69:f915c4c59a69 425 }
IanBenzMaxim 69:f915c4c59a69 426
IanBenzMaxim 73:2cecc1372acc 427 OneWireMaster::CmdResult DS248x::configureLevel(OWLevel level)
IanBenzMaxim 69:f915c4c59a69 428 {
IanBenzMaxim 69:f915c4c59a69 429 OneWireMaster::CmdResult result;
IanBenzMaxim 71:562f5c702094 430 if (m_curConfig.getSPU() != (level == LEVEL_STRONG))
IanBenzMaxim 69:f915c4c59a69 431 {
IanBenzMaxim 69:f915c4c59a69 432 Config newConfig = m_curConfig;
IanBenzMaxim 71:562f5c702094 433 newConfig.setSPU(level == LEVEL_STRONG);
IanBenzMaxim 69:f915c4c59a69 434 result = writeConfig(newConfig, true);
IanBenzMaxim 69:f915c4c59a69 435 }
IanBenzMaxim 69:f915c4c59a69 436 else
IanBenzMaxim 69:f915c4c59a69 437 {
IanBenzMaxim 69:f915c4c59a69 438 result = OneWireMaster::Success;
IanBenzMaxim 69:f915c4c59a69 439 }
IanBenzMaxim 69:f915c4c59a69 440 return result;
IanBenzMaxim 69:f915c4c59a69 441 }
IanBenzMaxim 69:f915c4c59a69 442
IanBenzMaxim 73:2cecc1372acc 443 OneWireMaster::CmdResult DS248x::sendCommand(DS248X_CMDS cmd) const
IanBenzMaxim 69:f915c4c59a69 444 {
IanBenzMaxim 69:f915c4c59a69 445 CmdResult result;
IanBenzMaxim 73:2cecc1372acc 446 if (_p_i2c_bus->write(_adrs, reinterpret_cast<const char *>(&cmd), 1) == I2C_WRITE_OK)
IanBenzMaxim 73:2cecc1372acc 447 {
IanBenzMaxim 69:f915c4c59a69 448 result = Success;
IanBenzMaxim 73:2cecc1372acc 449 }
IanBenzMaxim 69:f915c4c59a69 450 else
IanBenzMaxim 73:2cecc1372acc 451 {
IanBenzMaxim 69:f915c4c59a69 452 result = CommunicationWriteError;
IanBenzMaxim 73:2cecc1372acc 453 }
IanBenzMaxim 69:f915c4c59a69 454 return result;
IanBenzMaxim 69:f915c4c59a69 455 }
IanBenzMaxim 69:f915c4c59a69 456
IanBenzMaxim 73:2cecc1372acc 457 OneWireMaster::CmdResult DS248x::sendCommand(DS248X_CMDS cmd, uint8_t param) const
IanBenzMaxim 69:f915c4c59a69 458 {
IanBenzMaxim 69:f915c4c59a69 459 CmdResult result;
IanBenzMaxim 69:f915c4c59a69 460 char buf[2] = { cmd, param };
IanBenzMaxim 73:2cecc1372acc 461 if (_p_i2c_bus->write(_adrs, buf, 2) == I2C_WRITE_OK)
IanBenzMaxim 73:2cecc1372acc 462 {
IanBenzMaxim 69:f915c4c59a69 463 result = Success;
IanBenzMaxim 73:2cecc1372acc 464 }
IanBenzMaxim 69:f915c4c59a69 465 else
IanBenzMaxim 73:2cecc1372acc 466 {
IanBenzMaxim 69:f915c4c59a69 467 result = CommunicationWriteError;
IanBenzMaxim 73:2cecc1372acc 468 }
IanBenzMaxim 69:f915c4c59a69 469 return result;
IanBenzMaxim 69:f915c4c59a69 470 }