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:
Sat May 14 14:27:56 2016 -0500
Revision:
76:84e6c4994e29
Parent:
75:8b627804927c
Child:
78:0cbbac7f2016
Move ROM commands outside of OneWireMaster to increase cohesiveness of the class. Do not use subdivide OneWire namespace since it will likely not provide value on this project.

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 76:84e6c4994e29 36 using OneWire::OneWireMaster;
IanBenzMaxim 76:84e6c4994e29 37 using OneWire::DS248x;
j3 1:91e52f8ab8bf 38
IanBenzMaxim 69:f915c4c59a69 39 enum DS248X_STATUS_BITS
IanBenzMaxim 69:f915c4c59a69 40 {
IanBenzMaxim 74:23be10c32fa3 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 74:23be10c32fa3 56 uint8_t config = 0;
IanBenzMaxim 74:23be10c32fa3 57 if (get1WS())
IanBenzMaxim 74:23be10c32fa3 58 {
IanBenzMaxim 74:23be10c32fa3 59 config |= 0x08;
IanBenzMaxim 74:23be10c32fa3 60 }
IanBenzMaxim 74:23be10c32fa3 61 if (getSPU())
IanBenzMaxim 74:23be10c32fa3 62 {
IanBenzMaxim 74:23be10c32fa3 63 config |= 0x04;
IanBenzMaxim 74:23be10c32fa3 64 }
IanBenzMaxim 74:23be10c32fa3 65 if (getPDN())
IanBenzMaxim 74:23be10c32fa3 66 {
IanBenzMaxim 74:23be10c32fa3 67 config |= 0x02;
IanBenzMaxim 74:23be10c32fa3 68 }
IanBenzMaxim 74:23be10c32fa3 69 if (getAPU())
IanBenzMaxim 74:23be10c32fa3 70 {
IanBenzMaxim 74:23be10c32fa3 71 config |= 0x01;
IanBenzMaxim 74:23be10c32fa3 72 }
IanBenzMaxim 74:23be10c32fa3 73 return config;
IanBenzMaxim 69:f915c4c59a69 74 }
IanBenzMaxim 69:f915c4c59a69 75
IanBenzMaxim 73:2cecc1372acc 76 uint8_t DS248x::Config::writeByte() const
IanBenzMaxim 69:f915c4c59a69 77 {
IanBenzMaxim 74:23be10c32fa3 78 uint8_t config = readByte();
IanBenzMaxim 74:23be10c32fa3 79 return ((~config << 4) | config);
IanBenzMaxim 69:f915c4c59a69 80 }
IanBenzMaxim 69:f915c4c59a69 81
IanBenzMaxim 73:2cecc1372acc 82 void DS248x::Config::reset()
IanBenzMaxim 69:f915c4c59a69 83 {
IanBenzMaxim 74:23be10c32fa3 84 set1WS(false);
IanBenzMaxim 74:23be10c32fa3 85 setSPU(false);
IanBenzMaxim 74:23be10c32fa3 86 setPDN(false);
IanBenzMaxim 74:23be10c32fa3 87 setAPU(true);
IanBenzMaxim 69:f915c4c59a69 88 }
IanBenzMaxim 69:f915c4c59a69 89
IanBenzMaxim 73:2cecc1372acc 90 DS248x::DS248x(mbed::I2C & i2c_bus, uint8_t adrs)
IanBenzMaxim 75:8b627804927c 91 :m_p_i2c_bus(&i2c_bus), m_adrs(adrs), m_i2c_owner(false)
IanBenzMaxim 73:2cecc1372acc 92 {
IanBenzMaxim 69:f915c4c59a69 93
j3 1:91e52f8ab8bf 94 }
j3 1:91e52f8ab8bf 95
IanBenzMaxim 73:2cecc1372acc 96 DS248x::DS248x(PinName sda, PinName scl, uint8_t adrs)
IanBenzMaxim 75:8b627804927c 97 : m_p_i2c_bus(new mbed::I2C(sda, scl)), m_adrs(adrs), m_i2c_owner(true)
IanBenzMaxim 73:2cecc1372acc 98 {
j3 1:91e52f8ab8bf 99
j3 1:91e52f8ab8bf 100 }
j3 1:91e52f8ab8bf 101
IanBenzMaxim 73:2cecc1372acc 102 DS248x::~DS248x()
j3 1:91e52f8ab8bf 103 {
IanBenzMaxim 75:8b627804927c 104 if (m_i2c_owner)
j3 1:91e52f8ab8bf 105 {
IanBenzMaxim 75:8b627804927c 106 delete m_p_i2c_bus;
j3 1:91e52f8ab8bf 107 }
j3 1:91e52f8ab8bf 108 }
j3 1:91e52f8ab8bf 109
IanBenzMaxim 73:2cecc1372acc 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 74:23be10c32fa3 117 {
IanBenzMaxim 74:23be10c32fa3 118 return result;
IanBenzMaxim 74:23be10c32fa3 119 }
IanBenzMaxim 69:f915c4c59a69 120
IanBenzMaxim 69:f915c4c59a69 121 // write the default configuration setup
IanBenzMaxim 69:f915c4c59a69 122 Config defaultConfig;
IanBenzMaxim 69:f915c4c59a69 123 result = writeConfig(defaultConfig, true);
j3 17:b646b1e3970b 124 return result;
j3 2:02d228c25fd4 125 }
j3 2:02d228c25fd4 126
IanBenzMaxim 73:2cecc1372acc 127 OneWireMaster::CmdResult DS248x::reset(void)
IanBenzMaxim 74:23be10c32fa3 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
IanBenzMaxim 74:23be10c32fa3 133
IanBenzMaxim 74:23be10c32fa3 134 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 135 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 136
IanBenzMaxim 75:8b627804927c 137 result = sendCommand(DeviceResetCmd);
IanBenzMaxim 74:23be10c32fa3 138
IanBenzMaxim 74:23be10c32fa3 139 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 140 {
IanBenzMaxim 74:23be10c32fa3 141 result = readRegister(StatusReg, buf, true);
IanBenzMaxim 74:23be10c32fa3 142 }
IanBenzMaxim 69:f915c4c59a69 143
IanBenzMaxim 74:23be10c32fa3 144 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 145 {
IanBenzMaxim 74:23be10c32fa3 146 if ((buf & 0xF7) != 0x10)
IanBenzMaxim 74:23be10c32fa3 147 {
IanBenzMaxim 74:23be10c32fa3 148 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 149 }
IanBenzMaxim 74:23be10c32fa3 150 }
IanBenzMaxim 69:f915c4c59a69 151
IanBenzMaxim 74:23be10c32fa3 152 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 153 {
IanBenzMaxim 74:23be10c32fa3 154 OWReset(); // do a command to get 1-Wire master reset out of holding state
IanBenzMaxim 74:23be10c32fa3 155 }
IanBenzMaxim 74:23be10c32fa3 156
IanBenzMaxim 74:23be10c32fa3 157 return result;
j3 2:02d228c25fd4 158 }
j3 2:02d228c25fd4 159
IanBenzMaxim 73:2cecc1372acc 160 OneWireMaster::CmdResult DS248x::selectChannel(uint8_t channel)
j3 2:02d228c25fd4 161 {
j3 23:e8e403d61359 162 OneWireMaster::CmdResult result;
IanBenzMaxim 69:f915c4c59a69 163 uint8_t ch, ch_read;
IanBenzMaxim 74:23be10c32fa3 164
j3 2:02d228c25fd4 165 // Channel Select (Case A)
j3 2:02d228c25fd4 166 // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P
j3 2:02d228c25fd4 167 // [] indicates from slave
j3 2:02d228c25fd4 168 // CC channel value
j3 2:02d228c25fd4 169 // RR channel read back
IanBenzMaxim 74:23be10c32fa3 170
j3 2:02d228c25fd4 171 switch (channel)
j3 2:02d228c25fd4 172 {
IanBenzMaxim 74:23be10c32fa3 173 default:
IanBenzMaxim 74:23be10c32fa3 174 case 0:
IanBenzMaxim 74:23be10c32fa3 175 ch = 0xF0;
IanBenzMaxim 74:23be10c32fa3 176 ch_read = 0xB8;
IanBenzMaxim 74:23be10c32fa3 177 break;
IanBenzMaxim 74:23be10c32fa3 178 case 1:
IanBenzMaxim 74:23be10c32fa3 179 ch = 0xE1;
IanBenzMaxim 74:23be10c32fa3 180 ch_read = 0xB1;
IanBenzMaxim 74:23be10c32fa3 181 break;
IanBenzMaxim 74:23be10c32fa3 182 case 2:
IanBenzMaxim 74:23be10c32fa3 183 ch = 0xD2;
IanBenzMaxim 74:23be10c32fa3 184 ch_read = 0xAA;
IanBenzMaxim 74:23be10c32fa3 185 break;
IanBenzMaxim 74:23be10c32fa3 186 case 3:
IanBenzMaxim 74:23be10c32fa3 187 ch = 0xC3;
IanBenzMaxim 74:23be10c32fa3 188 ch_read = 0xA3;
IanBenzMaxim 74:23be10c32fa3 189 break;
IanBenzMaxim 74:23be10c32fa3 190 case 4:
IanBenzMaxim 74:23be10c32fa3 191 ch = 0xB4;
IanBenzMaxim 74:23be10c32fa3 192 ch_read = 0x9C;
IanBenzMaxim 74:23be10c32fa3 193 break;
IanBenzMaxim 74:23be10c32fa3 194 case 5:
IanBenzMaxim 74:23be10c32fa3 195 ch = 0xA5;
IanBenzMaxim 74:23be10c32fa3 196 ch_read = 0x95;
IanBenzMaxim 74:23be10c32fa3 197 break;
IanBenzMaxim 74:23be10c32fa3 198 case 6:
IanBenzMaxim 74:23be10c32fa3 199 ch = 0x96;
IanBenzMaxim 74:23be10c32fa3 200 ch_read = 0x8E;
IanBenzMaxim 74:23be10c32fa3 201 break;
IanBenzMaxim 74:23be10c32fa3 202 case 7:
IanBenzMaxim 74:23be10c32fa3 203 ch = 0x87;
IanBenzMaxim 74:23be10c32fa3 204 ch_read = 0x87;
IanBenzMaxim 74:23be10c32fa3 205 break;
j3 2:02d228c25fd4 206 };
IanBenzMaxim 74:23be10c32fa3 207
IanBenzMaxim 75:8b627804927c 208 result = sendCommand(ChannelSelectCmd, ch);
IanBenzMaxim 69:f915c4c59a69 209 if (result == OneWireMaster::Success)
j3 17:b646b1e3970b 210 {
IanBenzMaxim 73:2cecc1372acc 211 result = readRegister(ChannelSelectReg, ch, true);
IanBenzMaxim 69:f915c4c59a69 212 if (result == OneWireMaster::Success)
j3 17:b646b1e3970b 213 {
j3 17:b646b1e3970b 214 // check for failure due to incorrect read back of channel
IanBenzMaxim 69:f915c4c59a69 215 if (ch != ch_read)
j3 17:b646b1e3970b 216 {
j3 23:e8e403d61359 217 result = OneWireMaster::OperationFailure;
j3 17:b646b1e3970b 218 }
j3 2:02d228c25fd4 219 }
j3 2:02d228c25fd4 220 }
IanBenzMaxim 74:23be10c32fa3 221
j3 17:b646b1e3970b 222 return result;
j3 1:91e52f8ab8bf 223 }
j3 1:91e52f8ab8bf 224
IanBenzMaxim 73:2cecc1372acc 225 OneWireMaster::CmdResult DS248x::adjustOwPort(OwAdjustParam param, uint8_t val)
j3 1:91e52f8ab8bf 226 {
j3 23:e8e403d61359 227 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 228
IanBenzMaxim 69:f915c4c59a69 229 uint8_t read_port_config;
IanBenzMaxim 69:f915c4c59a69 230 uint8_t control_byte;
IanBenzMaxim 69:f915c4c59a69 231
IanBenzMaxim 69:f915c4c59a69 232 control_byte = (((param & 0x0F) << 4) | (val & 0x0F));
IanBenzMaxim 74:23be10c32fa3 233
IanBenzMaxim 75:8b627804927c 234 result = sendCommand(AdjustOwPortCmd, control_byte);
IanBenzMaxim 69:f915c4c59a69 235 if (result != Success)
IanBenzMaxim 74:23be10c32fa3 236 {
IanBenzMaxim 26:a361e3f42ba5 237 return result;
IanBenzMaxim 74:23be10c32fa3 238 }
IanBenzMaxim 74:23be10c32fa3 239
IanBenzMaxim 73:2cecc1372acc 240 result = readRegister(PortConfigReg, read_port_config, true);
IanBenzMaxim 69:f915c4c59a69 241 if (result != Success)
IanBenzMaxim 74:23be10c32fa3 242 {
IanBenzMaxim 69:f915c4c59a69 243 return result;
IanBenzMaxim 74:23be10c32fa3 244 }
IanBenzMaxim 74:23be10c32fa3 245
IanBenzMaxim 74:23be10c32fa3 246 if ((control_byte & 0x0F) != read_port_config)
IanBenzMaxim 74:23be10c32fa3 247 {
IanBenzMaxim 69:f915c4c59a69 248 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 249 }
IanBenzMaxim 74:23be10c32fa3 250
IanBenzMaxim 69:f915c4c59a69 251 return result;
IanBenzMaxim 69:f915c4c59a69 252 }
IanBenzMaxim 69:f915c4c59a69 253
IanBenzMaxim 75:8b627804927c 254 OneWireMaster::CmdResult DS248x::OWTriplet(SearchDirection & searchDirection, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 69:f915c4c59a69 255 {
IanBenzMaxim 69:f915c4c59a69 256 // 1-Wire Triplet (Case B)
IanBenzMaxim 69:f915c4c59a69 257 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 69:f915c4c59a69 258 // \--------/
IanBenzMaxim 69:f915c4c59a69 259 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 260 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 261 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 69:f915c4c59a69 262
IanBenzMaxim 74:23be10c32fa3 263 OneWireMaster::CmdResult result;
IanBenzMaxim 75:8b627804927c 264 result = sendCommand(OwTripletCmd, (uint8_t)((searchDirection == WriteOne) ? 0x80 : 0x00));
IanBenzMaxim 69:f915c4c59a69 265 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 266 {
IanBenzMaxim 74:23be10c32fa3 267 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 268 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 269 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 270 {
IanBenzMaxim 74:23be10c32fa3 271 // check bit results in status byte
IanBenzMaxim 74:23be10c32fa3 272 sbr = ((status & STATUS_SBR) == STATUS_SBR);
IanBenzMaxim 74:23be10c32fa3 273 tsb = ((status & STATUS_TSB) == STATUS_TSB);
IanBenzMaxim 75:8b627804927c 274 searchDirection = ((status & STATUS_DIR) == STATUS_DIR) ? WriteOne : WriteZero;
IanBenzMaxim 74:23be10c32fa3 275 }
IanBenzMaxim 69:f915c4c59a69 276 }
IanBenzMaxim 74:23be10c32fa3 277 return result;
IanBenzMaxim 69:f915c4c59a69 278 }
IanBenzMaxim 69:f915c4c59a69 279
IanBenzMaxim 75:8b627804927c 280 OneWireMaster::CmdResult DS248x::OWReset()
IanBenzMaxim 69:f915c4c59a69 281 {
IanBenzMaxim 69:f915c4c59a69 282 // 1-Wire reset (Case B)
IanBenzMaxim 69:f915c4c59a69 283 // S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 69:f915c4c59a69 284 // \--------/
IanBenzMaxim 69:f915c4c59a69 285 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 286 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 287
IanBenzMaxim 74:23be10c32fa3 288 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 289 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 290
IanBenzMaxim 75:8b627804927c 291 result = sendCommand(OwResetCmd);
IanBenzMaxim 74:23be10c32fa3 292
IanBenzMaxim 74:23be10c32fa3 293 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 294 {
IanBenzMaxim 74:23be10c32fa3 295 result = pollBusy(&buf);
IanBenzMaxim 74:23be10c32fa3 296 }
IanBenzMaxim 69:f915c4c59a69 297
IanBenzMaxim 74:23be10c32fa3 298 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 299 {
IanBenzMaxim 74:23be10c32fa3 300 // check for presence detect
IanBenzMaxim 74:23be10c32fa3 301 if ((buf & STATUS_PPD) != STATUS_PPD)
IanBenzMaxim 74:23be10c32fa3 302 {
IanBenzMaxim 74:23be10c32fa3 303 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 304 }
IanBenzMaxim 74:23be10c32fa3 305 }
IanBenzMaxim 69:f915c4c59a69 306
IanBenzMaxim 74:23be10c32fa3 307 return result;
IanBenzMaxim 69:f915c4c59a69 308 }
IanBenzMaxim 69:f915c4c59a69 309
IanBenzMaxim 75:8b627804927c 310 OneWireMaster::CmdResult DS248x::OWTouchBitSetLevel(uint8_t & sendRecvBit, OWLevel afterLevel)
IanBenzMaxim 69:f915c4c59a69 311 {
j3 2:02d228c25fd4 312 // 1-Wire bit (Case B)
j3 2:02d228c25fd4 313 // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 314 // \--------/
j3 2:02d228c25fd4 315 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 316 // [] indicates from slave
j3 2:02d228c25fd4 317 // BB indicates byte containing bit value in msbit
j3 2:02d228c25fd4 318
IanBenzMaxim 74:23be10c32fa3 319 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 320
IanBenzMaxim 75:8b627804927c 321 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 322 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 323 {
IanBenzMaxim 74:23be10c32fa3 324 return result;
IanBenzMaxim 74:23be10c32fa3 325 }
IanBenzMaxim 74:23be10c32fa3 326
IanBenzMaxim 74:23be10c32fa3 327 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 328
IanBenzMaxim 75:8b627804927c 329 result = sendCommand(OwSingleBitCmd, (uint8_t)(sendRecvBit ? 0x80 : 0x00));
IanBenzMaxim 74:23be10c32fa3 330
IanBenzMaxim 74:23be10c32fa3 331 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 332 {
IanBenzMaxim 74:23be10c32fa3 333 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 334 }
IanBenzMaxim 74:23be10c32fa3 335
IanBenzMaxim 74:23be10c32fa3 336 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 337 {
IanBenzMaxim 75:8b627804927c 338 sendRecvBit = (status & STATUS_SBR);
IanBenzMaxim 74:23be10c32fa3 339 }
IanBenzMaxim 74:23be10c32fa3 340
IanBenzMaxim 69:f915c4c59a69 341 return result;
j3 1:91e52f8ab8bf 342 }
j3 1:91e52f8ab8bf 343
IanBenzMaxim 75:8b627804927c 344 OneWireMaster::CmdResult DS248x::OWWriteByteSetLevel(uint8_t sendByte, OWLevel afterLevel)
j3 1:91e52f8ab8bf 345 {
j3 2:02d228c25fd4 346 // 1-Wire Write Byte (Case B)
j3 2:02d228c25fd4 347 // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
j3 2:02d228c25fd4 348 // \--------/
j3 2:02d228c25fd4 349 // Repeat until 1WB bit has changed to 0
j3 2:02d228c25fd4 350 // [] indicates from slave
j3 2:02d228c25fd4 351 // DD data to write
j3 2:02d228c25fd4 352
IanBenzMaxim 74:23be10c32fa3 353 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 354
IanBenzMaxim 75:8b627804927c 355 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 356 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 357 {
IanBenzMaxim 74:23be10c32fa3 358 return result;
IanBenzMaxim 74:23be10c32fa3 359 }
IanBenzMaxim 74:23be10c32fa3 360
IanBenzMaxim 75:8b627804927c 361 result = sendCommand(OwWriteByteCmd, sendByte);
IanBenzMaxim 74:23be10c32fa3 362 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 363 {
IanBenzMaxim 74:23be10c32fa3 364 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 365 }
IanBenzMaxim 74:23be10c32fa3 366
IanBenzMaxim 69:f915c4c59a69 367 return result;
j3 1:91e52f8ab8bf 368 }
j3 1:91e52f8ab8bf 369
IanBenzMaxim 75:8b627804927c 370 OneWireMaster::CmdResult DS248x::OWReadByteSetLevel(uint8_t & recvByte, OWLevel afterLevel)
j3 1:91e52f8ab8bf 371 {
IanBenzMaxim 69:f915c4c59a69 372 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 69:f915c4c59a69 373 // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A\
IanBenzMaxim 69:f915c4c59a69 374 // \--------/
IanBenzMaxim 69:f915c4c59a69 375 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 69:f915c4c59a69 376 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 69:f915c4c59a69 377 //
IanBenzMaxim 69:f915c4c59a69 378 // [] indicates from slave
IanBenzMaxim 69:f915c4c59a69 379 // DD data read
IanBenzMaxim 26:a361e3f42ba5 380
IanBenzMaxim 74:23be10c32fa3 381 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 382 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 383
IanBenzMaxim 75:8b627804927c 384 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 385 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 386 {
IanBenzMaxim 74:23be10c32fa3 387 return result;
IanBenzMaxim 74:23be10c32fa3 388 }
IanBenzMaxim 74:23be10c32fa3 389
IanBenzMaxim 75:8b627804927c 390 result = sendCommand(OwReadByteCmd);
IanBenzMaxim 69:f915c4c59a69 391
IanBenzMaxim 74:23be10c32fa3 392 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 393 {
IanBenzMaxim 74:23be10c32fa3 394 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 395 }
IanBenzMaxim 69:f915c4c59a69 396
IanBenzMaxim 74:23be10c32fa3 397 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 398 {
IanBenzMaxim 74:23be10c32fa3 399 result = readRegister(ReadDataReg, buf);
IanBenzMaxim 74:23be10c32fa3 400 }
IanBenzMaxim 74:23be10c32fa3 401
IanBenzMaxim 74:23be10c32fa3 402 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 403 {
IanBenzMaxim 75:8b627804927c 404 recvByte = buf;
IanBenzMaxim 74:23be10c32fa3 405 }
IanBenzMaxim 74:23be10c32fa3 406
IanBenzMaxim 74:23be10c32fa3 407 return result;
j3 17:b646b1e3970b 408 }
j3 17:b646b1e3970b 409
IanBenzMaxim 75:8b627804927c 410 OneWireMaster::CmdResult DS248x::OWSetSpeed(OWSpeed newSpeed)
j3 1:91e52f8ab8bf 411 {
IanBenzMaxim 74:23be10c32fa3 412 // Requested speed is already set
IanBenzMaxim 75:8b627804927c 413 if (m_curConfig.get1WS() == (newSpeed == OverdriveSpeed))
IanBenzMaxim 74:23be10c32fa3 414 {
IanBenzMaxim 74:23be10c32fa3 415 return OneWireMaster::Success;
IanBenzMaxim 74:23be10c32fa3 416 }
j3 2:02d228c25fd4 417
IanBenzMaxim 74:23be10c32fa3 418 // set the speed
IanBenzMaxim 74:23be10c32fa3 419 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 420 newConfig.set1WS(newSpeed == OverdriveSpeed);
IanBenzMaxim 74:23be10c32fa3 421
IanBenzMaxim 74:23be10c32fa3 422 // write the new config
IanBenzMaxim 74:23be10c32fa3 423 return writeConfig(newConfig, true);
j3 1:91e52f8ab8bf 424 }
j3 1:91e52f8ab8bf 425
IanBenzMaxim 75:8b627804927c 426 OneWireMaster::CmdResult DS248x::OWSetLevel(OWLevel newLevel)
j3 1:91e52f8ab8bf 427 {
IanBenzMaxim 75:8b627804927c 428 if (newLevel == StrongLevel)
IanBenzMaxim 73:2cecc1372acc 429 {
IanBenzMaxim 69:f915c4c59a69 430 return OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 431 }
IanBenzMaxim 74:23be10c32fa3 432
IanBenzMaxim 75:8b627804927c 433 return configureLevel(newLevel);
IanBenzMaxim 21:00c94aeb533e 434 }
IanBenzMaxim 21:00c94aeb533e 435
IanBenzMaxim 73:2cecc1372acc 436 OneWireMaster::CmdResult DS248x::writeConfig(const Config & config, bool verify)
j3 6:1faafa0b3cd7 437 {
IanBenzMaxim 74:23be10c32fa3 438 uint8_t configBuf;
IanBenzMaxim 74:23be10c32fa3 439 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 440
IanBenzMaxim 74:23be10c32fa3 441 configBuf = config.writeByte();
IanBenzMaxim 75:8b627804927c 442 result = sendCommand(WriteDeviceConfigCmd, configBuf);
IanBenzMaxim 74:23be10c32fa3 443 if (verify)
IanBenzMaxim 74:23be10c32fa3 444 {
IanBenzMaxim 74:23be10c32fa3 445 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 446 {
IanBenzMaxim 74:23be10c32fa3 447 result = readRegister(ConfigReg, configBuf);
IanBenzMaxim 74:23be10c32fa3 448 }
IanBenzMaxim 74:23be10c32fa3 449 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 450 {
IanBenzMaxim 74:23be10c32fa3 451 if (configBuf != config.readByte())
IanBenzMaxim 74:23be10c32fa3 452 {
IanBenzMaxim 74:23be10c32fa3 453 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 454 }
IanBenzMaxim 74:23be10c32fa3 455 }
IanBenzMaxim 74:23be10c32fa3 456 }
IanBenzMaxim 74:23be10c32fa3 457
IanBenzMaxim 69:f915c4c59a69 458 if (result == OneWireMaster::Success)
IanBenzMaxim 69:f915c4c59a69 459 {
IanBenzMaxim 74:23be10c32fa3 460 m_curConfig = config;
IanBenzMaxim 69:f915c4c59a69 461 }
IanBenzMaxim 69:f915c4c59a69 462
IanBenzMaxim 74:23be10c32fa3 463 return result;
IanBenzMaxim 69:f915c4c59a69 464 }
IanBenzMaxim 69:f915c4c59a69 465
IanBenzMaxim 73:2cecc1372acc 466 OneWireMaster::CmdResult DS248x::readRegister(Register reg, uint8_t & buf, bool skipSetPointer) const
IanBenzMaxim 69:f915c4c59a69 467 {
IanBenzMaxim 69:f915c4c59a69 468 CmdResult result;
IanBenzMaxim 75:8b627804927c 469 result = sendCommand(SetReadPointerCmd, reg);
IanBenzMaxim 69:f915c4c59a69 470 if (result == Success)
IanBenzMaxim 69:f915c4c59a69 471 {
IanBenzMaxim 75:8b627804927c 472 if (m_p_i2c_bus->read(m_adrs, reinterpret_cast<char *>(&buf), 1) != I2C_READ_OK)
IanBenzMaxim 73:2cecc1372acc 473 {
IanBenzMaxim 69:f915c4c59a69 474 result = CommunicationReadError;
IanBenzMaxim 74:23be10c32fa3 475 }
IanBenzMaxim 69:f915c4c59a69 476 }
IanBenzMaxim 69:f915c4c59a69 477 return result;
IanBenzMaxim 69:f915c4c59a69 478 }
IanBenzMaxim 69:f915c4c59a69 479
IanBenzMaxim 73:2cecc1372acc 480 OneWireMaster::CmdResult DS248x::pollBusy(uint8_t * pStatus)
IanBenzMaxim 69:f915c4c59a69 481 {
IanBenzMaxim 74:23be10c32fa3 482 const unsigned int pollLimit = 200;
IanBenzMaxim 74:23be10c32fa3 483
IanBenzMaxim 74:23be10c32fa3 484 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 485 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 486 unsigned int pollCount = 0;
IanBenzMaxim 69:f915c4c59a69 487
IanBenzMaxim 74:23be10c32fa3 488 do
IanBenzMaxim 74:23be10c32fa3 489 {
IanBenzMaxim 74:23be10c32fa3 490 result = readRegister(StatusReg, status, true);
IanBenzMaxim 74:23be10c32fa3 491 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 492 {
IanBenzMaxim 74:23be10c32fa3 493 return result;
IanBenzMaxim 74:23be10c32fa3 494 }
IanBenzMaxim 74:23be10c32fa3 495 if (pStatus != NULL)
IanBenzMaxim 74:23be10c32fa3 496 {
IanBenzMaxim 74:23be10c32fa3 497 *pStatus = status;
IanBenzMaxim 74:23be10c32fa3 498 }
IanBenzMaxim 74:23be10c32fa3 499 if (pollCount++ >= pollLimit)
IanBenzMaxim 74:23be10c32fa3 500 {
IanBenzMaxim 74:23be10c32fa3 501 return OneWireMaster::TimeoutError;
IanBenzMaxim 74:23be10c32fa3 502 }
IanBenzMaxim 74:23be10c32fa3 503 } while (status & STATUS_1WB);
IanBenzMaxim 69:f915c4c59a69 504
IanBenzMaxim 74:23be10c32fa3 505 return OneWireMaster::Success;
IanBenzMaxim 69:f915c4c59a69 506 }
IanBenzMaxim 69:f915c4c59a69 507
IanBenzMaxim 73:2cecc1372acc 508 OneWireMaster::CmdResult DS248x::configureLevel(OWLevel level)
IanBenzMaxim 69:f915c4c59a69 509 {
IanBenzMaxim 69:f915c4c59a69 510 OneWireMaster::CmdResult result;
IanBenzMaxim 75:8b627804927c 511 if (m_curConfig.getSPU() != (level == StrongLevel))
IanBenzMaxim 69:f915c4c59a69 512 {
IanBenzMaxim 69:f915c4c59a69 513 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 514 newConfig.setSPU(level == StrongLevel);
IanBenzMaxim 69:f915c4c59a69 515 result = writeConfig(newConfig, true);
IanBenzMaxim 69:f915c4c59a69 516 }
IanBenzMaxim 69:f915c4c59a69 517 else
IanBenzMaxim 69:f915c4c59a69 518 {
IanBenzMaxim 69:f915c4c59a69 519 result = OneWireMaster::Success;
IanBenzMaxim 69:f915c4c59a69 520 }
IanBenzMaxim 69:f915c4c59a69 521 return result;
IanBenzMaxim 69:f915c4c59a69 522 }
IanBenzMaxim 69:f915c4c59a69 523
IanBenzMaxim 75:8b627804927c 524 OneWireMaster::CmdResult DS248x::sendCommand(Command cmd) const
IanBenzMaxim 69:f915c4c59a69 525 {
IanBenzMaxim 69:f915c4c59a69 526 CmdResult result;
IanBenzMaxim 75:8b627804927c 527 if (m_p_i2c_bus->write(m_adrs, reinterpret_cast<const char *>(&cmd), 1) == I2C_WRITE_OK)
IanBenzMaxim 73:2cecc1372acc 528 {
IanBenzMaxim 69:f915c4c59a69 529 result = Success;
IanBenzMaxim 74:23be10c32fa3 530 }
IanBenzMaxim 69:f915c4c59a69 531 else
IanBenzMaxim 73:2cecc1372acc 532 {
IanBenzMaxim 69:f915c4c59a69 533 result = CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 534 }
IanBenzMaxim 69:f915c4c59a69 535 return result;
IanBenzMaxim 69:f915c4c59a69 536 }
IanBenzMaxim 69:f915c4c59a69 537
IanBenzMaxim 75:8b627804927c 538 OneWireMaster::CmdResult DS248x::sendCommand(Command cmd, uint8_t param) const
IanBenzMaxim 69:f915c4c59a69 539 {
IanBenzMaxim 69:f915c4c59a69 540 CmdResult result;
IanBenzMaxim 69:f915c4c59a69 541 char buf[2] = { cmd, param };
IanBenzMaxim 75:8b627804927c 542 if (m_p_i2c_bus->write(m_adrs, buf, 2) == I2C_WRITE_OK)
IanBenzMaxim 73:2cecc1372acc 543 {
IanBenzMaxim 69:f915c4c59a69 544 result = Success;
IanBenzMaxim 74:23be10c32fa3 545 }
IanBenzMaxim 69:f915c4c59a69 546 else
IanBenzMaxim 73:2cecc1372acc 547 {
IanBenzMaxim 69:f915c4c59a69 548 result = CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 549 }
IanBenzMaxim 69:f915c4c59a69 550 return result;
IanBenzMaxim 69:f915c4c59a69 551 }