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:
IanBenzMaxim
Date:
Mon May 09 16:20:56 2016 -0500
Revision:
72:6892702709ee
Parent:
71:562f5c702094
Use distinct names to prevent hiding of overloads in derived classes.

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