1-Wire® library for mbed. Complete 1-Wire library that supports our silicon masters along with a bit-bang master on the MAX32600MBED platform with one common interface for mbed. Slave support has also been included and more slaves will be added as time permits.

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
j3
Date:
Wed Mar 16 01:19:45 2016 +0000
Revision:
15:f6cb0d906fb6
Parent:
14:7b2886a50321
Child:
17:b646b1e3970b
Removed duplicated code between masters by providing 'OneWireMaster' class that implements common parts of OneWireInterface.  OneWireMaster is now the class inherited by individual master implementations.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 1:91e52f8ab8bf 1 /******************************************************************//**
j3 1:91e52f8ab8bf 2 * @file ds248x.h
j3 1:91e52f8ab8bf 3 *
j3 1:91e52f8ab8bf 4 * @author Justin Jordan
j3 1:91e52f8ab8bf 5 *
j3 1:91e52f8ab8bf 6 * @version 0.0.0
j3 1:91e52f8ab8bf 7 *
j3 1:91e52f8ab8bf 8 * Started: 30JAN16
j3 1:91e52f8ab8bf 9 *
j3 1:91e52f8ab8bf 10 * Updated:
j3 1:91e52f8ab8bf 11 *
j3 1:91e52f8ab8bf 12 * @brief Header file for Ds248x I2C to 1-wire master
j3 1:91e52f8ab8bf 13 ***********************************************************************
j3 1:91e52f8ab8bf 14 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 1:91e52f8ab8bf 15 *
j3 1:91e52f8ab8bf 16 * Permission is hereby granted, free of charge, to any person obtaining a
j3 1:91e52f8ab8bf 17 * copy of this software and associated documentation files (the "Software"),
j3 1:91e52f8ab8bf 18 * to deal in the Software without restriction, including without limitation
j3 1:91e52f8ab8bf 19 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 1:91e52f8ab8bf 20 * and/or sell copies of the Software, and to permit persons to whom the
j3 1:91e52f8ab8bf 21 * Software is furnished to do so, subject to the following conditions:
j3 1:91e52f8ab8bf 22 *
j3 1:91e52f8ab8bf 23 * The above copyright notice and this permission notice shall be included
j3 1:91e52f8ab8bf 24 * in all copies or substantial portions of the Software.
j3 1:91e52f8ab8bf 25 *
j3 1:91e52f8ab8bf 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 1:91e52f8ab8bf 27 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 1:91e52f8ab8bf 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 1:91e52f8ab8bf 29 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 1:91e52f8ab8bf 30 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 1:91e52f8ab8bf 31 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 1:91e52f8ab8bf 32 * OTHER DEALINGS IN THE SOFTWARE.
j3 1:91e52f8ab8bf 33 *
j3 1:91e52f8ab8bf 34 * Except as contained in this notice, the name of Maxim Integrated
j3 1:91e52f8ab8bf 35 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 1:91e52f8ab8bf 36 * Products, Inc. Branding Policy.
j3 1:91e52f8ab8bf 37 *
j3 1:91e52f8ab8bf 38 * The mere transfer of this software does not imply any licenses
j3 1:91e52f8ab8bf 39 * of trade secrets, proprietary technology, copyrights, patents,
j3 1:91e52f8ab8bf 40 * trademarks, maskwork rights, or any other form of intellectual
j3 1:91e52f8ab8bf 41 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 1:91e52f8ab8bf 42 * ownership rights.
j3 1:91e52f8ab8bf 43 **********************************************************************/
j3 1:91e52f8ab8bf 44
j3 1:91e52f8ab8bf 45
j3 1:91e52f8ab8bf 46 #ifndef DS248X_H
j3 1:91e52f8ab8bf 47 #define DS248X_H
j3 1:91e52f8ab8bf 48
j3 1:91e52f8ab8bf 49
j3 1:91e52f8ab8bf 50 #include "mbed.h"
j3 1:91e52f8ab8bf 51 #include "OneWireInterface.h"
j3 15:f6cb0d906fb6 52 #include "OneWireMaster.h"
j3 1:91e52f8ab8bf 53
j3 1:91e52f8ab8bf 54
j3 15:f6cb0d906fb6 55 class Ds248x: public OneWireMaster
j3 1:91e52f8ab8bf 56 {
j3 1:91e52f8ab8bf 57 public:
j3 1:91e52f8ab8bf 58
j3 5:ce108eeb878d 59 enum DS248X_I2C_ADRS
j3 1:91e52f8ab8bf 60 {
j3 1:91e52f8ab8bf 61 DS248X_I2C_ADRS0 = 0x18,
j3 1:91e52f8ab8bf 62 DS248X_I2C_ADRS1,
j3 1:91e52f8ab8bf 63 DS248X_I2C_ADRS2,
j3 1:91e52f8ab8bf 64 DS248X_I2C_ADRS3,
j3 1:91e52f8ab8bf 65 DS248X_I2C_ADRS4,
j3 1:91e52f8ab8bf 66 DS248X_I2C_ADRS5,
j3 1:91e52f8ab8bf 67 DS248X_I2C_ADRS6,
j3 5:ce108eeb878d 68 DS248X_I2C_ADRS7
j3 5:ce108eeb878d 69 };
j3 5:ce108eeb878d 70
j3 5:ce108eeb878d 71 enum DS248X_CMDS
j3 5:ce108eeb878d 72 {
j3 5:ce108eeb878d 73 CMD_DRST = 0xF0,
j3 5:ce108eeb878d 74 CMD_WCFG = 0xD2,
j3 5:ce108eeb878d 75 CMD_A1WP = 0xC3, //DS2484 only
j3 5:ce108eeb878d 76 CMD_CHSL = 0xC3, //DS2482-800 only
j3 5:ce108eeb878d 77 CMD_SRP = 0xE1,
j3 5:ce108eeb878d 78 CMD_1WRS = 0xB4,
j3 5:ce108eeb878d 79 CMD_1WWB = 0xA5,
j3 5:ce108eeb878d 80 CMD_1WRB = 0x96,
j3 5:ce108eeb878d 81 CMD_1WSB = 0x87,
j3 5:ce108eeb878d 82 CMD_1WT = 0x78
j3 5:ce108eeb878d 83 };
j3 5:ce108eeb878d 84
j3 5:ce108eeb878d 85 enum DS248X_CONFIG_BITS
j3 5:ce108eeb878d 86 {
j3 5:ce108eeb878d 87 CONFIG_APU = 0x01,
j3 5:ce108eeb878d 88 CONFIG_PDN = 0x02,
j3 5:ce108eeb878d 89 CONFIG_SPU = 0x04,
j3 5:ce108eeb878d 90 CONFIG_1WS = 0x08
j3 5:ce108eeb878d 91 };
j3 5:ce108eeb878d 92
j3 5:ce108eeb878d 93 enum DS248X_STATUS_BITS
j3 5:ce108eeb878d 94 {
j3 5:ce108eeb878d 95 STATUS_1WB = 0x01,
j3 5:ce108eeb878d 96 STATUS_PPD = 0x02,
j3 5:ce108eeb878d 97 STATUS_SD = 0x04,
j3 5:ce108eeb878d 98 STATUS_LL = 0x08,
j3 5:ce108eeb878d 99 STATUS_RST = 0x10,
j3 5:ce108eeb878d 100 STATUS_SBR = 0x20,
j3 5:ce108eeb878d 101 STATUS_TSB = 0x40,
j3 5:ce108eeb878d 102 STATUS_DIR = 0x80
j3 5:ce108eeb878d 103 };
j3 5:ce108eeb878d 104
j3 5:ce108eeb878d 105 enum DS2484_ADJST_PARAMS
j3 5:ce108eeb878d 106 {
j3 5:ce108eeb878d 107 TRSTL = 0,
j3 5:ce108eeb878d 108 TRSTL_OD,
j3 5:ce108eeb878d 109 TMSP,
j3 5:ce108eeb878d 110 TMSP_OD,
j3 5:ce108eeb878d 111 TW0L,
j3 5:ce108eeb878d 112 TW0L_OD,
j3 5:ce108eeb878d 113 TREC0, //OD NA
j3 5:ce108eeb878d 114 RWPU = 8 //OD NA, see DS2484 datasheet page 13
j3 5:ce108eeb878d 115 };
j3 5:ce108eeb878d 116
j3 5:ce108eeb878d 117 static const size_t POLL_LIMIT = 200;
j3 1:91e52f8ab8bf 118
j3 3:644fc630f958 119 /**
j3 3:644fc630f958 120 * Member functions that directly support DS248x I2C to 1-wire
j3 3:644fc630f958 121 * masters are documented in this file. Virtual function
j3 3:644fc630f958 122 * inerited from the interface class 'OneWireInterface'
j3 3:644fc630f958 123 * are documented in 'OneWireInterface.h', trying to follow
j3 3:644fc630f958 124 * a 'DRY' methodology, Don't Repeat Yourself.
j3 3:644fc630f958 125 */
j3 3:644fc630f958 126
j3 1:91e52f8ab8bf 127 /**********************************************************//**
j3 1:91e52f8ab8bf 128 * @brief Ds248x constructor
j3 1:91e52f8ab8bf 129 *
j3 1:91e52f8ab8bf 130 * @details allows user to use existing I2C object
j3 1:91e52f8ab8bf 131 *
j3 1:91e52f8ab8bf 132 * On Entry:
j3 1:91e52f8ab8bf 133 * @param[in] p_i2c_bus - pointer to existing I2C object
j3 1:91e52f8ab8bf 134 *
j3 1:91e52f8ab8bf 135 * On Exit:
j3 1:91e52f8ab8bf 136 * @return
j3 1:91e52f8ab8bf 137 **************************************************************/
j3 5:ce108eeb878d 138 Ds248x(I2C &i2c_bus, DS248X_I2C_ADRS adrs);
j3 1:91e52f8ab8bf 139
j3 1:91e52f8ab8bf 140
j3 1:91e52f8ab8bf 141 /**********************************************************//**
j3 1:91e52f8ab8bf 142 * @brief Ds248x constructor
j3 1:91e52f8ab8bf 143 *
j3 3:644fc630f958 144 * @details Object instantiates a new I2C object with no
j3 3:644fc630f958 145 * public access
j3 1:91e52f8ab8bf 146 *
j3 1:91e52f8ab8bf 147 * On Entry:
j3 1:91e52f8ab8bf 148 * @param[in] sda - sda pin of I2C bus
j3 1:91e52f8ab8bf 149 * @param[in] scl - scl pin of I2C bus
j3 1:91e52f8ab8bf 150 *
j3 1:91e52f8ab8bf 151 * On Exit:
j3 1:91e52f8ab8bf 152 * @return
j3 1:91e52f8ab8bf 153 **************************************************************/
j3 5:ce108eeb878d 154 Ds248x(PinName sda, PinName scl, DS248X_I2C_ADRS adrs);
j3 1:91e52f8ab8bf 155
j3 1:91e52f8ab8bf 156
j3 1:91e52f8ab8bf 157 /**********************************************************//**
j3 1:91e52f8ab8bf 158 * @brief Ds248x destructor
j3 1:91e52f8ab8bf 159 *
j3 1:91e52f8ab8bf 160 * @details deletes I2C object if owner
j3 1:91e52f8ab8bf 161 *
j3 1:91e52f8ab8bf 162 * On Entry:
j3 1:91e52f8ab8bf 163 *
j3 1:91e52f8ab8bf 164 * On Exit:
j3 1:91e52f8ab8bf 165 * @return
j3 1:91e52f8ab8bf 166 **************************************************************/
j3 5:ce108eeb878d 167 virtual ~Ds248x();
j3 1:91e52f8ab8bf 168
j3 1:91e52f8ab8bf 169
j3 1:91e52f8ab8bf 170 /**********************************************************//**
j3 1:91e52f8ab8bf 171 * @brief detect()
j3 1:91e52f8ab8bf 172 *
j3 1:91e52f8ab8bf 173 * @details Detect routine that performs a device reset
j3 1:91e52f8ab8bf 174 * followed by writing the configuration byte to default
j3 1:91e52f8ab8bf 175 * values:
j3 1:91e52f8ab8bf 176 * 1-Wire speed (c1WS) = standard (0)
j3 1:91e52f8ab8bf 177 * Strong pull-up (cSPU) = off (0)
j3 1:91e52f8ab8bf 178 * Presence pulse masking (cPPM) = off (0)
j3 1:91e52f8ab8bf 179 * Active pull-up (cAPU) = on (CONFIG_APU = 0x01)
j3 1:91e52f8ab8bf 180 *
j3 1:91e52f8ab8bf 181 * On Entry:
j3 1:91e52f8ab8bf 182 *
j3 1:91e52f8ab8bf 183 * On Exit:
j3 1:91e52f8ab8bf 184 * @return TRUE if device was detected and written
j3 1:91e52f8ab8bf 185 * FALSE device not detected or failure to write
j3 1:91e52f8ab8bf 186 * configuration byte
j3 1:91e52f8ab8bf 187 **************************************************************/
j3 2:02d228c25fd4 188 bool detect(void);
j3 1:91e52f8ab8bf 189
j3 1:91e52f8ab8bf 190
j3 1:91e52f8ab8bf 191 /**********************************************************//**
j3 1:91e52f8ab8bf 192 * @brief reset()
j3 1:91e52f8ab8bf 193 *
j3 1:91e52f8ab8bf 194 * @details Perform a device reset on the Ds248x
j3 1:91e52f8ab8bf 195 *
j3 1:91e52f8ab8bf 196 * On Entry:
j3 1:91e52f8ab8bf 197 *
j3 1:91e52f8ab8bf 198 * On Exit:
j3 1:91e52f8ab8bf 199 * @return TRUE if device was reset
j3 1:91e52f8ab8bf 200 * FALSE device not detected or failure to perform reset
j3 1:91e52f8ab8bf 201 **************************************************************/
j3 2:02d228c25fd4 202 bool reset(void);
j3 1:91e52f8ab8bf 203
j3 1:91e52f8ab8bf 204
j3 1:91e52f8ab8bf 205 /**********************************************************//**
j3 1:91e52f8ab8bf 206 * @brief write_config()
j3 1:91e52f8ab8bf 207 *
j3 1:91e52f8ab8bf 208 * @details Write the configuration register in the Ds248x. The
j3 1:91e52f8ab8bf 209 * configuration options are provided in the lower nibble
j3 1:91e52f8ab8bf 210 * of the provided config byte. The uppper nibble is
j3 1:91e52f8ab8bf 211 * bitwise inverted when written to the Ds248x.
j3 1:91e52f8ab8bf 212 *
j3 1:91e52f8ab8bf 213 * On Entry:
j3 1:91e52f8ab8bf 214 * @param[in] config - lower nib of configuration register
j3 1:91e52f8ab8bf 215 *
j3 1:91e52f8ab8bf 216 * On Exit:
j3 1:91e52f8ab8bf 217 * @return TRUE: config written and response correct
j3 1:91e52f8ab8bf 218 * FALSE: response incorrect
j3 1:91e52f8ab8bf 219 **************************************************************/
j3 2:02d228c25fd4 220 bool write_config(uint8_t config);
j3 2:02d228c25fd4 221
j3 2:02d228c25fd4 222
j3 2:02d228c25fd4 223 /**********************************************************//**
j3 2:02d228c25fd4 224 * @brief channel_select()
j3 2:02d228c25fd4 225 *
j3 2:02d228c25fd4 226 * @details Select the 1-Wire channel on a DS2482-800.
j3 2:02d228c25fd4 227 * Min channel = 1
j3 2:02d228c25fd4 228 *
j3 2:02d228c25fd4 229 * On Entry:
j3 2:02d228c25fd4 230 * @param[in] channel - desired channel of the DS2482
j3 2:02d228c25fd4 231 *
j3 2:02d228c25fd4 232 * On Exit:
j3 2:02d228c25fd4 233 * @return TRUE if channel selected
j3 2:02d228c25fd4 234 * FALSE device not detected or failure to perform select
j3 2:02d228c25fd4 235 **************************************************************/
j3 2:02d228c25fd4 236 bool channel_select(uint8_t channel);
j3 1:91e52f8ab8bf 237
j3 1:91e52f8ab8bf 238
j3 1:91e52f8ab8bf 239 /**********************************************************//**
j3 1:91e52f8ab8bf 240 * @brief adjust_timing()
j3 1:91e52f8ab8bf 241 *
j3 2:02d228c25fd4 242 * @details adjustable timming available in DS2484 only
j3 1:91e52f8ab8bf 243 *
j3 1:91e52f8ab8bf 244 * On Entry:
j3 1:91e52f8ab8bf 245 * @param[in] param - 1 of 8 adjustable parameters
j3 1:91e52f8ab8bf 246 * @param[in] val - new value for parameter, see datasheet
j3 1:91e52f8ab8bf 247 * for codes
j3 1:91e52f8ab8bf 248 *
j3 1:91e52f8ab8bf 249 * On Exit:
j3 1:91e52f8ab8bf 250 * @return TRUE: parameter successfully adjusted
j3 1:91e52f8ab8bf 251 * FALSE: failed to adjust parameter
j3 1:91e52f8ab8bf 252 **************************************************************/
j3 2:02d228c25fd4 253 bool adjust_timing(uint8_t param, uint8_t val);
j3 1:91e52f8ab8bf 254
j3 1:91e52f8ab8bf 255
j3 1:91e52f8ab8bf 256 /**********************************************************//**
j3 1:91e52f8ab8bf 257 * @brief search_triplet()
j3 1:91e52f8ab8bf 258 *
j3 1:91e52f8ab8bf 259 * @details Use the Ds248x help command '1-Wire triplet' to perform
j3 1:91e52f8ab8bf 260 * one bit of a 1-Wire search. This command does two read
j3 1:91e52f8ab8bf 261 * bits and one write bit. The write bit is either the
j3 1:91e52f8ab8bf 262 * default direction (all device have same bit) or in case
j3 1:91e52f8ab8bf 263 * of a discrepancy, the 'search_direction' parameter is
j3 1:91e52f8ab8bf 264 * used.
j3 1:91e52f8ab8bf 265 *
j3 1:91e52f8ab8bf 266 * On Entry:
j3 1:91e52f8ab8bf 267 * @param[in] search_direction
j3 1:91e52f8ab8bf 268 *
j3 1:91e52f8ab8bf 269 * On Exit:
j3 1:91e52f8ab8bf 270 * @return The Ds248x status byte result from the triplet command
j3 1:91e52f8ab8bf 271 **************************************************************/
j3 1:91e52f8ab8bf 272 uint8_t search_triplet(uint8_t search_direction);
j3 1:91e52f8ab8bf 273
j3 5:ce108eeb878d 274
j3 15:f6cb0d906fb6 275 //Part of OneWireInterface that should be implemented for each master
j3 15:f6cb0d906fb6 276 //See OneWireInterface.h for documentation
j3 15:f6cb0d906fb6 277
j3 14:7b2886a50321 278 virtual bool OWInitMaster();
j3 14:7b2886a50321 279
j3 2:02d228c25fd4 280 virtual bool OWReset();
j3 1:91e52f8ab8bf 281
j3 1:91e52f8ab8bf 282 virtual uint8_t OWTouchBit(uint8_t sendbit);
j3 3:644fc630f958 283
j3 2:02d228c25fd4 284 virtual bool OWWriteByte(uint8_t sendbyte);
j3 3:644fc630f958 285
j3 1:91e52f8ab8bf 286 virtual uint8_t OWReadByte(void);
j3 1:91e52f8ab8bf 287
j3 2:02d228c25fd4 288 virtual bool OWSearch(void);
j3 3:644fc630f958 289
j3 5:ce108eeb878d 290 virtual uint8_t OWSpeed(OW_SPEED new_speed);
j3 3:644fc630f958 291
j3 5:ce108eeb878d 292 virtual uint8_t OWLevel(OW_LEVEL new_level);
j3 3:644fc630f958 293
j3 2:02d228c25fd4 294 virtual bool OWWriteBytePower(uint8_t sendbyte);
j3 3:644fc630f958 295
j3 2:02d228c25fd4 296 virtual bool OWReadBitPower(uint8_t applyPowerResponse);
j3 2:02d228c25fd4 297
j3 1:91e52f8ab8bf 298 private:
j3 1:91e52f8ab8bf 299
j3 6:1faafa0b3cd7 300 //private fx for initializing _w_adrs and _r_adrs
j3 6:1faafa0b3cd7 301 void set_i2c_adrs(DS248X_I2C_ADRS adrs);
j3 5:ce108eeb878d 302
j3 1:91e52f8ab8bf 303 I2C *_p_i2c_bus;
j3 1:91e52f8ab8bf 304 uint8_t _w_adrs, _r_adrs;
j3 5:ce108eeb878d 305 bool _i2c_owner;
j3 2:02d228c25fd4 306
j3 2:02d228c25fd4 307 // ds248x state
j3 2:02d228c25fd4 308 uint8_t _short_detected;
j3 15:f6cb0d906fb6 309 uint8_t _c1WS, _cSPU, _cPDN, _cAPU;
j3 1:91e52f8ab8bf 310 };
j3 1:91e52f8ab8bf 311
j3 1:91e52f8ab8bf 312 #endif /*DS248X_H*/