Aleksandrs Gumenuks / MaximInterface_Extended

Dependents:   mbed_DS28EC20_GPIO

Committer:
IanBenzMaxim
Date:
Wed Jan 23 13:11:04 2019 -0600
Revision:
6:a8c83a2e6fa4
Parent:
0:f77ad7f72d04
Child:
7:471901a04573
Updated to version 1.6 and removed platform files that are incompatible with mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:f77ad7f72d04 1 /*******************************************************************************
IanBenzMaxim 0:f77ad7f72d04 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:f77ad7f72d04 3 *
IanBenzMaxim 0:f77ad7f72d04 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:f77ad7f72d04 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:f77ad7f72d04 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:f77ad7f72d04 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:f77ad7f72d04 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:f77ad7f72d04 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:f77ad7f72d04 10 *
IanBenzMaxim 0:f77ad7f72d04 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:f77ad7f72d04 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:f77ad7f72d04 13 *
IanBenzMaxim 0:f77ad7f72d04 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:f77ad7f72d04 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:f77ad7f72d04 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:f77ad7f72d04 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:f77ad7f72d04 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:f77ad7f72d04 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:f77ad7f72d04 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:f77ad7f72d04 21 *
IanBenzMaxim 0:f77ad7f72d04 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:f77ad7f72d04 25 *
IanBenzMaxim 0:f77ad7f72d04 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:f77ad7f72d04 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:f77ad7f72d04 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:f77ad7f72d04 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:f77ad7f72d04 30 * ownership rights.
IanBenzMaxim 0:f77ad7f72d04 31 *******************************************************************************/
IanBenzMaxim 0:f77ad7f72d04 32
IanBenzMaxim 0:f77ad7f72d04 33 #include <MaximInterface/Utilities/Error.hpp>
IanBenzMaxim 0:f77ad7f72d04 34 #include "DS2482_DS2484.hpp"
IanBenzMaxim 0:f77ad7f72d04 35
IanBenzMaxim 0:f77ad7f72d04 36 namespace MaximInterface {
IanBenzMaxim 0:f77ad7f72d04 37
IanBenzMaxim 0:f77ad7f72d04 38 // Device Status bits
IanBenzMaxim 0:f77ad7f72d04 39 enum StatusBit {
IanBenzMaxim 0:f77ad7f72d04 40 Status_1WB = 0x01,
IanBenzMaxim 0:f77ad7f72d04 41 Status_PPD = 0x02,
IanBenzMaxim 0:f77ad7f72d04 42 Status_SD = 0x04,
IanBenzMaxim 0:f77ad7f72d04 43 Status_LL = 0x08,
IanBenzMaxim 0:f77ad7f72d04 44 Status_RST = 0x10,
IanBenzMaxim 0:f77ad7f72d04 45 Status_SBR = 0x20,
IanBenzMaxim 0:f77ad7f72d04 46 Status_TSB = 0x40,
IanBenzMaxim 0:f77ad7f72d04 47 Status_DIR = 0x80
IanBenzMaxim 0:f77ad7f72d04 48 };
IanBenzMaxim 0:f77ad7f72d04 49
IanBenzMaxim 0:f77ad7f72d04 50 error_code DS2482_DS2484::initialize(Config config) {
IanBenzMaxim 0:f77ad7f72d04 51 error_code result = resetDevice();
IanBenzMaxim 0:f77ad7f72d04 52 if (result) {
IanBenzMaxim 0:f77ad7f72d04 53 return result;
IanBenzMaxim 0:f77ad7f72d04 54 }
IanBenzMaxim 6:a8c83a2e6fa4 55 // Write the default configuration setup.
IanBenzMaxim 0:f77ad7f72d04 56 result = writeConfig(config);
IanBenzMaxim 0:f77ad7f72d04 57 return result;
IanBenzMaxim 0:f77ad7f72d04 58 }
IanBenzMaxim 0:f77ad7f72d04 59
IanBenzMaxim 0:f77ad7f72d04 60 error_code DS2482_DS2484::resetDevice() {
IanBenzMaxim 0:f77ad7f72d04 61 // Device Reset
IanBenzMaxim 0:f77ad7f72d04 62 // S AD,0 [A] DRST [A] Sr AD,1 [A] [SS] A\ P
IanBenzMaxim 0:f77ad7f72d04 63 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 64 // SS status byte to read to verify state
IanBenzMaxim 0:f77ad7f72d04 65
IanBenzMaxim 6:a8c83a2e6fa4 66 error_code result = sendCommand(0xF0);
IanBenzMaxim 6:a8c83a2e6fa4 67 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 68 return result;
IanBenzMaxim 0:f77ad7f72d04 69 }
IanBenzMaxim 0:f77ad7f72d04 70
IanBenzMaxim 6:a8c83a2e6fa4 71 uint_least8_t buf;
IanBenzMaxim 6:a8c83a2e6fa4 72 result = readRegister(buf);
IanBenzMaxim 6:a8c83a2e6fa4 73 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 74 return result;
IanBenzMaxim 0:f77ad7f72d04 75 }
IanBenzMaxim 0:f77ad7f72d04 76
IanBenzMaxim 6:a8c83a2e6fa4 77 if ((buf & 0xF7) != 0x10) {
IanBenzMaxim 6:a8c83a2e6fa4 78 return make_error_code(HardwareError);
IanBenzMaxim 0:f77ad7f72d04 79 }
IanBenzMaxim 0:f77ad7f72d04 80
IanBenzMaxim 6:a8c83a2e6fa4 81 // Do a command to get 1-Wire master reset out of holding state.
IanBenzMaxim 6:a8c83a2e6fa4 82 reset();
IanBenzMaxim 6:a8c83a2e6fa4 83
IanBenzMaxim 0:f77ad7f72d04 84 return result;
IanBenzMaxim 0:f77ad7f72d04 85 }
IanBenzMaxim 0:f77ad7f72d04 86
IanBenzMaxim 0:f77ad7f72d04 87 error_code DS2482_DS2484::triplet(TripletData & data) {
IanBenzMaxim 0:f77ad7f72d04 88 // 1-Wire Triplet (Case B)
IanBenzMaxim 0:f77ad7f72d04 89 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 0:f77ad7f72d04 90 // \--------/
IanBenzMaxim 0:f77ad7f72d04 91 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 0:f77ad7f72d04 92 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 93 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 0:f77ad7f72d04 94
IanBenzMaxim 6:a8c83a2e6fa4 95 error_code result = sendCommand(0x78, data.writeBit ? 0x80 : 0x00);
IanBenzMaxim 0:f77ad7f72d04 96 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 97 uint_least8_t status;
IanBenzMaxim 0:f77ad7f72d04 98 result = pollBusy(&status);
IanBenzMaxim 0:f77ad7f72d04 99 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 100 data.readBit = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 0:f77ad7f72d04 101 data.readBitComplement = ((status & Status_TSB) == Status_TSB);
IanBenzMaxim 0:f77ad7f72d04 102 data.writeBit = ((status & Status_DIR) == Status_DIR);
IanBenzMaxim 0:f77ad7f72d04 103 }
IanBenzMaxim 0:f77ad7f72d04 104 }
IanBenzMaxim 0:f77ad7f72d04 105 return result;
IanBenzMaxim 0:f77ad7f72d04 106 }
IanBenzMaxim 0:f77ad7f72d04 107
IanBenzMaxim 0:f77ad7f72d04 108 error_code DS2482_DS2484::reset() {
IanBenzMaxim 0:f77ad7f72d04 109 // 1-Wire reset (Case B)
IanBenzMaxim 0:f77ad7f72d04 110 // S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 0:f77ad7f72d04 111 // \--------/
IanBenzMaxim 0:f77ad7f72d04 112 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 0:f77ad7f72d04 113 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 114
IanBenzMaxim 6:a8c83a2e6fa4 115 error_code result = sendCommand(0xB4);
IanBenzMaxim 6:a8c83a2e6fa4 116 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 117 return result;
IanBenzMaxim 0:f77ad7f72d04 118 }
IanBenzMaxim 0:f77ad7f72d04 119
IanBenzMaxim 6:a8c83a2e6fa4 120 uint_least8_t buf;
IanBenzMaxim 6:a8c83a2e6fa4 121 result = pollBusy(&buf);
IanBenzMaxim 6:a8c83a2e6fa4 122 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 123 return result;
IanBenzMaxim 6:a8c83a2e6fa4 124 }
IanBenzMaxim 6:a8c83a2e6fa4 125
IanBenzMaxim 6:a8c83a2e6fa4 126 if ((buf & Status_SD) == Status_SD) {
IanBenzMaxim 6:a8c83a2e6fa4 127 result = make_error_code(ShortDetectedError);
IanBenzMaxim 6:a8c83a2e6fa4 128 } else if ((buf & Status_PPD) != Status_PPD) {
IanBenzMaxim 6:a8c83a2e6fa4 129 result = make_error_code(NoSlaveError);
IanBenzMaxim 0:f77ad7f72d04 130 }
IanBenzMaxim 0:f77ad7f72d04 131
IanBenzMaxim 0:f77ad7f72d04 132 return result;
IanBenzMaxim 0:f77ad7f72d04 133 }
IanBenzMaxim 0:f77ad7f72d04 134
IanBenzMaxim 6:a8c83a2e6fa4 135 error_code DS2482_DS2484::touchBitSetLevel(bool & sendRecvBit,
IanBenzMaxim 6:a8c83a2e6fa4 136 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 137 // 1-Wire bit (Case B)
IanBenzMaxim 0:f77ad7f72d04 138 // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 0:f77ad7f72d04 139 // \--------/
IanBenzMaxim 0:f77ad7f72d04 140 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 0:f77ad7f72d04 141 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 142 // BB indicates byte containing bit value in msbit
IanBenzMaxim 0:f77ad7f72d04 143
IanBenzMaxim 0:f77ad7f72d04 144 error_code result = configureLevel(afterLevel);
IanBenzMaxim 6:a8c83a2e6fa4 145 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 146 return result;
IanBenzMaxim 6:a8c83a2e6fa4 147 }
IanBenzMaxim 0:f77ad7f72d04 148
IanBenzMaxim 6:a8c83a2e6fa4 149 result = sendCommand(0x87, sendRecvBit ? 0x80 : 0x00);
IanBenzMaxim 6:a8c83a2e6fa4 150 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 151 return result;
IanBenzMaxim 0:f77ad7f72d04 152 }
IanBenzMaxim 0:f77ad7f72d04 153
IanBenzMaxim 0:f77ad7f72d04 154 uint_least8_t status;
IanBenzMaxim 6:a8c83a2e6fa4 155 result = pollBusy(&status);
IanBenzMaxim 0:f77ad7f72d04 156 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 157 sendRecvBit = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 0:f77ad7f72d04 158 }
IanBenzMaxim 0:f77ad7f72d04 159 return result;
IanBenzMaxim 0:f77ad7f72d04 160 }
IanBenzMaxim 0:f77ad7f72d04 161
IanBenzMaxim 6:a8c83a2e6fa4 162 error_code DS2482_DS2484::writeByteSetLevel(uint_least8_t sendByte,
IanBenzMaxim 6:a8c83a2e6fa4 163 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 164 // 1-Wire Write Byte (Case B)
IanBenzMaxim 0:f77ad7f72d04 165 // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 0:f77ad7f72d04 166 // \--------/
IanBenzMaxim 0:f77ad7f72d04 167 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 0:f77ad7f72d04 168 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 169 // DD data to write
IanBenzMaxim 0:f77ad7f72d04 170
IanBenzMaxim 0:f77ad7f72d04 171 error_code result = configureLevel(afterLevel);
IanBenzMaxim 0:f77ad7f72d04 172 if (result) {
IanBenzMaxim 0:f77ad7f72d04 173 return result;
IanBenzMaxim 0:f77ad7f72d04 174 }
IanBenzMaxim 0:f77ad7f72d04 175
IanBenzMaxim 6:a8c83a2e6fa4 176 result = sendCommand(0xA5, sendByte);
IanBenzMaxim 6:a8c83a2e6fa4 177 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 178 return result;
IanBenzMaxim 0:f77ad7f72d04 179 }
IanBenzMaxim 0:f77ad7f72d04 180
IanBenzMaxim 6:a8c83a2e6fa4 181 result = pollBusy();
IanBenzMaxim 0:f77ad7f72d04 182 return result;
IanBenzMaxim 0:f77ad7f72d04 183 }
IanBenzMaxim 0:f77ad7f72d04 184
IanBenzMaxim 0:f77ad7f72d04 185 error_code DS2482_DS2484::readByteSetLevel(uint_least8_t & recvByte,
IanBenzMaxim 6:a8c83a2e6fa4 186 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 187 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 0:f77ad7f72d04 188 // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A
IanBenzMaxim 0:f77ad7f72d04 189 // \--------/
IanBenzMaxim 0:f77ad7f72d04 190 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 0:f77ad7f72d04 191 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 0:f77ad7f72d04 192 //
IanBenzMaxim 0:f77ad7f72d04 193 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 194 // DD data read
IanBenzMaxim 0:f77ad7f72d04 195
IanBenzMaxim 0:f77ad7f72d04 196 error_code result = configureLevel(afterLevel);
IanBenzMaxim 0:f77ad7f72d04 197 if (result) {
IanBenzMaxim 0:f77ad7f72d04 198 return result;
IanBenzMaxim 0:f77ad7f72d04 199 }
IanBenzMaxim 0:f77ad7f72d04 200
IanBenzMaxim 6:a8c83a2e6fa4 201 result = sendCommand(0x96);
IanBenzMaxim 6:a8c83a2e6fa4 202 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 203 return result;
IanBenzMaxim 0:f77ad7f72d04 204 }
IanBenzMaxim 0:f77ad7f72d04 205
IanBenzMaxim 6:a8c83a2e6fa4 206 result = pollBusy();
IanBenzMaxim 6:a8c83a2e6fa4 207 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 208 return result;
IanBenzMaxim 0:f77ad7f72d04 209 }
IanBenzMaxim 0:f77ad7f72d04 210
IanBenzMaxim 6:a8c83a2e6fa4 211 result = readRegister(0xE1, recvByte);
IanBenzMaxim 0:f77ad7f72d04 212 return result;
IanBenzMaxim 0:f77ad7f72d04 213 }
IanBenzMaxim 0:f77ad7f72d04 214
IanBenzMaxim 0:f77ad7f72d04 215 error_code DS2482_DS2484::setSpeed(Speed newSpeed) {
IanBenzMaxim 0:f77ad7f72d04 216 // Check if supported speed
IanBenzMaxim 0:f77ad7f72d04 217 if (!((newSpeed == OverdriveSpeed) || (newSpeed == StandardSpeed))) {
IanBenzMaxim 0:f77ad7f72d04 218 return make_error_code(InvalidSpeedError);
IanBenzMaxim 0:f77ad7f72d04 219 }
IanBenzMaxim 0:f77ad7f72d04 220 // Check if requested speed is already set
IanBenzMaxim 0:f77ad7f72d04 221 if (curConfig.get1WS() == (newSpeed == OverdriveSpeed)) {
IanBenzMaxim 0:f77ad7f72d04 222 return error_code();
IanBenzMaxim 0:f77ad7f72d04 223 }
IanBenzMaxim 0:f77ad7f72d04 224 // Set the speed
IanBenzMaxim 0:f77ad7f72d04 225 Config newConfig = curConfig;
IanBenzMaxim 0:f77ad7f72d04 226 newConfig.set1WS(newSpeed == OverdriveSpeed);
IanBenzMaxim 0:f77ad7f72d04 227 return writeConfig(newConfig);
IanBenzMaxim 0:f77ad7f72d04 228 }
IanBenzMaxim 0:f77ad7f72d04 229
IanBenzMaxim 0:f77ad7f72d04 230 error_code DS2482_DS2484::setLevel(Level newLevel) {
IanBenzMaxim 0:f77ad7f72d04 231 if (newLevel == StrongLevel) {
IanBenzMaxim 0:f77ad7f72d04 232 return make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 233 }
IanBenzMaxim 0:f77ad7f72d04 234
IanBenzMaxim 0:f77ad7f72d04 235 return configureLevel(newLevel);
IanBenzMaxim 0:f77ad7f72d04 236 }
IanBenzMaxim 0:f77ad7f72d04 237
IanBenzMaxim 0:f77ad7f72d04 238 error_code DS2482_DS2484::writeConfig(Config config) {
IanBenzMaxim 6:a8c83a2e6fa4 239 uint_least8_t configBuf =
IanBenzMaxim 6:a8c83a2e6fa4 240 ((config.readByte() ^ 0xF) << 4) | config.readByte();
IanBenzMaxim 6:a8c83a2e6fa4 241 error_code result = sendCommand(0xD2, configBuf);
IanBenzMaxim 0:f77ad7f72d04 242 if (!result) {
IanBenzMaxim 6:a8c83a2e6fa4 243 result = readRegister(0xC3, configBuf);
IanBenzMaxim 0:f77ad7f72d04 244 }
IanBenzMaxim 0:f77ad7f72d04 245 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 246 if (configBuf != config.readByte()) {
IanBenzMaxim 0:f77ad7f72d04 247 result = make_error_code(HardwareError);
IanBenzMaxim 0:f77ad7f72d04 248 }
IanBenzMaxim 0:f77ad7f72d04 249 }
IanBenzMaxim 0:f77ad7f72d04 250 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 251 curConfig = config;
IanBenzMaxim 0:f77ad7f72d04 252 }
IanBenzMaxim 0:f77ad7f72d04 253 return result;
IanBenzMaxim 0:f77ad7f72d04 254 }
IanBenzMaxim 0:f77ad7f72d04 255
IanBenzMaxim 6:a8c83a2e6fa4 256 error_code DS2482_DS2484::readRegister(uint_least8_t reg,
IanBenzMaxim 6:a8c83a2e6fa4 257 uint_least8_t & buf) const {
IanBenzMaxim 6:a8c83a2e6fa4 258 error_code result = sendCommand(0xE1, reg);
IanBenzMaxim 0:f77ad7f72d04 259 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 260 result = readRegister(buf);
IanBenzMaxim 0:f77ad7f72d04 261 }
IanBenzMaxim 0:f77ad7f72d04 262 return result;
IanBenzMaxim 0:f77ad7f72d04 263 }
IanBenzMaxim 0:f77ad7f72d04 264
IanBenzMaxim 0:f77ad7f72d04 265 error_code DS2482_DS2484::readRegister(uint_least8_t & buf) const {
IanBenzMaxim 6:a8c83a2e6fa4 266 return master->readPacket(address_, make_span(&buf, 1));
IanBenzMaxim 0:f77ad7f72d04 267 }
IanBenzMaxim 0:f77ad7f72d04 268
IanBenzMaxim 0:f77ad7f72d04 269 error_code DS2482_DS2484::pollBusy(uint_least8_t * pStatus) {
IanBenzMaxim 0:f77ad7f72d04 270 const int pollLimit = 200;
IanBenzMaxim 0:f77ad7f72d04 271
IanBenzMaxim 0:f77ad7f72d04 272 int pollCount = 0;
IanBenzMaxim 0:f77ad7f72d04 273 uint_least8_t status;
IanBenzMaxim 0:f77ad7f72d04 274 do {
IanBenzMaxim 0:f77ad7f72d04 275 error_code result = readRegister(status);
IanBenzMaxim 0:f77ad7f72d04 276 if (result) {
IanBenzMaxim 0:f77ad7f72d04 277 return result;
IanBenzMaxim 0:f77ad7f72d04 278 }
IanBenzMaxim 0:f77ad7f72d04 279 if (pStatus != NULL) {
IanBenzMaxim 0:f77ad7f72d04 280 *pStatus = status;
IanBenzMaxim 0:f77ad7f72d04 281 }
IanBenzMaxim 0:f77ad7f72d04 282 if (pollCount++ >= pollLimit) {
IanBenzMaxim 0:f77ad7f72d04 283 return make_error_code(HardwareError);
IanBenzMaxim 0:f77ad7f72d04 284 }
IanBenzMaxim 0:f77ad7f72d04 285 } while (status & Status_1WB);
IanBenzMaxim 0:f77ad7f72d04 286
IanBenzMaxim 0:f77ad7f72d04 287 return error_code();
IanBenzMaxim 0:f77ad7f72d04 288 }
IanBenzMaxim 0:f77ad7f72d04 289
IanBenzMaxim 0:f77ad7f72d04 290 error_code DS2482_DS2484::configureLevel(Level level) {
IanBenzMaxim 0:f77ad7f72d04 291 // Check if supported level
IanBenzMaxim 0:f77ad7f72d04 292 if (!((level == NormalLevel) || (level == StrongLevel))) {
IanBenzMaxim 0:f77ad7f72d04 293 return make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 294 }
IanBenzMaxim 0:f77ad7f72d04 295 // Check if requested level already set
IanBenzMaxim 0:f77ad7f72d04 296 if (curConfig.getSPU() == (level == StrongLevel)) {
IanBenzMaxim 0:f77ad7f72d04 297 return error_code();
IanBenzMaxim 0:f77ad7f72d04 298 }
IanBenzMaxim 0:f77ad7f72d04 299 // Set the level
IanBenzMaxim 0:f77ad7f72d04 300 Config newConfig = curConfig;
IanBenzMaxim 0:f77ad7f72d04 301 newConfig.setSPU(level == StrongLevel);
IanBenzMaxim 0:f77ad7f72d04 302 return writeConfig(newConfig);
IanBenzMaxim 0:f77ad7f72d04 303 }
IanBenzMaxim 0:f77ad7f72d04 304
IanBenzMaxim 0:f77ad7f72d04 305 error_code DS2482_DS2484::sendCommand(uint_least8_t cmd) const {
IanBenzMaxim 6:a8c83a2e6fa4 306 return master->writePacket(address_, make_span(&cmd, 1));
IanBenzMaxim 0:f77ad7f72d04 307 }
IanBenzMaxim 0:f77ad7f72d04 308
IanBenzMaxim 6:a8c83a2e6fa4 309 error_code DS2482_DS2484::sendCommand(uint_least8_t cmd,
IanBenzMaxim 6:a8c83a2e6fa4 310 uint_least8_t param) const {
IanBenzMaxim 0:f77ad7f72d04 311 uint_least8_t buf[] = {cmd, param};
IanBenzMaxim 6:a8c83a2e6fa4 312 return master->writePacket(address_, buf);
IanBenzMaxim 0:f77ad7f72d04 313 }
IanBenzMaxim 0:f77ad7f72d04 314
IanBenzMaxim 0:f77ad7f72d04 315 const error_category & DS2482_DS2484::errorCategory() {
IanBenzMaxim 0:f77ad7f72d04 316 static class : public error_category {
IanBenzMaxim 0:f77ad7f72d04 317 public:
IanBenzMaxim 0:f77ad7f72d04 318 virtual const char * name() const { return "DS2482_DS2484"; }
IanBenzMaxim 0:f77ad7f72d04 319
IanBenzMaxim 0:f77ad7f72d04 320 virtual std::string message(int condition) const {
IanBenzMaxim 0:f77ad7f72d04 321 switch (condition) {
IanBenzMaxim 0:f77ad7f72d04 322 case HardwareError:
IanBenzMaxim 0:f77ad7f72d04 323 return "Hardware Error";
IanBenzMaxim 0:f77ad7f72d04 324
IanBenzMaxim 0:f77ad7f72d04 325 case ArgumentOutOfRangeError:
IanBenzMaxim 0:f77ad7f72d04 326 return "Argument Out of Range Error";
IanBenzMaxim 0:f77ad7f72d04 327
IanBenzMaxim 0:f77ad7f72d04 328 default:
IanBenzMaxim 0:f77ad7f72d04 329 return defaultErrorMessage(condition);
IanBenzMaxim 0:f77ad7f72d04 330 }
IanBenzMaxim 0:f77ad7f72d04 331 }
IanBenzMaxim 0:f77ad7f72d04 332 } instance;
IanBenzMaxim 0:f77ad7f72d04 333 return instance;
IanBenzMaxim 0:f77ad7f72d04 334 }
IanBenzMaxim 0:f77ad7f72d04 335
IanBenzMaxim 0:f77ad7f72d04 336 error_code DS2482_800::selectChannel(int channel) {
IanBenzMaxim 0:f77ad7f72d04 337 // Channel Select (Case A)
IanBenzMaxim 0:f77ad7f72d04 338 // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P
IanBenzMaxim 0:f77ad7f72d04 339 // [] indicates from slave
IanBenzMaxim 0:f77ad7f72d04 340 // CC channel value
IanBenzMaxim 0:f77ad7f72d04 341 // RR channel read back
IanBenzMaxim 0:f77ad7f72d04 342
IanBenzMaxim 0:f77ad7f72d04 343 uint_least8_t ch;
IanBenzMaxim 0:f77ad7f72d04 344 uint_least8_t ch_read;
IanBenzMaxim 0:f77ad7f72d04 345 switch (channel) {
IanBenzMaxim 0:f77ad7f72d04 346 case 0:
IanBenzMaxim 0:f77ad7f72d04 347 ch = 0xF0;
IanBenzMaxim 0:f77ad7f72d04 348 ch_read = 0xB8;
IanBenzMaxim 0:f77ad7f72d04 349 break;
IanBenzMaxim 0:f77ad7f72d04 350
IanBenzMaxim 0:f77ad7f72d04 351 case 1:
IanBenzMaxim 0:f77ad7f72d04 352 ch = 0xE1;
IanBenzMaxim 0:f77ad7f72d04 353 ch_read = 0xB1;
IanBenzMaxim 0:f77ad7f72d04 354 break;
IanBenzMaxim 0:f77ad7f72d04 355
IanBenzMaxim 0:f77ad7f72d04 356 case 2:
IanBenzMaxim 0:f77ad7f72d04 357 ch = 0xD2;
IanBenzMaxim 0:f77ad7f72d04 358 ch_read = 0xAA;
IanBenzMaxim 0:f77ad7f72d04 359 break;
IanBenzMaxim 0:f77ad7f72d04 360
IanBenzMaxim 0:f77ad7f72d04 361 case 3:
IanBenzMaxim 0:f77ad7f72d04 362 ch = 0xC3;
IanBenzMaxim 0:f77ad7f72d04 363 ch_read = 0xA3;
IanBenzMaxim 0:f77ad7f72d04 364 break;
IanBenzMaxim 0:f77ad7f72d04 365
IanBenzMaxim 0:f77ad7f72d04 366 case 4:
IanBenzMaxim 0:f77ad7f72d04 367 ch = 0xB4;
IanBenzMaxim 0:f77ad7f72d04 368 ch_read = 0x9C;
IanBenzMaxim 0:f77ad7f72d04 369 break;
IanBenzMaxim 0:f77ad7f72d04 370
IanBenzMaxim 0:f77ad7f72d04 371 case 5:
IanBenzMaxim 0:f77ad7f72d04 372 ch = 0xA5;
IanBenzMaxim 0:f77ad7f72d04 373 ch_read = 0x95;
IanBenzMaxim 0:f77ad7f72d04 374 break;
IanBenzMaxim 0:f77ad7f72d04 375
IanBenzMaxim 0:f77ad7f72d04 376 case 6:
IanBenzMaxim 0:f77ad7f72d04 377 ch = 0x96;
IanBenzMaxim 0:f77ad7f72d04 378 ch_read = 0x8E;
IanBenzMaxim 0:f77ad7f72d04 379 break;
IanBenzMaxim 0:f77ad7f72d04 380
IanBenzMaxim 0:f77ad7f72d04 381 case 7:
IanBenzMaxim 0:f77ad7f72d04 382 ch = 0x87;
IanBenzMaxim 0:f77ad7f72d04 383 ch_read = 0x87;
IanBenzMaxim 0:f77ad7f72d04 384 break;
IanBenzMaxim 0:f77ad7f72d04 385
IanBenzMaxim 0:f77ad7f72d04 386 default:
IanBenzMaxim 0:f77ad7f72d04 387 return make_error_code(ArgumentOutOfRangeError);
IanBenzMaxim 0:f77ad7f72d04 388 };
IanBenzMaxim 0:f77ad7f72d04 389
IanBenzMaxim 6:a8c83a2e6fa4 390 error_code result = sendCommand(0xC3, ch);
IanBenzMaxim 0:f77ad7f72d04 391 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 392 result = readRegister(ch);
IanBenzMaxim 0:f77ad7f72d04 393 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 394 // check for failure due to incorrect read back of channel
IanBenzMaxim 0:f77ad7f72d04 395 if (ch != ch_read) {
IanBenzMaxim 0:f77ad7f72d04 396 result = make_error_code(HardwareError);
IanBenzMaxim 0:f77ad7f72d04 397 }
IanBenzMaxim 0:f77ad7f72d04 398 }
IanBenzMaxim 0:f77ad7f72d04 399 }
IanBenzMaxim 0:f77ad7f72d04 400
IanBenzMaxim 0:f77ad7f72d04 401 return result;
IanBenzMaxim 0:f77ad7f72d04 402 }
IanBenzMaxim 0:f77ad7f72d04 403
IanBenzMaxim 0:f77ad7f72d04 404 error_code DS2484::adjustPort(PortParameter param, int val) {
IanBenzMaxim 0:f77ad7f72d04 405 if (val < 0 || val > 15) {
IanBenzMaxim 0:f77ad7f72d04 406 return make_error_code(ArgumentOutOfRangeError);
IanBenzMaxim 0:f77ad7f72d04 407 }
IanBenzMaxim 0:f77ad7f72d04 408
IanBenzMaxim 6:a8c83a2e6fa4 409 error_code result = sendCommand(0xC3, (param << 4) | val);
IanBenzMaxim 0:f77ad7f72d04 410 if (result) {
IanBenzMaxim 0:f77ad7f72d04 411 return result;
IanBenzMaxim 0:f77ad7f72d04 412 }
IanBenzMaxim 0:f77ad7f72d04 413
IanBenzMaxim 6:a8c83a2e6fa4 414 uint_least8_t portConfig = val + 1;
IanBenzMaxim 6:a8c83a2e6fa4 415 for (int numReads = -1; numReads < param; numReads++) {
IanBenzMaxim 0:f77ad7f72d04 416 result = readRegister(portConfig);
IanBenzMaxim 0:f77ad7f72d04 417 if (result) {
IanBenzMaxim 0:f77ad7f72d04 418 return result;
IanBenzMaxim 0:f77ad7f72d04 419 }
IanBenzMaxim 0:f77ad7f72d04 420 }
IanBenzMaxim 0:f77ad7f72d04 421 if (val != portConfig) {
IanBenzMaxim 0:f77ad7f72d04 422 result = make_error_code(HardwareError);
IanBenzMaxim 0:f77ad7f72d04 423 }
IanBenzMaxim 0:f77ad7f72d04 424
IanBenzMaxim 0:f77ad7f72d04 425 return result;
IanBenzMaxim 0:f77ad7f72d04 426 }
IanBenzMaxim 0:f77ad7f72d04 427
IanBenzMaxim 0:f77ad7f72d04 428 } // namespace MaximInterface