Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Fri Feb 17 21:54:14 2017 +0000
Revision:
141:cf38f48a2a49
Parent:
139:f0e0a7976846
Updated OneWireMaster, DS2465, and DS2431 to synchronize with svn

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 75:8b627804927c 1 /******************************************************************//**
IanBenzMaxim 75:8b627804927c 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 75:8b627804927c 3 *
IanBenzMaxim 75:8b627804927c 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 75:8b627804927c 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 75:8b627804927c 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 75:8b627804927c 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 75:8b627804927c 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 75:8b627804927c 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 75:8b627804927c 10 *
IanBenzMaxim 75:8b627804927c 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 75:8b627804927c 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 75:8b627804927c 13 *
IanBenzMaxim 75:8b627804927c 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 75:8b627804927c 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 75:8b627804927c 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 75:8b627804927c 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 75:8b627804927c 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 75:8b627804927c 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 75:8b627804927c 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 75:8b627804927c 21 *
IanBenzMaxim 75:8b627804927c 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 75:8b627804927c 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 75:8b627804927c 24 * Products, Inc. Branding Policy.
IanBenzMaxim 75:8b627804927c 25 *
IanBenzMaxim 75:8b627804927c 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 75:8b627804927c 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 75:8b627804927c 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 75:8b627804927c 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 75:8b627804927c 30 * ownership rights.
IanBenzMaxim 75:8b627804927c 31 **********************************************************************/
IanBenzMaxim 75:8b627804927c 32
j3 104:3f48daed532b 33 #include "Masters/DS2465/DS2465.h"
IanBenzMaxim 73:2cecc1372acc 34 #include "I2C.h"
IanBenzMaxim 73:2cecc1372acc 35 #include "wait_api.h"
IanBenzMaxim 21:00c94aeb533e 36
IanBenzMaxim 78:0cbbac7f2016 37 using namespace OneWire;
IanBenzMaxim 78:0cbbac7f2016 38
IanBenzMaxim 21:00c94aeb533e 39 #define I2C_WRITE 0
IanBenzMaxim 21:00c94aeb533e 40 #define I2C_READ 1
IanBenzMaxim 21:00c94aeb533e 41
IanBenzMaxim 78:0cbbac7f2016 42 /// DS2465 Commands
IanBenzMaxim 78:0cbbac7f2016 43 enum Command
IanBenzMaxim 78:0cbbac7f2016 44 {
IanBenzMaxim 78:0cbbac7f2016 45 DeviceResetCmd = 0xF0,
IanBenzMaxim 78:0cbbac7f2016 46 WriteDeviceConfigCmd = 0xD2,
IanBenzMaxim 78:0cbbac7f2016 47 OwResetCmd = 0xB4,
IanBenzMaxim 78:0cbbac7f2016 48 OwWriteByteCmd = 0xA5,
IanBenzMaxim 78:0cbbac7f2016 49 OwReadByteCmd = 0x96,
IanBenzMaxim 78:0cbbac7f2016 50 OwSingleBitCmd = 0x87,
IanBenzMaxim 78:0cbbac7f2016 51 OwTripletCmd = 0x78,
IanBenzMaxim 78:0cbbac7f2016 52 OwTransmitBlockCmd = 0x69,
IanBenzMaxim 78:0cbbac7f2016 53 OwReceiveBlockCmd = 0xE1,
IanBenzMaxim 78:0cbbac7f2016 54 CopyScratchpadCmd = 0x5A,
IanBenzMaxim 78:0cbbac7f2016 55 ComputeSlaveSecretCmd = 0x4B,
IanBenzMaxim 78:0cbbac7f2016 56 ComputeSlaveAuthMacCmd = 0x3C,
IanBenzMaxim 78:0cbbac7f2016 57 ComputeSlaveWriteMacCmd = 0x2D,
IanBenzMaxim 78:0cbbac7f2016 58 ComputeNextMasterSecretCmd = 0x1E,
IanBenzMaxim 78:0cbbac7f2016 59 SetProtectionCmd = 0x0F
IanBenzMaxim 78:0cbbac7f2016 60 };
IanBenzMaxim 21:00c94aeb533e 61
IanBenzMaxim 78:0cbbac7f2016 62 /// DS2465 Status Bits
IanBenzMaxim 78:0cbbac7f2016 63 enum StatusBit
IanBenzMaxim 78:0cbbac7f2016 64 {
IanBenzMaxim 78:0cbbac7f2016 65 Status_1WB = 0x01,
IanBenzMaxim 78:0cbbac7f2016 66 Status_PPD = 0x02,
IanBenzMaxim 78:0cbbac7f2016 67 Status_SD = 0x04,
IanBenzMaxim 78:0cbbac7f2016 68 Status_LL = 0x08,
IanBenzMaxim 78:0cbbac7f2016 69 Status_RST = 0x10,
IanBenzMaxim 78:0cbbac7f2016 70 Status_SBR = 0x20,
IanBenzMaxim 78:0cbbac7f2016 71 Status_TSB = 0x40,
IanBenzMaxim 78:0cbbac7f2016 72 Status_DIR = 0x80
IanBenzMaxim 78:0cbbac7f2016 73 };
IanBenzMaxim 73:2cecc1372acc 74
IanBenzMaxim 122:955ac6c82533 75 static const int I2C_WRITE_OK = 1;
j3 141:cf38f48a2a49 76 static const uint8_t maxBlockSize = 63;
IanBenzMaxim 21:00c94aeb533e 77
IanBenzMaxim 73:2cecc1372acc 78 uint8_t DS2465::Config::readByte() const
IanBenzMaxim 24:8942d8478d68 79 {
IanBenzMaxim 74:23be10c32fa3 80 uint8_t config = 0;
IanBenzMaxim 74:23be10c32fa3 81 if (get1WS())
IanBenzMaxim 74:23be10c32fa3 82 {
IanBenzMaxim 74:23be10c32fa3 83 config |= 0x08;
IanBenzMaxim 74:23be10c32fa3 84 }
IanBenzMaxim 74:23be10c32fa3 85 if (getSPU())
IanBenzMaxim 74:23be10c32fa3 86 {
IanBenzMaxim 74:23be10c32fa3 87 config |= 0x04;
IanBenzMaxim 74:23be10c32fa3 88 }
IanBenzMaxim 74:23be10c32fa3 89 if (getPDN())
IanBenzMaxim 74:23be10c32fa3 90 {
IanBenzMaxim 74:23be10c32fa3 91 config |= 0x02;
IanBenzMaxim 74:23be10c32fa3 92 }
IanBenzMaxim 74:23be10c32fa3 93 if (getAPU())
IanBenzMaxim 74:23be10c32fa3 94 {
IanBenzMaxim 74:23be10c32fa3 95 config |= 0x01;
IanBenzMaxim 74:23be10c32fa3 96 }
IanBenzMaxim 74:23be10c32fa3 97 return config;
IanBenzMaxim 24:8942d8478d68 98 }
IanBenzMaxim 24:8942d8478d68 99
IanBenzMaxim 73:2cecc1372acc 100 uint8_t DS2465::Config::writeByte() const
IanBenzMaxim 24:8942d8478d68 101 {
IanBenzMaxim 74:23be10c32fa3 102 uint8_t config = readByte();
IanBenzMaxim 74:23be10c32fa3 103 return ((~config << 4) | config);
IanBenzMaxim 24:8942d8478d68 104 }
IanBenzMaxim 24:8942d8478d68 105
IanBenzMaxim 24:8942d8478d68 106 void DS2465::Config::reset()
IanBenzMaxim 24:8942d8478d68 107 {
IanBenzMaxim 74:23be10c32fa3 108 set1WS(false);
IanBenzMaxim 74:23be10c32fa3 109 setSPU(false);
IanBenzMaxim 74:23be10c32fa3 110 setPDN(false);
IanBenzMaxim 74:23be10c32fa3 111 setAPU(true);
IanBenzMaxim 24:8942d8478d68 112 }
IanBenzMaxim 24:8942d8478d68 113
IanBenzMaxim 73:2cecc1372acc 114 DS2465::DS2465(mbed::I2C & I2C_interface, uint8_t I2C_address)
IanBenzMaxim 74:23be10c32fa3 115 : m_I2C_interface(I2C_interface), m_I2C_address(I2C_address)
IanBenzMaxim 21:00c94aeb533e 116 {
IanBenzMaxim 74:23be10c32fa3 117
IanBenzMaxim 21:00c94aeb533e 118 }
IanBenzMaxim 21:00c94aeb533e 119
IanBenzMaxim 21:00c94aeb533e 120 OneWireMaster::CmdResult DS2465::OWInitMaster()
IanBenzMaxim 21:00c94aeb533e 121 {
IanBenzMaxim 74:23be10c32fa3 122 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 123
IanBenzMaxim 74:23be10c32fa3 124 // reset DS2465
IanBenzMaxim 74:23be10c32fa3 125 result = reset();
IanBenzMaxim 74:23be10c32fa3 126 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 127 {
IanBenzMaxim 74:23be10c32fa3 128 return result;
IanBenzMaxim 74:23be10c32fa3 129 }
IanBenzMaxim 74:23be10c32fa3 130
IanBenzMaxim 74:23be10c32fa3 131 // write the default configuration setup
IanBenzMaxim 74:23be10c32fa3 132 Config defaultConfig;
IanBenzMaxim 74:23be10c32fa3 133 result = writeConfig(defaultConfig, true);
IanBenzMaxim 47:307dc45952db 134 return result;
IanBenzMaxim 21:00c94aeb533e 135 }
IanBenzMaxim 21:00c94aeb533e 136
IanBenzMaxim 33:a4c015046956 137 OneWireMaster::CmdResult DS2465::computeNextMasterSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 138 {
IanBenzMaxim 78:0cbbac7f2016 139 uint8_t command[2] = { ComputeNextMasterSecretCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 140 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 141 }
IanBenzMaxim 21:00c94aeb533e 142
IanBenzMaxim 33:a4c015046956 143 OneWireMaster::CmdResult DS2465::computeWriteMac(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const
IanBenzMaxim 21:00c94aeb533e 144 {
IanBenzMaxim 78:0cbbac7f2016 145 uint8_t command[2] = { ComputeSlaveWriteMacCmd, (uint8_t)((regwrite << 7) | (swap << 6) | (pageNum << 4) | segmentNum) };
IanBenzMaxim 78:0cbbac7f2016 146 return cWriteMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 147 }
IanBenzMaxim 21:00c94aeb533e 148
IanBenzMaxim 33:a4c015046956 149 OneWireMaster::CmdResult DS2465::computeAuthMac(bool swap, unsigned int pageNum, PageRegion region) const
IanBenzMaxim 21:00c94aeb533e 150 {
IanBenzMaxim 78:0cbbac7f2016 151 uint8_t command[2] = { ComputeSlaveAuthMacCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 152 return cWriteMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 153 }
IanBenzMaxim 21:00c94aeb533e 154
IanBenzMaxim 33:a4c015046956 155 OneWireMaster::CmdResult DS2465::computeSlaveSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 156 {
IanBenzMaxim 78:0cbbac7f2016 157 uint8_t command[2] = { ComputeSlaveSecretCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 158 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 159 }
IanBenzMaxim 21:00c94aeb533e 160
IanBenzMaxim 73:2cecc1372acc 161 ISha256MacCoproc::CmdResult DS2465::setMasterSecret(const Secret & masterSecret)
IanBenzMaxim 21:00c94aeb533e 162 {
IanBenzMaxim 74:23be10c32fa3 163 OneWireMaster::CmdResult result;
j3 139:f0e0a7976846 164 result = writeMemory(Scratchpad, masterSecret.data(), masterSecret.size());
IanBenzMaxim 74:23be10c32fa3 165 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 166 {
IanBenzMaxim 74:23be10c32fa3 167 result = copyScratchpadToSecret();
IanBenzMaxim 74:23be10c32fa3 168 }
IanBenzMaxim 74:23be10c32fa3 169 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 170 {
IanBenzMaxim 74:23be10c32fa3 171 wait_ms(eepromPageWriteDelayMs);
IanBenzMaxim 74:23be10c32fa3 172 }
IanBenzMaxim 74:23be10c32fa3 173 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 174 }
IanBenzMaxim 21:00c94aeb533e 175
IanBenzMaxim 73:2cecc1372acc 176 ISha256MacCoproc::CmdResult DS2465::computeWriteMac(const WriteMacData & writeMacData, Mac & mac) const
IanBenzMaxim 21:00c94aeb533e 177 {
IanBenzMaxim 74:23be10c32fa3 178 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 179 // Write input data to scratchpad
j3 139:f0e0a7976846 180 result = writeScratchpad(writeMacData.data(), writeMacData.size());
IanBenzMaxim 74:23be10c32fa3 181 // Compute MAC
IanBenzMaxim 74:23be10c32fa3 182 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 183 {
IanBenzMaxim 74:23be10c32fa3 184 result = computeWriteMac(false);
IanBenzMaxim 74:23be10c32fa3 185 }
IanBenzMaxim 74:23be10c32fa3 186 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 187 {
IanBenzMaxim 74:23be10c32fa3 188 wait_ms(shaComputationDelayMs);
IanBenzMaxim 74:23be10c32fa3 189 // Read MAC from register
j3 139:f0e0a7976846 190 result = readMemory(MacReadoutReg, mac.data(), mac.size(), true);
IanBenzMaxim 74:23be10c32fa3 191 }
IanBenzMaxim 74:23be10c32fa3 192 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 193 }
IanBenzMaxim 21:00c94aeb533e 194
IanBenzMaxim 73:2cecc1372acc 195 ISha256MacCoproc::CmdResult DS2465::computeAuthMac(const DevicePage & devicePage, const DeviceScratchpad & challenge, const AuthMacData & authMacData, Mac & mac) const
IanBenzMaxim 21:00c94aeb533e 196 {
IanBenzMaxim 74:23be10c32fa3 197 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 198 int addr = Scratchpad;
IanBenzMaxim 74:23be10c32fa3 199 // Write input data to scratchpad
j3 139:f0e0a7976846 200 result = cWriteMemory(addr, devicePage.data(), devicePage.size());
IanBenzMaxim 74:23be10c32fa3 201 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 202 {
j3 139:f0e0a7976846 203 addr += devicePage.size();
j3 139:f0e0a7976846 204 result = cWriteMemory(addr, challenge.data(), challenge.size());
IanBenzMaxim 74:23be10c32fa3 205 }
IanBenzMaxim 74:23be10c32fa3 206 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 207 {
j3 139:f0e0a7976846 208 addr += challenge.size();
j3 139:f0e0a7976846 209 result = cWriteMemory(addr, authMacData.data(), authMacData.size());
IanBenzMaxim 74:23be10c32fa3 210 }
IanBenzMaxim 74:23be10c32fa3 211 // Compute MAC
IanBenzMaxim 74:23be10c32fa3 212 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 213 {
IanBenzMaxim 74:23be10c32fa3 214 result = computeAuthMac();
IanBenzMaxim 74:23be10c32fa3 215 }
IanBenzMaxim 74:23be10c32fa3 216 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 217 {
IanBenzMaxim 74:23be10c32fa3 218 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 74:23be10c32fa3 219 // Read MAC from register
j3 139:f0e0a7976846 220 result = readMemory(MacReadoutReg, mac.data(), mac.size(), true);
IanBenzMaxim 74:23be10c32fa3 221 }
IanBenzMaxim 74:23be10c32fa3 222 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 223 }
IanBenzMaxim 21:00c94aeb533e 224
IanBenzMaxim 73:2cecc1372acc 225 ISha256MacCoproc::CmdResult DS2465::computeSlaveSecret(const DevicePage & devicePage, const DeviceScratchpad & deviceScratchpad, const SlaveSecretData & slaveSecretData)
IanBenzMaxim 21:00c94aeb533e 226 {
IanBenzMaxim 74:23be10c32fa3 227 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 228 int addr = Scratchpad;
IanBenzMaxim 74:23be10c32fa3 229 // Write input data to scratchpad
j3 139:f0e0a7976846 230 result = writeMemory(addr, devicePage.data(), devicePage.size());
IanBenzMaxim 74:23be10c32fa3 231 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 232 {
j3 139:f0e0a7976846 233 addr += devicePage.size();
j3 139:f0e0a7976846 234 result = writeMemory(addr, deviceScratchpad.data(), deviceScratchpad.size());
IanBenzMaxim 74:23be10c32fa3 235 }
IanBenzMaxim 74:23be10c32fa3 236 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 237 {
j3 139:f0e0a7976846 238 addr += deviceScratchpad.size();
j3 139:f0e0a7976846 239 result = writeMemory(addr, slaveSecretData.data(), slaveSecretData.size());
IanBenzMaxim 74:23be10c32fa3 240 }
IanBenzMaxim 74:23be10c32fa3 241 // Compute secret
IanBenzMaxim 74:23be10c32fa3 242 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 243 {
IanBenzMaxim 74:23be10c32fa3 244 result = computeSlaveSecret();
IanBenzMaxim 74:23be10c32fa3 245 }
IanBenzMaxim 74:23be10c32fa3 246 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 247 {
IanBenzMaxim 74:23be10c32fa3 248 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 74:23be10c32fa3 249 }
IanBenzMaxim 74:23be10c32fa3 250 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 251 }
IanBenzMaxim 21:00c94aeb533e 252
IanBenzMaxim 74:23be10c32fa3 253 OneWireMaster::CmdResult DS2465::copyScratchpad(bool destSecret, unsigned int pageNum, bool notFull, unsigned int segmentNum)
IanBenzMaxim 21:00c94aeb533e 254 {
IanBenzMaxim 78:0cbbac7f2016 255 uint8_t command[2] = { CopyScratchpadCmd, (uint8_t)(destSecret ? 0 : (0x80 | (pageNum << 4) | (notFull << 3) | segmentNum)) };
IanBenzMaxim 78:0cbbac7f2016 256 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 257 }
IanBenzMaxim 21:00c94aeb533e 258
IanBenzMaxim 34:11fffbe98ef9 259 OneWireMaster::CmdResult DS2465::configureLevel(OWLevel level)
IanBenzMaxim 26:a361e3f42ba5 260 {
IanBenzMaxim 74:23be10c32fa3 261 OneWireMaster::CmdResult result;
IanBenzMaxim 75:8b627804927c 262 if (m_curConfig.getSPU() != (level == StrongLevel))
IanBenzMaxim 74:23be10c32fa3 263 {
IanBenzMaxim 74:23be10c32fa3 264 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 265 newConfig.setSPU(level == StrongLevel);
IanBenzMaxim 74:23be10c32fa3 266 result = writeConfig(newConfig, true);
IanBenzMaxim 74:23be10c32fa3 267 }
IanBenzMaxim 74:23be10c32fa3 268 else
IanBenzMaxim 74:23be10c32fa3 269 {
IanBenzMaxim 74:23be10c32fa3 270 result = OneWireMaster::Success;
IanBenzMaxim 74:23be10c32fa3 271 }
IanBenzMaxim 74:23be10c32fa3 272 return result;
IanBenzMaxim 21:00c94aeb533e 273 }
IanBenzMaxim 21:00c94aeb533e 274
IanBenzMaxim 75:8b627804927c 275 OneWireMaster::CmdResult DS2465::OWSetLevel(OWLevel newLevel)
IanBenzMaxim 21:00c94aeb533e 276 {
IanBenzMaxim 75:8b627804927c 277 if (newLevel == StrongLevel)
IanBenzMaxim 74:23be10c32fa3 278 {
IanBenzMaxim 74:23be10c32fa3 279 return OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 280 }
IanBenzMaxim 74:23be10c32fa3 281
IanBenzMaxim 75:8b627804927c 282 return configureLevel(newLevel);
IanBenzMaxim 21:00c94aeb533e 283 }
IanBenzMaxim 21:00c94aeb533e 284
IanBenzMaxim 75:8b627804927c 285 OneWireMaster::CmdResult DS2465::OWSetSpeed(OWSpeed newSpeed)
IanBenzMaxim 21:00c94aeb533e 286 {
IanBenzMaxim 74:23be10c32fa3 287 // Requested speed is already set
IanBenzMaxim 75:8b627804927c 288 if (m_curConfig.get1WS() == (newSpeed == OverdriveSpeed))
IanBenzMaxim 74:23be10c32fa3 289 {
IanBenzMaxim 74:23be10c32fa3 290 return OneWireMaster::Success;
IanBenzMaxim 74:23be10c32fa3 291 }
IanBenzMaxim 21:00c94aeb533e 292
IanBenzMaxim 74:23be10c32fa3 293 // set the speed
IanBenzMaxim 74:23be10c32fa3 294 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 295 newConfig.set1WS(newSpeed == OverdriveSpeed);
IanBenzMaxim 74:23be10c32fa3 296
IanBenzMaxim 74:23be10c32fa3 297 // write the new config
IanBenzMaxim 74:23be10c32fa3 298 return writeConfig(newConfig, true);
IanBenzMaxim 21:00c94aeb533e 299 }
IanBenzMaxim 21:00c94aeb533e 300
IanBenzMaxim 75:8b627804927c 301 OneWireMaster::CmdResult DS2465::OWTriplet(SearchDirection & searchDirection, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 21:00c94aeb533e 302 {
IanBenzMaxim 74:23be10c32fa3 303 // 1-Wire Triplet (Case B)
IanBenzMaxim 74:23be10c32fa3 304 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 305 // \--------/
IanBenzMaxim 74:23be10c32fa3 306 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 307 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 308 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 74:23be10c32fa3 309
IanBenzMaxim 74:23be10c32fa3 310 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 311 uint8_t command[2] = { OwTripletCmd, (uint8_t)((searchDirection == WriteOne) ? 0x80 : 0x00) };
IanBenzMaxim 78:0cbbac7f2016 312 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 32:bce180b544ed 313 if (result == OneWireMaster::Success)
IanBenzMaxim 32:bce180b544ed 314 {
IanBenzMaxim 74:23be10c32fa3 315 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 316 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 317 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 318 {
IanBenzMaxim 74:23be10c32fa3 319 // check bit results in status byte
IanBenzMaxim 78:0cbbac7f2016 320 sbr = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 78:0cbbac7f2016 321 tsb = ((status & Status_TSB) == Status_TSB);
IanBenzMaxim 78:0cbbac7f2016 322 searchDirection = ((status & Status_DIR) == Status_DIR) ? WriteOne : WriteZero;
IanBenzMaxim 74:23be10c32fa3 323 }
IanBenzMaxim 32:bce180b544ed 324 }
IanBenzMaxim 74:23be10c32fa3 325 return result;
IanBenzMaxim 21:00c94aeb533e 326 }
IanBenzMaxim 21:00c94aeb533e 327
j3 141:cf38f48a2a49 328 OneWireMaster::CmdResult DS2465::OWReadBlock(uint8_t *recvBuf, size_t recvLen)
IanBenzMaxim 21:00c94aeb533e 329 {
IanBenzMaxim 74:23be10c32fa3 330 // 1-Wire Receive Block (Case A)
IanBenzMaxim 78:0cbbac7f2016 331 // S AD,0 [A] CommandReg [A] 1WRF [A] PR [A] P
IanBenzMaxim 74:23be10c32fa3 332 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 333 // PR indicates byte containing parameter
IanBenzMaxim 74:23be10c32fa3 334
j3 141:cf38f48a2a49 335 OneWireMaster::CmdResult result = OneWireMaster::Success;
j3 141:cf38f48a2a49 336 for (size_t i = 0; (i < recvLen) && (result == OneWireMaster::Success); i += maxBlockSize)
IanBenzMaxim 74:23be10c32fa3 337 {
j3 141:cf38f48a2a49 338 uint8_t command[2] = { OwReceiveBlockCmd, std::min(static_cast<uint8_t>(recvLen - i), maxBlockSize) };
j3 141:cf38f48a2a49 339 result = writeMemory(CommandReg, command, 2);
j3 141:cf38f48a2a49 340 if (result == OneWireMaster::Success)
j3 141:cf38f48a2a49 341 {
j3 141:cf38f48a2a49 342 result = pollBusy();
j3 141:cf38f48a2a49 343 }
j3 141:cf38f48a2a49 344 if (result == OneWireMaster::Success)
j3 141:cf38f48a2a49 345 {
j3 141:cf38f48a2a49 346 result = readMemory(Scratchpad, recvBuf + i, command[1], false);
j3 141:cf38f48a2a49 347 }
IanBenzMaxim 74:23be10c32fa3 348 }
IanBenzMaxim 74:23be10c32fa3 349 return result;
IanBenzMaxim 21:00c94aeb533e 350 }
IanBenzMaxim 21:00c94aeb533e 351
j3 141:cf38f48a2a49 352 OneWireMaster::CmdResult DS2465::OWWriteBlock(const uint8_t *sendBuf, size_t sendLen)
IanBenzMaxim 21:00c94aeb533e 353 {
j3 141:cf38f48a2a49 354 OneWireMaster::CmdResult result = OneWireMaster::Success;
j3 141:cf38f48a2a49 355 for (size_t i = 0; (i < sendLen) && (result == OneWireMaster::Success); i += maxBlockSize)
j3 141:cf38f48a2a49 356 {
j3 141:cf38f48a2a49 357 uint8_t command[2] = { OwTransmitBlockCmd, std::min(static_cast<uint8_t>(sendLen - i), maxBlockSize) };
j3 141:cf38f48a2a49 358
j3 141:cf38f48a2a49 359 // prefill scratchpad with required data
j3 141:cf38f48a2a49 360 result = writeMemory(Scratchpad, sendBuf + i, command[1]);
j3 141:cf38f48a2a49 361
j3 141:cf38f48a2a49 362 // 1-Wire Transmit Block (Case A)
j3 141:cf38f48a2a49 363 // S AD,0 [A] CommandReg [A] 1WTB [A] PR [A] P
j3 141:cf38f48a2a49 364 // [] indicates from slave
j3 141:cf38f48a2a49 365 // PR indicates byte containing parameter
j3 141:cf38f48a2a49 366 if (result == OneWireMaster::Success)
j3 141:cf38f48a2a49 367 {
j3 141:cf38f48a2a49 368 result = writeMemory(CommandReg, command, 2);
j3 141:cf38f48a2a49 369 }
j3 141:cf38f48a2a49 370 if (result == OneWireMaster::Success)
j3 141:cf38f48a2a49 371 {
j3 141:cf38f48a2a49 372 result = pollBusy();
j3 141:cf38f48a2a49 373 }
j3 141:cf38f48a2a49 374 }
j3 141:cf38f48a2a49 375 return result;
IanBenzMaxim 21:00c94aeb533e 376 }
IanBenzMaxim 21:00c94aeb533e 377
IanBenzMaxim 47:307dc45952db 378 OneWireMaster::CmdResult DS2465::OWWriteBlockMac()
IanBenzMaxim 47:307dc45952db 379 {
IanBenzMaxim 74:23be10c32fa3 380 // 1-Wire Transmit Block (Case A)
IanBenzMaxim 78:0cbbac7f2016 381 // S AD,0 [A] CommandReg [A] 1WTB [A] PR [A] P
IanBenzMaxim 74:23be10c32fa3 382 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 383 // PR indicates byte containing parameter
IanBenzMaxim 74:23be10c32fa3 384
j3 141:cf38f48a2a49 385 uint8_t command[2] = { OwTransmitBlockCmd, 0xFF };
j3 141:cf38f48a2a49 386 OneWireMaster::CmdResult result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 387 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 388 {
IanBenzMaxim 74:23be10c32fa3 389 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 390 }
IanBenzMaxim 74:23be10c32fa3 391 return result;
IanBenzMaxim 21:00c94aeb533e 392 }
IanBenzMaxim 21:00c94aeb533e 393
IanBenzMaxim 75:8b627804927c 394 OneWireMaster::CmdResult DS2465::OWReadByteSetLevel(uint8_t & recvByte, OWLevel afterLevel)
IanBenzMaxim 21:00c94aeb533e 395 {
IanBenzMaxim 74:23be10c32fa3 396 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 78:0cbbac7f2016 397 // S AD,0 [A] CommandReg [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A
IanBenzMaxim 74:23be10c32fa3 398 // \--------/
IanBenzMaxim 74:23be10c32fa3 399 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 400 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 74:23be10c32fa3 401 //
IanBenzMaxim 74:23be10c32fa3 402 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 403 // DD data read
IanBenzMaxim 74:23be10c32fa3 404
IanBenzMaxim 74:23be10c32fa3 405 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 406 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 407
IanBenzMaxim 75:8b627804927c 408 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 409 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 410 {
IanBenzMaxim 74:23be10c32fa3 411 return result;
IanBenzMaxim 74:23be10c32fa3 412 }
IanBenzMaxim 74:23be10c32fa3 413
IanBenzMaxim 78:0cbbac7f2016 414 buf = OwReadByteCmd;
IanBenzMaxim 78:0cbbac7f2016 415 result = writeMemory(CommandReg, &buf, 1);
IanBenzMaxim 74:23be10c32fa3 416
IanBenzMaxim 74:23be10c32fa3 417 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 418 {
IanBenzMaxim 74:23be10c32fa3 419 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 420 }
IanBenzMaxim 74:23be10c32fa3 421
IanBenzMaxim 74:23be10c32fa3 422 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 423 {
IanBenzMaxim 78:0cbbac7f2016 424 result = readMemory(ReadDataReg, &buf, 1);
IanBenzMaxim 74:23be10c32fa3 425 }
IanBenzMaxim 74:23be10c32fa3 426
IanBenzMaxim 74:23be10c32fa3 427 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 428 {
IanBenzMaxim 75:8b627804927c 429 recvByte = buf;
IanBenzMaxim 74:23be10c32fa3 430 }
IanBenzMaxim 74:23be10c32fa3 431
IanBenzMaxim 26:a361e3f42ba5 432 return result;
IanBenzMaxim 21:00c94aeb533e 433 }
IanBenzMaxim 21:00c94aeb533e 434
IanBenzMaxim 75:8b627804927c 435 OneWireMaster::CmdResult DS2465::OWWriteByteSetLevel(uint8_t sendByte, OWLevel afterLevel)
IanBenzMaxim 74:23be10c32fa3 436 {
IanBenzMaxim 74:23be10c32fa3 437 // 1-Wire Write Byte (Case B)
IanBenzMaxim 78:0cbbac7f2016 438 // S AD,0 [A] CommandReg [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 439 // \--------/
IanBenzMaxim 74:23be10c32fa3 440 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 441 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 442 // DD data to write
IanBenzMaxim 74:23be10c32fa3 443
IanBenzMaxim 74:23be10c32fa3 444 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 445
IanBenzMaxim 75:8b627804927c 446 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 447 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 448 {
IanBenzMaxim 74:23be10c32fa3 449 return result;
IanBenzMaxim 74:23be10c32fa3 450 }
IanBenzMaxim 74:23be10c32fa3 451
IanBenzMaxim 78:0cbbac7f2016 452 uint8_t command[2] = { OwWriteByteCmd, sendByte };
IanBenzMaxim 74:23be10c32fa3 453
IanBenzMaxim 78:0cbbac7f2016 454 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 455 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 456 {
IanBenzMaxim 74:23be10c32fa3 457 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 458 }
IanBenzMaxim 74:23be10c32fa3 459
IanBenzMaxim 26:a361e3f42ba5 460 return result;
IanBenzMaxim 21:00c94aeb533e 461 }
IanBenzMaxim 21:00c94aeb533e 462
IanBenzMaxim 75:8b627804927c 463 OneWireMaster::CmdResult DS2465::OWTouchBitSetLevel(uint8_t & sendRecvBit, OWLevel afterLevel)
IanBenzMaxim 21:00c94aeb533e 464 {
IanBenzMaxim 74:23be10c32fa3 465 // 1-Wire bit (Case B)
IanBenzMaxim 78:0cbbac7f2016 466 // S AD,0 [A] CommandReg [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 467 // \--------/
IanBenzMaxim 74:23be10c32fa3 468 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 469 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 470 // BB indicates byte containing bit value in msbit
IanBenzMaxim 74:23be10c32fa3 471
IanBenzMaxim 74:23be10c32fa3 472 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 473
IanBenzMaxim 75:8b627804927c 474 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 475 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 476 {
IanBenzMaxim 74:23be10c32fa3 477 return result;
IanBenzMaxim 74:23be10c32fa3 478 }
IanBenzMaxim 21:00c94aeb533e 479
IanBenzMaxim 78:0cbbac7f2016 480 uint8_t command[2] = { OwSingleBitCmd, (uint8_t)(sendRecvBit ? 0x80 : 0x00) };
IanBenzMaxim 74:23be10c32fa3 481 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 482
IanBenzMaxim 78:0cbbac7f2016 483 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 484
IanBenzMaxim 74:23be10c32fa3 485 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 486 {
IanBenzMaxim 74:23be10c32fa3 487 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 488 }
IanBenzMaxim 74:23be10c32fa3 489
IanBenzMaxim 74:23be10c32fa3 490 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 491 {
IanBenzMaxim 78:0cbbac7f2016 492 sendRecvBit = (status & Status_SBR);
IanBenzMaxim 74:23be10c32fa3 493 }
IanBenzMaxim 74:23be10c32fa3 494
IanBenzMaxim 26:a361e3f42ba5 495 return result;
IanBenzMaxim 21:00c94aeb533e 496 }
IanBenzMaxim 21:00c94aeb533e 497
IanBenzMaxim 73:2cecc1372acc 498 OneWireMaster::CmdResult DS2465::cWriteMemory(uint8_t addr, const uint8_t * buf, size_t bufLen) const
IanBenzMaxim 21:00c94aeb533e 499 {
IanBenzMaxim 74:23be10c32fa3 500 // Write SRAM (Case A)
IanBenzMaxim 74:23be10c32fa3 501 // S AD,0 [A] VSA [A] DD [A] P
IanBenzMaxim 74:23be10c32fa3 502 // \-----/
IanBenzMaxim 74:23be10c32fa3 503 // Repeat for each data byte
IanBenzMaxim 74:23be10c32fa3 504 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 505 // VSA valid SRAM memory address
IanBenzMaxim 74:23be10c32fa3 506 // DD memory data to write
IanBenzMaxim 74:23be10c32fa3 507
IanBenzMaxim 74:23be10c32fa3 508 m_I2C_interface.start();
IanBenzMaxim 74:23be10c32fa3 509 if (m_I2C_interface.write((m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 510 {
IanBenzMaxim 21:00c94aeb533e 511 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 512 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 513 }
IanBenzMaxim 74:23be10c32fa3 514 if (m_I2C_interface.write(addr) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 515 {
IanBenzMaxim 74:23be10c32fa3 516 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 517 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 518 }
IanBenzMaxim 74:23be10c32fa3 519 // loop to write each byte
IanBenzMaxim 120:200109b73e3c 520 for (size_t i = 0; i < bufLen; i++)
IanBenzMaxim 74:23be10c32fa3 521 {
IanBenzMaxim 74:23be10c32fa3 522 if (m_I2C_interface.write(buf[i]) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 523 {
IanBenzMaxim 74:23be10c32fa3 524 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 525 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 526 }
IanBenzMaxim 74:23be10c32fa3 527 }
IanBenzMaxim 74:23be10c32fa3 528 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 529
IanBenzMaxim 74:23be10c32fa3 530 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 531 }
IanBenzMaxim 21:00c94aeb533e 532
IanBenzMaxim 73:2cecc1372acc 533 OneWireMaster::CmdResult DS2465::readMemory(uint8_t addr, uint8_t * buf, size_t bufLen, bool skipSetPointer) const
IanBenzMaxim 21:00c94aeb533e 534 {
IanBenzMaxim 74:23be10c32fa3 535 // Read (Case A)
IanBenzMaxim 74:23be10c32fa3 536 // S AD,0 [A] MA [A] Sr AD,1 [A] [DD] A [DD] A\ P
IanBenzMaxim 74:23be10c32fa3 537 // \-----/
IanBenzMaxim 74:23be10c32fa3 538 // Repeat for each data byte, NAK last byte
IanBenzMaxim 74:23be10c32fa3 539 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 540 // MA memory address
IanBenzMaxim 74:23be10c32fa3 541 // DD memory data read
IanBenzMaxim 21:00c94aeb533e 542
IanBenzMaxim 74:23be10c32fa3 543 m_I2C_interface.start();
IanBenzMaxim 74:23be10c32fa3 544 if (!skipSetPointer)
IanBenzMaxim 74:23be10c32fa3 545 {
IanBenzMaxim 74:23be10c32fa3 546 if (m_I2C_interface.write((m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 547 {
IanBenzMaxim 74:23be10c32fa3 548 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 549 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 550 }
IanBenzMaxim 74:23be10c32fa3 551 if (m_I2C_interface.write(addr) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 552 {
IanBenzMaxim 74:23be10c32fa3 553 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 554 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 555 }
IanBenzMaxim 74:23be10c32fa3 556 m_I2C_interface.start();
IanBenzMaxim 74:23be10c32fa3 557 }
IanBenzMaxim 21:00c94aeb533e 558
IanBenzMaxim 74:23be10c32fa3 559 if (m_I2C_interface.write((m_I2C_address | I2C_READ)) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 560 {
IanBenzMaxim 47:307dc45952db 561 m_I2C_interface.stop();
IanBenzMaxim 47:307dc45952db 562 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 563 }
IanBenzMaxim 74:23be10c32fa3 564 // loop to read each byte, NAK last byte
IanBenzMaxim 120:200109b73e3c 565 for (size_t i = 0; i < bufLen; i++)
IanBenzMaxim 74:23be10c32fa3 566 {
IanBenzMaxim 74:23be10c32fa3 567 buf[i] = m_I2C_interface.read((i == (bufLen - 1)) ? mbed::I2C::NoACK : mbed::I2C::ACK);
IanBenzMaxim 74:23be10c32fa3 568 }
IanBenzMaxim 74:23be10c32fa3 569 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 570
IanBenzMaxim 74:23be10c32fa3 571 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 572 }
IanBenzMaxim 21:00c94aeb533e 573
IanBenzMaxim 34:11fffbe98ef9 574 OneWireMaster::CmdResult DS2465::writeConfig(const Config & config, bool verify)
IanBenzMaxim 21:00c94aeb533e 575 {
IanBenzMaxim 74:23be10c32fa3 576 uint8_t configBuf;
IanBenzMaxim 74:23be10c32fa3 577 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 578
IanBenzMaxim 74:23be10c32fa3 579 configBuf = config.writeByte();
IanBenzMaxim 78:0cbbac7f2016 580 result = writeMemory(ConfigReg, &configBuf, 1);
IanBenzMaxim 74:23be10c32fa3 581 if (verify)
IanBenzMaxim 74:23be10c32fa3 582 {
IanBenzMaxim 74:23be10c32fa3 583 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 584 {
IanBenzMaxim 78:0cbbac7f2016 585 result = readMemory(ConfigReg, &configBuf, 1);
IanBenzMaxim 74:23be10c32fa3 586 }
IanBenzMaxim 74:23be10c32fa3 587 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 588 {
IanBenzMaxim 74:23be10c32fa3 589 if (configBuf != config.readByte())
IanBenzMaxim 74:23be10c32fa3 590 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 591 }
IanBenzMaxim 74:23be10c32fa3 592 }
IanBenzMaxim 74:23be10c32fa3 593
IanBenzMaxim 35:5d23395628f6 594 if (result == OneWireMaster::Success)
IanBenzMaxim 35:5d23395628f6 595 {
IanBenzMaxim 74:23be10c32fa3 596 m_curConfig = config;
IanBenzMaxim 35:5d23395628f6 597 }
IanBenzMaxim 35:5d23395628f6 598
IanBenzMaxim 74:23be10c32fa3 599 return result;
IanBenzMaxim 24:8942d8478d68 600 }
IanBenzMaxim 24:8942d8478d68 601
IanBenzMaxim 73:2cecc1372acc 602 OneWireMaster::CmdResult DS2465::pollBusy(uint8_t * pStatus)
IanBenzMaxim 24:8942d8478d68 603 {
IanBenzMaxim 74:23be10c32fa3 604 const unsigned int pollLimit = 200;
IanBenzMaxim 74:23be10c32fa3 605
IanBenzMaxim 74:23be10c32fa3 606 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 607 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 608 unsigned int pollCount = 0;
IanBenzMaxim 47:307dc45952db 609
IanBenzMaxim 74:23be10c32fa3 610 do
IanBenzMaxim 74:23be10c32fa3 611 {
IanBenzMaxim 78:0cbbac7f2016 612 result = readMemory(StatusReg, &status, 1, true);
IanBenzMaxim 74:23be10c32fa3 613 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 614 {
IanBenzMaxim 74:23be10c32fa3 615 return result;
IanBenzMaxim 74:23be10c32fa3 616 }
IanBenzMaxim 74:23be10c32fa3 617 if (pStatus != NULL)
IanBenzMaxim 74:23be10c32fa3 618 {
IanBenzMaxim 74:23be10c32fa3 619 *pStatus = status;
IanBenzMaxim 74:23be10c32fa3 620 }
IanBenzMaxim 74:23be10c32fa3 621 if (pollCount++ >= pollLimit)
IanBenzMaxim 74:23be10c32fa3 622 {
IanBenzMaxim 74:23be10c32fa3 623 return OneWireMaster::TimeoutError;
IanBenzMaxim 74:23be10c32fa3 624 }
IanBenzMaxim 78:0cbbac7f2016 625 } while (status & Status_1WB);
IanBenzMaxim 24:8942d8478d68 626
IanBenzMaxim 74:23be10c32fa3 627 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 628 }
IanBenzMaxim 21:00c94aeb533e 629
IanBenzMaxim 75:8b627804927c 630 OneWireMaster::CmdResult DS2465::OWReset()
IanBenzMaxim 74:23be10c32fa3 631 {
IanBenzMaxim 74:23be10c32fa3 632 // 1-Wire reset (Case B)
IanBenzMaxim 78:0cbbac7f2016 633 // S AD,0 [A] CommandReg [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 634 // \--------/
IanBenzMaxim 74:23be10c32fa3 635 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 636 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 637
IanBenzMaxim 74:23be10c32fa3 638 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 639 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 640
IanBenzMaxim 78:0cbbac7f2016 641 buf = OwResetCmd;
IanBenzMaxim 78:0cbbac7f2016 642 result = writeMemory(CommandReg, &buf, 1);
IanBenzMaxim 21:00c94aeb533e 643
IanBenzMaxim 74:23be10c32fa3 644 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 645 {
IanBenzMaxim 74:23be10c32fa3 646 result = pollBusy(&buf);
IanBenzMaxim 74:23be10c32fa3 647 }
IanBenzMaxim 21:00c94aeb533e 648
IanBenzMaxim 74:23be10c32fa3 649 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 650 {
IanBenzMaxim 74:23be10c32fa3 651 // check for presence detect
IanBenzMaxim 78:0cbbac7f2016 652 if ((buf & Status_PPD) != Status_PPD)
IanBenzMaxim 74:23be10c32fa3 653 {
IanBenzMaxim 74:23be10c32fa3 654 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 655 }
IanBenzMaxim 74:23be10c32fa3 656 }
IanBenzMaxim 74:23be10c32fa3 657
IanBenzMaxim 74:23be10c32fa3 658 return result;
IanBenzMaxim 21:00c94aeb533e 659 }
IanBenzMaxim 21:00c94aeb533e 660
IanBenzMaxim 75:8b627804927c 661 OneWireMaster::CmdResult DS2465::reset()
IanBenzMaxim 74:23be10c32fa3 662 {
IanBenzMaxim 74:23be10c32fa3 663 // Device Reset
IanBenzMaxim 78:0cbbac7f2016 664 // S AD,0 [A] CommandReg [A] 1WMR [A] Sr AD,1 [A] [SS] A\ P
IanBenzMaxim 74:23be10c32fa3 665 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 666 // SS status byte to read to verify state
IanBenzMaxim 74:23be10c32fa3 667
IanBenzMaxim 74:23be10c32fa3 668 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 669 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 670
IanBenzMaxim 78:0cbbac7f2016 671 buf = DeviceResetCmd;
IanBenzMaxim 78:0cbbac7f2016 672 result = writeMemory(CommandReg, &buf, 1);
IanBenzMaxim 24:8942d8478d68 673
IanBenzMaxim 74:23be10c32fa3 674 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 675 {
IanBenzMaxim 78:0cbbac7f2016 676 result = readMemory(StatusReg, &buf, 1, true);
IanBenzMaxim 74:23be10c32fa3 677 }
IanBenzMaxim 21:00c94aeb533e 678
IanBenzMaxim 74:23be10c32fa3 679 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 680 {
IanBenzMaxim 74:23be10c32fa3 681 if ((buf & 0xF7) != 0x10)
IanBenzMaxim 74:23be10c32fa3 682 {
IanBenzMaxim 74:23be10c32fa3 683 result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 684 }
IanBenzMaxim 74:23be10c32fa3 685 }
IanBenzMaxim 74:23be10c32fa3 686
IanBenzMaxim 74:23be10c32fa3 687 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 688 {
IanBenzMaxim 74:23be10c32fa3 689 OWReset(); // do a command to get 1-Wire master reset out of holding state
IanBenzMaxim 74:23be10c32fa3 690 }
IanBenzMaxim 74:23be10c32fa3 691
IanBenzMaxim 74:23be10c32fa3 692 return result;
IanBenzMaxim 21:00c94aeb533e 693 }