Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
mfruge
Date:
Tue Aug 13 14:42:37 2019 +0000
Revision:
142:85b71cfd617e
Parent:
120:200109b73e3c
Added functions to ROMCommands to add Alarm Search functionality

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