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

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
IanBenzMaxim
Date:
Mon May 16 15:18:09 2016 -0500
Revision:
78:0cbbac7f2016
Parent:
76:84e6c4994e29
Child:
79:7f22823a5a2d
Code cleanup.

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
IanBenzMaxim 73:2cecc1372acc 33 #include "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 21:00c94aeb533e 75 static const int I2C_WRITE_OK = 0;
IanBenzMaxim 21:00c94aeb533e 76
IanBenzMaxim 73:2cecc1372acc 77 uint8_t DS2465::Config::readByte() const
IanBenzMaxim 24:8942d8478d68 78 {
IanBenzMaxim 74:23be10c32fa3 79 uint8_t config = 0;
IanBenzMaxim 74:23be10c32fa3 80 if (get1WS())
IanBenzMaxim 74:23be10c32fa3 81 {
IanBenzMaxim 74:23be10c32fa3 82 config |= 0x08;
IanBenzMaxim 74:23be10c32fa3 83 }
IanBenzMaxim 74:23be10c32fa3 84 if (getSPU())
IanBenzMaxim 74:23be10c32fa3 85 {
IanBenzMaxim 74:23be10c32fa3 86 config |= 0x04;
IanBenzMaxim 74:23be10c32fa3 87 }
IanBenzMaxim 74:23be10c32fa3 88 if (getPDN())
IanBenzMaxim 74:23be10c32fa3 89 {
IanBenzMaxim 74:23be10c32fa3 90 config |= 0x02;
IanBenzMaxim 74:23be10c32fa3 91 }
IanBenzMaxim 74:23be10c32fa3 92 if (getAPU())
IanBenzMaxim 74:23be10c32fa3 93 {
IanBenzMaxim 74:23be10c32fa3 94 config |= 0x01;
IanBenzMaxim 74:23be10c32fa3 95 }
IanBenzMaxim 74:23be10c32fa3 96 return config;
IanBenzMaxim 24:8942d8478d68 97 }
IanBenzMaxim 24:8942d8478d68 98
IanBenzMaxim 73:2cecc1372acc 99 uint8_t DS2465::Config::writeByte() const
IanBenzMaxim 24:8942d8478d68 100 {
IanBenzMaxim 74:23be10c32fa3 101 uint8_t config = readByte();
IanBenzMaxim 74:23be10c32fa3 102 return ((~config << 4) | config);
IanBenzMaxim 24:8942d8478d68 103 }
IanBenzMaxim 24:8942d8478d68 104
IanBenzMaxim 24:8942d8478d68 105 void DS2465::Config::reset()
IanBenzMaxim 24:8942d8478d68 106 {
IanBenzMaxim 74:23be10c32fa3 107 set1WS(false);
IanBenzMaxim 74:23be10c32fa3 108 setSPU(false);
IanBenzMaxim 74:23be10c32fa3 109 setPDN(false);
IanBenzMaxim 74:23be10c32fa3 110 setAPU(true);
IanBenzMaxim 24:8942d8478d68 111 }
IanBenzMaxim 24:8942d8478d68 112
IanBenzMaxim 73:2cecc1372acc 113 DS2465::DS2465(mbed::I2C & I2C_interface, uint8_t I2C_address)
IanBenzMaxim 74:23be10c32fa3 114 : m_I2C_interface(I2C_interface), m_I2C_address(I2C_address)
IanBenzMaxim 21:00c94aeb533e 115 {
IanBenzMaxim 74:23be10c32fa3 116
IanBenzMaxim 21:00c94aeb533e 117 }
IanBenzMaxim 21:00c94aeb533e 118
IanBenzMaxim 21:00c94aeb533e 119 OneWireMaster::CmdResult DS2465::OWInitMaster()
IanBenzMaxim 21:00c94aeb533e 120 {
IanBenzMaxim 74:23be10c32fa3 121 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 122
IanBenzMaxim 74:23be10c32fa3 123 // reset DS2465
IanBenzMaxim 74:23be10c32fa3 124 result = reset();
IanBenzMaxim 74:23be10c32fa3 125 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 126 {
IanBenzMaxim 74:23be10c32fa3 127 return result;
IanBenzMaxim 74:23be10c32fa3 128 }
IanBenzMaxim 74:23be10c32fa3 129
IanBenzMaxim 74:23be10c32fa3 130 // write the default configuration setup
IanBenzMaxim 74:23be10c32fa3 131 Config defaultConfig;
IanBenzMaxim 74:23be10c32fa3 132 result = writeConfig(defaultConfig, true);
IanBenzMaxim 47:307dc45952db 133 return result;
IanBenzMaxim 21:00c94aeb533e 134 }
IanBenzMaxim 21:00c94aeb533e 135
IanBenzMaxim 33:a4c015046956 136 OneWireMaster::CmdResult DS2465::computeNextMasterSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 137 {
IanBenzMaxim 78:0cbbac7f2016 138 uint8_t command[2] = { ComputeNextMasterSecretCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 139 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 140 }
IanBenzMaxim 21:00c94aeb533e 141
IanBenzMaxim 33:a4c015046956 142 OneWireMaster::CmdResult DS2465::computeWriteMac(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const
IanBenzMaxim 21:00c94aeb533e 143 {
IanBenzMaxim 78:0cbbac7f2016 144 uint8_t command[2] = { ComputeSlaveWriteMacCmd, (uint8_t)((regwrite << 7) | (swap << 6) | (pageNum << 4) | segmentNum) };
IanBenzMaxim 78:0cbbac7f2016 145 return cWriteMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 146 }
IanBenzMaxim 21:00c94aeb533e 147
IanBenzMaxim 33:a4c015046956 148 OneWireMaster::CmdResult DS2465::computeAuthMac(bool swap, unsigned int pageNum, PageRegion region) const
IanBenzMaxim 21:00c94aeb533e 149 {
IanBenzMaxim 78:0cbbac7f2016 150 uint8_t command[2] = { ComputeSlaveAuthMacCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 151 return cWriteMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 152 }
IanBenzMaxim 21:00c94aeb533e 153
IanBenzMaxim 33:a4c015046956 154 OneWireMaster::CmdResult DS2465::computeSlaveSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 155 {
IanBenzMaxim 78:0cbbac7f2016 156 uint8_t command[2] = { ComputeSlaveSecretCmd, (uint8_t)(swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 78:0cbbac7f2016 157 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 158 }
IanBenzMaxim 21:00c94aeb533e 159
IanBenzMaxim 73:2cecc1372acc 160 ISha256MacCoproc::CmdResult DS2465::setMasterSecret(const Secret & masterSecret)
IanBenzMaxim 21:00c94aeb533e 161 {
IanBenzMaxim 74:23be10c32fa3 162 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 163 result = writeMemory(Scratchpad, masterSecret, masterSecret.length);
IanBenzMaxim 74:23be10c32fa3 164 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 165 {
IanBenzMaxim 74:23be10c32fa3 166 result = copyScratchpadToSecret();
IanBenzMaxim 74:23be10c32fa3 167 }
IanBenzMaxim 74:23be10c32fa3 168 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 169 {
IanBenzMaxim 74:23be10c32fa3 170 wait_ms(eepromPageWriteDelayMs);
IanBenzMaxim 74:23be10c32fa3 171 }
IanBenzMaxim 74:23be10c32fa3 172 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 173 }
IanBenzMaxim 21:00c94aeb533e 174
IanBenzMaxim 73:2cecc1372acc 175 ISha256MacCoproc::CmdResult DS2465::computeWriteMac(const WriteMacData & writeMacData, Mac & mac) const
IanBenzMaxim 21:00c94aeb533e 176 {
IanBenzMaxim 74:23be10c32fa3 177 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 178 // Write input data to scratchpad
IanBenzMaxim 74:23be10c32fa3 179 result = writeScratchpad(writeMacData, writeMacData.length);
IanBenzMaxim 74:23be10c32fa3 180 // Compute MAC
IanBenzMaxim 74:23be10c32fa3 181 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 182 {
IanBenzMaxim 74:23be10c32fa3 183 result = computeWriteMac(false);
IanBenzMaxim 74:23be10c32fa3 184 }
IanBenzMaxim 74:23be10c32fa3 185 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 186 {
IanBenzMaxim 74:23be10c32fa3 187 wait_ms(shaComputationDelayMs);
IanBenzMaxim 74:23be10c32fa3 188 // Read MAC from register
IanBenzMaxim 78:0cbbac7f2016 189 result = readMemory(MacReadoutReg, mac, mac.length, true);
IanBenzMaxim 74:23be10c32fa3 190 }
IanBenzMaxim 74:23be10c32fa3 191 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 192 }
IanBenzMaxim 21:00c94aeb533e 193
IanBenzMaxim 73:2cecc1372acc 194 ISha256MacCoproc::CmdResult DS2465::computeAuthMac(const DevicePage & devicePage, const DeviceScratchpad & challenge, const AuthMacData & authMacData, Mac & mac) const
IanBenzMaxim 21:00c94aeb533e 195 {
IanBenzMaxim 74:23be10c32fa3 196 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 197 int addr = Scratchpad;
IanBenzMaxim 74:23be10c32fa3 198 // Write input data to scratchpad
IanBenzMaxim 74:23be10c32fa3 199 result = cWriteMemory(addr, devicePage, devicePage.length);
IanBenzMaxim 74:23be10c32fa3 200 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 201 {
IanBenzMaxim 74:23be10c32fa3 202 addr += devicePage.length;
IanBenzMaxim 74:23be10c32fa3 203 result = cWriteMemory(addr, challenge, challenge.length);
IanBenzMaxim 74:23be10c32fa3 204 }
IanBenzMaxim 74:23be10c32fa3 205 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 206 {
IanBenzMaxim 74:23be10c32fa3 207 addr += challenge.length;
IanBenzMaxim 74:23be10c32fa3 208 result = cWriteMemory(addr, authMacData, authMacData.length);
IanBenzMaxim 74:23be10c32fa3 209 }
IanBenzMaxim 74:23be10c32fa3 210 // Compute MAC
IanBenzMaxim 74:23be10c32fa3 211 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 212 {
IanBenzMaxim 74:23be10c32fa3 213 result = computeAuthMac();
IanBenzMaxim 74:23be10c32fa3 214 }
IanBenzMaxim 74:23be10c32fa3 215 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 216 {
IanBenzMaxim 74:23be10c32fa3 217 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 74:23be10c32fa3 218 // Read MAC from register
IanBenzMaxim 78:0cbbac7f2016 219 result = readMemory(MacReadoutReg, mac, mac.length, true);
IanBenzMaxim 74:23be10c32fa3 220 }
IanBenzMaxim 74:23be10c32fa3 221 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 222 }
IanBenzMaxim 21:00c94aeb533e 223
IanBenzMaxim 73:2cecc1372acc 224 ISha256MacCoproc::CmdResult DS2465::computeSlaveSecret(const DevicePage & devicePage, const DeviceScratchpad & deviceScratchpad, const SlaveSecretData & slaveSecretData)
IanBenzMaxim 21:00c94aeb533e 225 {
IanBenzMaxim 74:23be10c32fa3 226 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 227 int addr = Scratchpad;
IanBenzMaxim 74:23be10c32fa3 228 // Write input data to scratchpad
IanBenzMaxim 74:23be10c32fa3 229 result = writeMemory(addr, devicePage, devicePage.length);
IanBenzMaxim 74:23be10c32fa3 230 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 231 {
IanBenzMaxim 74:23be10c32fa3 232 addr += devicePage.length;
IanBenzMaxim 74:23be10c32fa3 233 result = writeMemory(addr, deviceScratchpad, deviceScratchpad.length);
IanBenzMaxim 74:23be10c32fa3 234 }
IanBenzMaxim 74:23be10c32fa3 235 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 236 {
IanBenzMaxim 74:23be10c32fa3 237 addr += deviceScratchpad.length;
IanBenzMaxim 74:23be10c32fa3 238 result = writeMemory(addr, slaveSecretData, slaveSecretData.length);
IanBenzMaxim 74:23be10c32fa3 239 }
IanBenzMaxim 74:23be10c32fa3 240 // Compute secret
IanBenzMaxim 74:23be10c32fa3 241 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 242 {
IanBenzMaxim 74:23be10c32fa3 243 result = computeSlaveSecret();
IanBenzMaxim 74:23be10c32fa3 244 }
IanBenzMaxim 74:23be10c32fa3 245 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 246 {
IanBenzMaxim 74:23be10c32fa3 247 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 74:23be10c32fa3 248 }
IanBenzMaxim 74:23be10c32fa3 249 return (result == OneWireMaster::Success ? ISha256MacCoproc::Success : ISha256MacCoproc::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 250 }
IanBenzMaxim 21:00c94aeb533e 251
IanBenzMaxim 74:23be10c32fa3 252 OneWireMaster::CmdResult DS2465::copyScratchpad(bool destSecret, unsigned int pageNum, bool notFull, unsigned int segmentNum)
IanBenzMaxim 21:00c94aeb533e 253 {
IanBenzMaxim 78:0cbbac7f2016 254 uint8_t command[2] = { CopyScratchpadCmd, (uint8_t)(destSecret ? 0 : (0x80 | (pageNum << 4) | (notFull << 3) | segmentNum)) };
IanBenzMaxim 78:0cbbac7f2016 255 return writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 256 }
IanBenzMaxim 21:00c94aeb533e 257
IanBenzMaxim 34:11fffbe98ef9 258 OneWireMaster::CmdResult DS2465::configureLevel(OWLevel level)
IanBenzMaxim 26:a361e3f42ba5 259 {
IanBenzMaxim 74:23be10c32fa3 260 OneWireMaster::CmdResult result;
IanBenzMaxim 75:8b627804927c 261 if (m_curConfig.getSPU() != (level == StrongLevel))
IanBenzMaxim 74:23be10c32fa3 262 {
IanBenzMaxim 74:23be10c32fa3 263 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 264 newConfig.setSPU(level == StrongLevel);
IanBenzMaxim 74:23be10c32fa3 265 result = writeConfig(newConfig, true);
IanBenzMaxim 74:23be10c32fa3 266 }
IanBenzMaxim 74:23be10c32fa3 267 else
IanBenzMaxim 74:23be10c32fa3 268 {
IanBenzMaxim 74:23be10c32fa3 269 result = OneWireMaster::Success;
IanBenzMaxim 74:23be10c32fa3 270 }
IanBenzMaxim 74:23be10c32fa3 271 return result;
IanBenzMaxim 21:00c94aeb533e 272 }
IanBenzMaxim 21:00c94aeb533e 273
IanBenzMaxim 75:8b627804927c 274 OneWireMaster::CmdResult DS2465::OWSetLevel(OWLevel newLevel)
IanBenzMaxim 21:00c94aeb533e 275 {
IanBenzMaxim 75:8b627804927c 276 if (newLevel == StrongLevel)
IanBenzMaxim 74:23be10c32fa3 277 {
IanBenzMaxim 74:23be10c32fa3 278 return OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 279 }
IanBenzMaxim 74:23be10c32fa3 280
IanBenzMaxim 75:8b627804927c 281 return configureLevel(newLevel);
IanBenzMaxim 21:00c94aeb533e 282 }
IanBenzMaxim 21:00c94aeb533e 283
IanBenzMaxim 75:8b627804927c 284 OneWireMaster::CmdResult DS2465::OWSetSpeed(OWSpeed newSpeed)
IanBenzMaxim 21:00c94aeb533e 285 {
IanBenzMaxim 74:23be10c32fa3 286 // Requested speed is already set
IanBenzMaxim 75:8b627804927c 287 if (m_curConfig.get1WS() == (newSpeed == OverdriveSpeed))
IanBenzMaxim 74:23be10c32fa3 288 {
IanBenzMaxim 74:23be10c32fa3 289 return OneWireMaster::Success;
IanBenzMaxim 74:23be10c32fa3 290 }
IanBenzMaxim 21:00c94aeb533e 291
IanBenzMaxim 74:23be10c32fa3 292 // set the speed
IanBenzMaxim 74:23be10c32fa3 293 Config newConfig = m_curConfig;
IanBenzMaxim 75:8b627804927c 294 newConfig.set1WS(newSpeed == OverdriveSpeed);
IanBenzMaxim 74:23be10c32fa3 295
IanBenzMaxim 74:23be10c32fa3 296 // write the new config
IanBenzMaxim 74:23be10c32fa3 297 return writeConfig(newConfig, true);
IanBenzMaxim 21:00c94aeb533e 298 }
IanBenzMaxim 21:00c94aeb533e 299
IanBenzMaxim 75:8b627804927c 300 OneWireMaster::CmdResult DS2465::OWTriplet(SearchDirection & searchDirection, uint8_t & sbr, uint8_t & tsb)
IanBenzMaxim 21:00c94aeb533e 301 {
IanBenzMaxim 74:23be10c32fa3 302 // 1-Wire Triplet (Case B)
IanBenzMaxim 74:23be10c32fa3 303 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 304 // \--------/
IanBenzMaxim 74:23be10c32fa3 305 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 306 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 307 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 74:23be10c32fa3 308
IanBenzMaxim 74:23be10c32fa3 309 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 310 uint8_t command[2] = { OwTripletCmd, (uint8_t)((searchDirection == WriteOne) ? 0x80 : 0x00) };
IanBenzMaxim 78:0cbbac7f2016 311 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 32:bce180b544ed 312 if (result == OneWireMaster::Success)
IanBenzMaxim 32:bce180b544ed 313 {
IanBenzMaxim 74:23be10c32fa3 314 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 315 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 316 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 317 {
IanBenzMaxim 74:23be10c32fa3 318 // check bit results in status byte
IanBenzMaxim 78:0cbbac7f2016 319 sbr = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 78:0cbbac7f2016 320 tsb = ((status & Status_TSB) == Status_TSB);
IanBenzMaxim 78:0cbbac7f2016 321 searchDirection = ((status & Status_DIR) == Status_DIR) ? WriteOne : WriteZero;
IanBenzMaxim 74:23be10c32fa3 322 }
IanBenzMaxim 32:bce180b544ed 323 }
IanBenzMaxim 74:23be10c32fa3 324 return result;
IanBenzMaxim 21:00c94aeb533e 325 }
IanBenzMaxim 21:00c94aeb533e 326
IanBenzMaxim 75:8b627804927c 327 OneWireMaster::CmdResult DS2465::OWReadBlock(uint8_t *recvBuf, uint8_t recvLen)
IanBenzMaxim 21:00c94aeb533e 328 {
IanBenzMaxim 74:23be10c32fa3 329 // 1-Wire Receive Block (Case A)
IanBenzMaxim 78:0cbbac7f2016 330 // S AD,0 [A] CommandReg [A] 1WRF [A] PR [A] P
IanBenzMaxim 74:23be10c32fa3 331 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 332 // PR indicates byte containing parameter
IanBenzMaxim 74:23be10c32fa3 333
IanBenzMaxim 74:23be10c32fa3 334 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 335 uint8_t command[2] = { OwReceiveBlockCmd, recvLen };
IanBenzMaxim 21:00c94aeb533e 336
IanBenzMaxim 78:0cbbac7f2016 337 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 338 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 339 {
IanBenzMaxim 74:23be10c32fa3 340 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 341 }
IanBenzMaxim 74:23be10c32fa3 342 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 343 {
IanBenzMaxim 78:0cbbac7f2016 344 result = readMemory(Scratchpad, recvBuf, recvLen, false);
IanBenzMaxim 74:23be10c32fa3 345 }
IanBenzMaxim 21:00c94aeb533e 346
IanBenzMaxim 74:23be10c32fa3 347 return result;
IanBenzMaxim 21:00c94aeb533e 348 }
IanBenzMaxim 21:00c94aeb533e 349
IanBenzMaxim 75:8b627804927c 350 OneWireMaster::CmdResult DS2465::OWWriteBlock(const uint8_t *sendBuf, uint8_t sendLen)
IanBenzMaxim 21:00c94aeb533e 351 {
IanBenzMaxim 75:8b627804927c 352 return OWWriteBlock(false, sendBuf, sendLen);
IanBenzMaxim 21:00c94aeb533e 353 }
IanBenzMaxim 21:00c94aeb533e 354
IanBenzMaxim 47:307dc45952db 355 OneWireMaster::CmdResult DS2465::OWWriteBlockMac()
IanBenzMaxim 47:307dc45952db 356 {
IanBenzMaxim 74:23be10c32fa3 357 return OWWriteBlock(true, NULL, 0);
IanBenzMaxim 47:307dc45952db 358 }
IanBenzMaxim 47:307dc45952db 359
IanBenzMaxim 73:2cecc1372acc 360 OneWireMaster::CmdResult DS2465::OWWriteBlock(bool tx_mac, const uint8_t *tran_buf, uint8_t tran_len)
IanBenzMaxim 21:00c94aeb533e 361 {
IanBenzMaxim 74:23be10c32fa3 362 OneWireMaster::CmdResult result;
IanBenzMaxim 78:0cbbac7f2016 363 uint8_t command[2] = { OwTransmitBlockCmd, (uint8_t)(tx_mac ? 0xFF : tran_len) };
IanBenzMaxim 21:00c94aeb533e 364
IanBenzMaxim 74:23be10c32fa3 365 if (!tx_mac)
IanBenzMaxim 74:23be10c32fa3 366 {
IanBenzMaxim 74:23be10c32fa3 367 // prefill scratchpad with required data
IanBenzMaxim 78:0cbbac7f2016 368 result = writeMemory(Scratchpad, tran_buf, tran_len);
IanBenzMaxim 74:23be10c32fa3 369 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 370 {
IanBenzMaxim 74:23be10c32fa3 371 return result;
IanBenzMaxim 74:23be10c32fa3 372 }
IanBenzMaxim 74:23be10c32fa3 373 }
IanBenzMaxim 21:00c94aeb533e 374
IanBenzMaxim 74:23be10c32fa3 375 // 1-Wire Transmit Block (Case A)
IanBenzMaxim 78:0cbbac7f2016 376 // S AD,0 [A] CommandReg [A] 1WTB [A] PR [A] P
IanBenzMaxim 74:23be10c32fa3 377 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 378 // PR indicates byte containing parameter
IanBenzMaxim 74:23be10c32fa3 379
IanBenzMaxim 78:0cbbac7f2016 380 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 21:00c94aeb533e 381
IanBenzMaxim 74:23be10c32fa3 382 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 383 {
IanBenzMaxim 74:23be10c32fa3 384 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 385 }
IanBenzMaxim 74:23be10c32fa3 386
IanBenzMaxim 74:23be10c32fa3 387 return result;
IanBenzMaxim 21:00c94aeb533e 388 }
IanBenzMaxim 21:00c94aeb533e 389
IanBenzMaxim 75:8b627804927c 390 OneWireMaster::CmdResult DS2465::OWReadByteSetLevel(uint8_t & recvByte, OWLevel afterLevel)
IanBenzMaxim 21:00c94aeb533e 391 {
IanBenzMaxim 74:23be10c32fa3 392 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 78:0cbbac7f2016 393 // S AD,0 [A] CommandReg [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A
IanBenzMaxim 74:23be10c32fa3 394 // \--------/
IanBenzMaxim 74:23be10c32fa3 395 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 396 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 74:23be10c32fa3 397 //
IanBenzMaxim 74:23be10c32fa3 398 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 399 // DD data read
IanBenzMaxim 74:23be10c32fa3 400
IanBenzMaxim 74:23be10c32fa3 401 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 402 uint8_t buf;
IanBenzMaxim 74:23be10c32fa3 403
IanBenzMaxim 75:8b627804927c 404 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 405 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 406 {
IanBenzMaxim 74:23be10c32fa3 407 return result;
IanBenzMaxim 74:23be10c32fa3 408 }
IanBenzMaxim 74:23be10c32fa3 409
IanBenzMaxim 78:0cbbac7f2016 410 buf = OwReadByteCmd;
IanBenzMaxim 78:0cbbac7f2016 411 result = writeMemory(CommandReg, &buf, 1);
IanBenzMaxim 74:23be10c32fa3 412
IanBenzMaxim 74:23be10c32fa3 413 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 414 {
IanBenzMaxim 74:23be10c32fa3 415 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 416 }
IanBenzMaxim 74:23be10c32fa3 417
IanBenzMaxim 74:23be10c32fa3 418 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 419 {
IanBenzMaxim 78:0cbbac7f2016 420 result = readMemory(ReadDataReg, &buf, 1);
IanBenzMaxim 74:23be10c32fa3 421 }
IanBenzMaxim 74:23be10c32fa3 422
IanBenzMaxim 74:23be10c32fa3 423 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 424 {
IanBenzMaxim 75:8b627804927c 425 recvByte = buf;
IanBenzMaxim 74:23be10c32fa3 426 }
IanBenzMaxim 74:23be10c32fa3 427
IanBenzMaxim 26:a361e3f42ba5 428 return result;
IanBenzMaxim 21:00c94aeb533e 429 }
IanBenzMaxim 21:00c94aeb533e 430
IanBenzMaxim 75:8b627804927c 431 OneWireMaster::CmdResult DS2465::OWWriteByteSetLevel(uint8_t sendByte, OWLevel afterLevel)
IanBenzMaxim 74:23be10c32fa3 432 {
IanBenzMaxim 74:23be10c32fa3 433 // 1-Wire Write Byte (Case B)
IanBenzMaxim 78:0cbbac7f2016 434 // S AD,0 [A] CommandReg [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 435 // \--------/
IanBenzMaxim 74:23be10c32fa3 436 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 437 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 438 // DD data to write
IanBenzMaxim 74:23be10c32fa3 439
IanBenzMaxim 74:23be10c32fa3 440 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 441
IanBenzMaxim 75:8b627804927c 442 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 443 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 444 {
IanBenzMaxim 74:23be10c32fa3 445 return result;
IanBenzMaxim 74:23be10c32fa3 446 }
IanBenzMaxim 74:23be10c32fa3 447
IanBenzMaxim 78:0cbbac7f2016 448 uint8_t command[2] = { OwWriteByteCmd, sendByte };
IanBenzMaxim 74:23be10c32fa3 449
IanBenzMaxim 78:0cbbac7f2016 450 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 451 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 452 {
IanBenzMaxim 74:23be10c32fa3 453 result = pollBusy();
IanBenzMaxim 74:23be10c32fa3 454 }
IanBenzMaxim 74:23be10c32fa3 455
IanBenzMaxim 26:a361e3f42ba5 456 return result;
IanBenzMaxim 21:00c94aeb533e 457 }
IanBenzMaxim 21:00c94aeb533e 458
IanBenzMaxim 75:8b627804927c 459 OneWireMaster::CmdResult DS2465::OWTouchBitSetLevel(uint8_t & sendRecvBit, OWLevel afterLevel)
IanBenzMaxim 21:00c94aeb533e 460 {
IanBenzMaxim 74:23be10c32fa3 461 // 1-Wire bit (Case B)
IanBenzMaxim 78:0cbbac7f2016 462 // S AD,0 [A] CommandReg [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 74:23be10c32fa3 463 // \--------/
IanBenzMaxim 74:23be10c32fa3 464 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 74:23be10c32fa3 465 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 466 // BB indicates byte containing bit value in msbit
IanBenzMaxim 74:23be10c32fa3 467
IanBenzMaxim 74:23be10c32fa3 468 OneWireMaster::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 469
IanBenzMaxim 75:8b627804927c 470 result = configureLevel(afterLevel);
IanBenzMaxim 74:23be10c32fa3 471 if (result != OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 472 {
IanBenzMaxim 74:23be10c32fa3 473 return result;
IanBenzMaxim 74:23be10c32fa3 474 }
IanBenzMaxim 21:00c94aeb533e 475
IanBenzMaxim 78:0cbbac7f2016 476 uint8_t command[2] = { OwSingleBitCmd, (uint8_t)(sendRecvBit ? 0x80 : 0x00) };
IanBenzMaxim 74:23be10c32fa3 477 uint8_t status;
IanBenzMaxim 74:23be10c32fa3 478
IanBenzMaxim 78:0cbbac7f2016 479 result = writeMemory(CommandReg, command, 2);
IanBenzMaxim 74:23be10c32fa3 480
IanBenzMaxim 74:23be10c32fa3 481 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 482 {
IanBenzMaxim 74:23be10c32fa3 483 result = pollBusy(&status);
IanBenzMaxim 74:23be10c32fa3 484 }
IanBenzMaxim 74:23be10c32fa3 485
IanBenzMaxim 74:23be10c32fa3 486 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 487 {
IanBenzMaxim 78:0cbbac7f2016 488 sendRecvBit = (status & Status_SBR);
IanBenzMaxim 74:23be10c32fa3 489 }
IanBenzMaxim 74:23be10c32fa3 490
IanBenzMaxim 26:a361e3f42ba5 491 return result;
IanBenzMaxim 21:00c94aeb533e 492 }
IanBenzMaxim 21:00c94aeb533e 493
IanBenzMaxim 73:2cecc1372acc 494 OneWireMaster::CmdResult DS2465::cWriteMemory(uint8_t addr, const uint8_t * buf, size_t bufLen) const
IanBenzMaxim 21:00c94aeb533e 495 {
IanBenzMaxim 74:23be10c32fa3 496 int i;
IanBenzMaxim 21:00c94aeb533e 497
IanBenzMaxim 74:23be10c32fa3 498 // Write SRAM (Case A)
IanBenzMaxim 74:23be10c32fa3 499 // S AD,0 [A] VSA [A] DD [A] P
IanBenzMaxim 74:23be10c32fa3 500 // \-----/
IanBenzMaxim 74:23be10c32fa3 501 // Repeat for each data byte
IanBenzMaxim 74:23be10c32fa3 502 // [] indicates from slave
IanBenzMaxim 74:23be10c32fa3 503 // VSA valid SRAM memory address
IanBenzMaxim 74:23be10c32fa3 504 // DD memory data to write
IanBenzMaxim 74:23be10c32fa3 505
IanBenzMaxim 74:23be10c32fa3 506 m_I2C_interface.start();
IanBenzMaxim 74:23be10c32fa3 507 if (m_I2C_interface.write((m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 508 {
IanBenzMaxim 21:00c94aeb533e 509 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 510 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 511 }
IanBenzMaxim 74:23be10c32fa3 512 if (m_I2C_interface.write(addr) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 513 {
IanBenzMaxim 74:23be10c32fa3 514 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 515 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 516 }
IanBenzMaxim 74:23be10c32fa3 517 // loop to write each byte
IanBenzMaxim 74:23be10c32fa3 518 for (i = 0; i < bufLen; i++)
IanBenzMaxim 74:23be10c32fa3 519 {
IanBenzMaxim 74:23be10c32fa3 520 if (m_I2C_interface.write(buf[i]) != I2C_WRITE_OK)
IanBenzMaxim 74:23be10c32fa3 521 {
IanBenzMaxim 74:23be10c32fa3 522 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 523 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 74:23be10c32fa3 524 }
IanBenzMaxim 74:23be10c32fa3 525 }
IanBenzMaxim 74:23be10c32fa3 526 m_I2C_interface.stop();
IanBenzMaxim 74:23be10c32fa3 527
IanBenzMaxim 74:23be10c32fa3 528 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 529 }
IanBenzMaxim 21:00c94aeb533e 530
IanBenzMaxim 73:2cecc1372acc 531 OneWireMaster::CmdResult DS2465::readMemory(uint8_t addr, uint8_t * buf, size_t bufLen, bool skipSetPointer) const
IanBenzMaxim 21:00c94aeb533e 532 {
IanBenzMaxim 74:23be10c32fa3 533 int i;
IanBenzMaxim 74:23be10c32fa3 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 74:23be10c32fa3 565 for (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 }