Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
OneWire_Masters/DS2465/DS2465.cpp@35:5d23395628f6, 2016-04-01 (annotated)
- Committer:
- IanBenzMaxim
- Date:
- Fri Apr 01 14:29:22 2016 -0500
- Revision:
- 35:5d23395628f6
- Parent:
- 34:11fffbe98ef9
- Child:
- 47:307dc45952db
Keep DS2465 current configuration consistent and updated.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
IanBenzMaxim | 21:00c94aeb533e | 1 | #include "DS2465.hpp" |
IanBenzMaxim | 27:d5aaefa252f1 | 2 | #include "RomId.hpp" |
IanBenzMaxim | 27:d5aaefa252f1 | 3 | #include "mbed.h" |
IanBenzMaxim | 21:00c94aeb533e | 4 | |
IanBenzMaxim | 21:00c94aeb533e | 5 | #define I2C_WRITE 0 |
IanBenzMaxim | 21:00c94aeb533e | 6 | #define I2C_READ 1 |
IanBenzMaxim | 21:00c94aeb533e | 7 | |
IanBenzMaxim | 21:00c94aeb533e | 8 | // DS2465 commands |
IanBenzMaxim | 21:00c94aeb533e | 9 | #define CMD_1WMR 0xF0 |
IanBenzMaxim | 21:00c94aeb533e | 10 | #define CMD_WCFG 0xD2 |
IanBenzMaxim | 21:00c94aeb533e | 11 | #define CMD_CHSL 0xC3 |
IanBenzMaxim | 21:00c94aeb533e | 12 | #define CMD_SRP 0xE1 |
IanBenzMaxim | 21:00c94aeb533e | 13 | |
IanBenzMaxim | 21:00c94aeb533e | 14 | #define CMD_1WRS 0xB4 |
IanBenzMaxim | 21:00c94aeb533e | 15 | #define CMD_1WWB 0xA5 |
IanBenzMaxim | 21:00c94aeb533e | 16 | #define CMD_1WRB 0x96 |
IanBenzMaxim | 21:00c94aeb533e | 17 | #define CMD_1WSB 0x87 |
IanBenzMaxim | 21:00c94aeb533e | 18 | #define CMD_1WT 0x78 |
IanBenzMaxim | 21:00c94aeb533e | 19 | #define CMD_1WTB 0x69 |
IanBenzMaxim | 21:00c94aeb533e | 20 | #define CMD_1WRF 0xE1 |
IanBenzMaxim | 21:00c94aeb533e | 21 | #define CMD_CPS 0x5A |
IanBenzMaxim | 21:00c94aeb533e | 22 | #define CMD_CSS 0x4B |
IanBenzMaxim | 21:00c94aeb533e | 23 | #define CMD_CSAM 0x3C |
IanBenzMaxim | 21:00c94aeb533e | 24 | #define CMD_CSWM 0x2D |
IanBenzMaxim | 21:00c94aeb533e | 25 | #define CMD_CNMS 0x1E |
IanBenzMaxim | 21:00c94aeb533e | 26 | #define CMD_SPR 0x0F |
IanBenzMaxim | 21:00c94aeb533e | 27 | |
IanBenzMaxim | 21:00c94aeb533e | 28 | // DS2465 status bits |
IanBenzMaxim | 21:00c94aeb533e | 29 | #define STATUS_1WB 0x01 |
IanBenzMaxim | 21:00c94aeb533e | 30 | #define STATUS_PPD 0x02 |
IanBenzMaxim | 21:00c94aeb533e | 31 | #define STATUS_SD 0x04 |
IanBenzMaxim | 21:00c94aeb533e | 32 | #define STATUS_LL 0x08 |
IanBenzMaxim | 21:00c94aeb533e | 33 | #define STATUS_RST 0x10 |
IanBenzMaxim | 21:00c94aeb533e | 34 | #define STATUS_SBR 0x20 |
IanBenzMaxim | 21:00c94aeb533e | 35 | #define STATUS_TSB 0x40 |
IanBenzMaxim | 21:00c94aeb533e | 36 | #define STATUS_DIR 0x80 |
IanBenzMaxim | 21:00c94aeb533e | 37 | |
IanBenzMaxim | 21:00c94aeb533e | 38 | static const int I2C_WRITE_OK = 0; |
IanBenzMaxim | 21:00c94aeb533e | 39 | |
IanBenzMaxim | 24:8942d8478d68 | 40 | |
IanBenzMaxim | 24:8942d8478d68 | 41 | std::uint8_t DS2465::Config::readByte() const |
IanBenzMaxim | 24:8942d8478d68 | 42 | { |
IanBenzMaxim | 24:8942d8478d68 | 43 | std::uint8_t config = 0; |
IanBenzMaxim | 24:8942d8478d68 | 44 | if (c1WS) |
IanBenzMaxim | 24:8942d8478d68 | 45 | config |= 0x08; |
IanBenzMaxim | 24:8942d8478d68 | 46 | if (cSPU) |
IanBenzMaxim | 24:8942d8478d68 | 47 | config |= 0x04; |
IanBenzMaxim | 24:8942d8478d68 | 48 | if (cPDN) |
IanBenzMaxim | 24:8942d8478d68 | 49 | config |= 0x02; |
IanBenzMaxim | 24:8942d8478d68 | 50 | if (cAPU) |
IanBenzMaxim | 24:8942d8478d68 | 51 | config |= 0x01; |
IanBenzMaxim | 24:8942d8478d68 | 52 | return config; |
IanBenzMaxim | 24:8942d8478d68 | 53 | } |
IanBenzMaxim | 24:8942d8478d68 | 54 | |
IanBenzMaxim | 24:8942d8478d68 | 55 | std::uint8_t DS2465::Config::writeByte() const |
IanBenzMaxim | 24:8942d8478d68 | 56 | { |
IanBenzMaxim | 24:8942d8478d68 | 57 | std::uint8_t config = readByte(); |
IanBenzMaxim | 24:8942d8478d68 | 58 | return ((~config << 4) | config); |
IanBenzMaxim | 24:8942d8478d68 | 59 | } |
IanBenzMaxim | 24:8942d8478d68 | 60 | |
IanBenzMaxim | 24:8942d8478d68 | 61 | void DS2465::Config::reset() |
IanBenzMaxim | 24:8942d8478d68 | 62 | { |
IanBenzMaxim | 24:8942d8478d68 | 63 | c1WS = cSPU = cPDN = false; |
IanBenzMaxim | 24:8942d8478d68 | 64 | cAPU = true; |
IanBenzMaxim | 24:8942d8478d68 | 65 | } |
IanBenzMaxim | 24:8942d8478d68 | 66 | |
IanBenzMaxim | 24:8942d8478d68 | 67 | |
IanBenzMaxim | 24:8942d8478d68 | 68 | |
IanBenzMaxim | 24:8942d8478d68 | 69 | |
IanBenzMaxim | 32:bce180b544ed | 70 | DS2465::DS2465(I2C & I2C_interface, std::uint8_t I2C_address) |
IanBenzMaxim | 21:00c94aeb533e | 71 | : m_I2C_interface(I2C_interface), m_I2C_address(I2C_address) |
IanBenzMaxim | 21:00c94aeb533e | 72 | { |
IanBenzMaxim | 21:00c94aeb533e | 73 | |
IanBenzMaxim | 21:00c94aeb533e | 74 | } |
IanBenzMaxim | 21:00c94aeb533e | 75 | |
IanBenzMaxim | 21:00c94aeb533e | 76 | |
IanBenzMaxim | 21:00c94aeb533e | 77 | |
IanBenzMaxim | 21:00c94aeb533e | 78 | |
IanBenzMaxim | 21:00c94aeb533e | 79 | OneWireMaster::CmdResult DS2465::OWInitMaster() |
IanBenzMaxim | 21:00c94aeb533e | 80 | { |
IanBenzMaxim | 34:11fffbe98ef9 | 81 | return detect(); |
IanBenzMaxim | 21:00c94aeb533e | 82 | } |
IanBenzMaxim | 21:00c94aeb533e | 83 | |
IanBenzMaxim | 21:00c94aeb533e | 84 | |
IanBenzMaxim | 21:00c94aeb533e | 85 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 86 | // Compute Next Master Secret DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 87 | // |
IanBenzMaxim | 21:00c94aeb533e | 88 | // 'swap' - 1 if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 89 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 90 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 91 | // |
IanBenzMaxim | 21:00c94aeb533e | 92 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 93 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 94 | // |
IanBenzMaxim | 33:a4c015046956 | 95 | OneWireMaster::CmdResult DS2465::computeNextMasterSecret(bool swap, unsigned int pageNum, PageRegion region) |
IanBenzMaxim | 21:00c94aeb533e | 96 | { |
IanBenzMaxim | 27:d5aaefa252f1 | 97 | std::uint8_t command[2] = { CMD_CNMS, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 98 | return writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 99 | } |
IanBenzMaxim | 21:00c94aeb533e | 100 | |
IanBenzMaxim | 21:00c94aeb533e | 101 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 102 | // Compute Write MAC DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 103 | // |
IanBenzMaxim | 21:00c94aeb533e | 104 | // 'regwrite' - true if writing to a register, false if regular memory |
IanBenzMaxim | 21:00c94aeb533e | 105 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 106 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 107 | // 'segment' - segment number if swaping |
IanBenzMaxim | 21:00c94aeb533e | 108 | // |
IanBenzMaxim | 21:00c94aeb533e | 109 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 110 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 111 | // |
IanBenzMaxim | 33:a4c015046956 | 112 | OneWireMaster::CmdResult DS2465::computeWriteMac(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const |
IanBenzMaxim | 21:00c94aeb533e | 113 | { |
IanBenzMaxim | 27:d5aaefa252f1 | 114 | std::uint8_t command[2] = { CMD_CSWM, ((regwrite << 7) | (swap << 6) | (pageNum << 4) | segmentNum) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 115 | return cWriteMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 116 | } |
IanBenzMaxim | 21:00c94aeb533e | 117 | |
IanBenzMaxim | 21:00c94aeb533e | 118 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 119 | // Compute Slave Authentication MAC DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 120 | // |
IanBenzMaxim | 21:00c94aeb533e | 121 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 122 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 123 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 124 | // |
IanBenzMaxim | 21:00c94aeb533e | 125 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 126 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 127 | // |
IanBenzMaxim | 33:a4c015046956 | 128 | OneWireMaster::CmdResult DS2465::computeAuthMac(bool swap, unsigned int pageNum, PageRegion region) const |
IanBenzMaxim | 21:00c94aeb533e | 129 | { |
IanBenzMaxim | 27:d5aaefa252f1 | 130 | std::uint8_t command[2] = { CMD_CSAM, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 131 | return cWriteMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 132 | } |
IanBenzMaxim | 21:00c94aeb533e | 133 | |
IanBenzMaxim | 21:00c94aeb533e | 134 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 135 | // Compute S-Secret on DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 136 | // |
IanBenzMaxim | 21:00c94aeb533e | 137 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 138 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 139 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 140 | // |
IanBenzMaxim | 21:00c94aeb533e | 141 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 142 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 143 | // |
IanBenzMaxim | 33:a4c015046956 | 144 | OneWireMaster::CmdResult DS2465::computeSlaveSecret(bool swap, unsigned int pageNum, PageRegion region) |
IanBenzMaxim | 21:00c94aeb533e | 145 | { |
IanBenzMaxim | 27:d5aaefa252f1 | 146 | std::uint8_t command[2] = { CMD_CSS, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 147 | return writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 148 | } |
IanBenzMaxim | 21:00c94aeb533e | 149 | |
IanBenzMaxim | 21:00c94aeb533e | 150 | |
IanBenzMaxim | 21:00c94aeb533e | 151 | |
IanBenzMaxim | 21:00c94aeb533e | 152 | |
IanBenzMaxim | 33:a4c015046956 | 153 | ISha256MacCoprocessor::CmdResult DS2465::setMasterSecret(const Secret & secret) |
IanBenzMaxim | 21:00c94aeb533e | 154 | { |
IanBenzMaxim | 21:00c94aeb533e | 155 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 34:11fffbe98ef9 | 156 | result = writeMemory(ADDR_SPAD, secret, secret.length); |
IanBenzMaxim | 21:00c94aeb533e | 157 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 158 | result = copyScratchpad(1, 0, 1, 0); |
IanBenzMaxim | 21:00c94aeb533e | 159 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 160 | wait_ms(8 * eepromWriteDelayMs); |
IanBenzMaxim | 21:00c94aeb533e | 161 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 162 | } |
IanBenzMaxim | 21:00c94aeb533e | 163 | |
IanBenzMaxim | 33:a4c015046956 | 164 | ISha256MacCoprocessor::CmdResult DS2465::computeWriteMac(const WriteMacData & writeMacData, Mac & mac) const |
IanBenzMaxim | 21:00c94aeb533e | 165 | { |
IanBenzMaxim | 21:00c94aeb533e | 166 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 167 | // Write input data to scratchpad |
IanBenzMaxim | 34:11fffbe98ef9 | 168 | result = writeScratchpad(writeMacData, writeMacData.length); |
IanBenzMaxim | 21:00c94aeb533e | 169 | // Compute MAC |
IanBenzMaxim | 21:00c94aeb533e | 170 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 33:a4c015046956 | 171 | result = computeWriteMac(false, false, 0, 0); |
IanBenzMaxim | 21:00c94aeb533e | 172 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 173 | { |
IanBenzMaxim | 34:11fffbe98ef9 | 174 | wait_ms(shaComputationDelayMs); |
IanBenzMaxim | 21:00c94aeb533e | 175 | // Read MAC from register |
IanBenzMaxim | 34:11fffbe98ef9 | 176 | result = readMemory(ADDR_MAC_READ, mac, mac.length, true); |
IanBenzMaxim | 21:00c94aeb533e | 177 | } |
IanBenzMaxim | 21:00c94aeb533e | 178 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 179 | } |
IanBenzMaxim | 21:00c94aeb533e | 180 | |
IanBenzMaxim | 33:a4c015046956 | 181 | ISha256MacCoprocessor::CmdResult DS2465::computeAuthMac(const DevicePage & devicePage, const DeviceScratchpad & challenge, const AuthMacData & authMacData, Mac & mac) const |
IanBenzMaxim | 21:00c94aeb533e | 182 | { |
IanBenzMaxim | 21:00c94aeb533e | 183 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 184 | int addr = ADDR_SPAD; |
IanBenzMaxim | 21:00c94aeb533e | 185 | // Write input data to scratchpad |
IanBenzMaxim | 34:11fffbe98ef9 | 186 | result = cWriteMemory(addr, devicePage, devicePage.length); |
IanBenzMaxim | 21:00c94aeb533e | 187 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 188 | { |
IanBenzMaxim | 33:a4c015046956 | 189 | addr += devicePage.length; |
IanBenzMaxim | 34:11fffbe98ef9 | 190 | result = cWriteMemory(addr, challenge, challenge.length); |
IanBenzMaxim | 21:00c94aeb533e | 191 | } |
IanBenzMaxim | 21:00c94aeb533e | 192 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 193 | { |
IanBenzMaxim | 33:a4c015046956 | 194 | addr += challenge.length; |
IanBenzMaxim | 34:11fffbe98ef9 | 195 | result = cWriteMemory(addr, authMacData, authMacData.length); |
IanBenzMaxim | 21:00c94aeb533e | 196 | } |
IanBenzMaxim | 21:00c94aeb533e | 197 | // Compute MAC |
IanBenzMaxim | 21:00c94aeb533e | 198 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 33:a4c015046956 | 199 | result = computeAuthMac(false, 0, REGION_FULL_PAGE); |
IanBenzMaxim | 21:00c94aeb533e | 200 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 201 | { |
IanBenzMaxim | 34:11fffbe98ef9 | 202 | wait_ms(shaComputationDelayMs * 2); |
IanBenzMaxim | 21:00c94aeb533e | 203 | // Read MAC from register |
IanBenzMaxim | 34:11fffbe98ef9 | 204 | result = readMemory(ADDR_MAC_READ, mac, mac.length, true); |
IanBenzMaxim | 21:00c94aeb533e | 205 | } |
IanBenzMaxim | 21:00c94aeb533e | 206 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 207 | } |
IanBenzMaxim | 21:00c94aeb533e | 208 | |
IanBenzMaxim | 33:a4c015046956 | 209 | ISha256MacCoprocessor::CmdResult DS2465::computeSlaveSecret(const DevicePage & devicePage, const DeviceScratchpad & deviceScratchpad, const SlaveSecretData & slaveSecretData) |
IanBenzMaxim | 21:00c94aeb533e | 210 | { |
IanBenzMaxim | 21:00c94aeb533e | 211 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 212 | int addr = ADDR_SPAD; |
IanBenzMaxim | 21:00c94aeb533e | 213 | // Write input data to scratchpad |
IanBenzMaxim | 34:11fffbe98ef9 | 214 | result = writeMemory(addr, devicePage, devicePage.length); |
IanBenzMaxim | 21:00c94aeb533e | 215 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 216 | { |
IanBenzMaxim | 33:a4c015046956 | 217 | addr += devicePage.length; |
IanBenzMaxim | 34:11fffbe98ef9 | 218 | result = writeMemory(addr, deviceScratchpad, deviceScratchpad.length); |
IanBenzMaxim | 21:00c94aeb533e | 219 | } |
IanBenzMaxim | 21:00c94aeb533e | 220 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 221 | { |
IanBenzMaxim | 33:a4c015046956 | 222 | addr += deviceScratchpad.length; |
IanBenzMaxim | 34:11fffbe98ef9 | 223 | result = writeMemory(addr, slaveSecretData, slaveSecretData.length); |
IanBenzMaxim | 21:00c94aeb533e | 224 | } |
IanBenzMaxim | 21:00c94aeb533e | 225 | // Compute secret |
IanBenzMaxim | 21:00c94aeb533e | 226 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 33:a4c015046956 | 227 | result = computeSlaveSecret(false, 0, REGION_FULL_PAGE); |
IanBenzMaxim | 21:00c94aeb533e | 228 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 229 | wait_ms(shaComputationDelayMs * 2); |
IanBenzMaxim | 21:00c94aeb533e | 230 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 231 | } |
IanBenzMaxim | 21:00c94aeb533e | 232 | |
IanBenzMaxim | 21:00c94aeb533e | 233 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 234 | // Copy Scratchpad on DS2465 to either secret or memory page |
IanBenzMaxim | 21:00c94aeb533e | 235 | // |
IanBenzMaxim | 34:11fffbe98ef9 | 236 | // 'destSecret' - 1 if destination is secret, 0 if memory page |
IanBenzMaxim | 34:11fffbe98ef9 | 237 | // 'page' - page number if destSecret=0 |
IanBenzMaxim | 21:00c94aeb533e | 238 | // 'notfull' - 0 if only 4 byte segment, 1 if writing to full page, |
IanBenzMaxim | 21:00c94aeb533e | 239 | // 'seg' - Segment number if full=0. |
IanBenzMaxim | 21:00c94aeb533e | 240 | // |
IanBenzMaxim | 21:00c94aeb533e | 241 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 242 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 243 | // |
IanBenzMaxim | 34:11fffbe98ef9 | 244 | OneWireMaster::CmdResult DS2465::copyScratchpad(bool destSecret, unsigned int pageNum, bool notFull, unsigned int segmentNum) |
IanBenzMaxim | 21:00c94aeb533e | 245 | { |
IanBenzMaxim | 34:11fffbe98ef9 | 246 | std::uint8_t command[2] = { CMD_CPS, (destSecret ? 0 : (0x80 | (pageNum << 4) | (notFull << 3) | segmentNum)) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 247 | return writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 248 | } |
IanBenzMaxim | 21:00c94aeb533e | 249 | |
IanBenzMaxim | 26:a361e3f42ba5 | 250 | |
IanBenzMaxim | 21:00c94aeb533e | 251 | |
IanBenzMaxim | 26:a361e3f42ba5 | 252 | |
IanBenzMaxim | 34:11fffbe98ef9 | 253 | OneWireMaster::CmdResult DS2465::configureLevel(OWLevel level) |
IanBenzMaxim | 26:a361e3f42ba5 | 254 | { |
IanBenzMaxim | 26:a361e3f42ba5 | 255 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 32:bce180b544ed | 256 | if (m_curConfig.cSPU != (level == LEVEL_STRONG)) |
IanBenzMaxim | 26:a361e3f42ba5 | 257 | { |
IanBenzMaxim | 35:5d23395628f6 | 258 | Config newConfig = m_curConfig; |
IanBenzMaxim | 35:5d23395628f6 | 259 | newConfig.cSPU = (level == LEVEL_STRONG); |
IanBenzMaxim | 35:5d23395628f6 | 260 | result = writeConfig(newConfig, true); |
IanBenzMaxim | 21:00c94aeb533e | 261 | } |
IanBenzMaxim | 26:a361e3f42ba5 | 262 | else |
IanBenzMaxim | 26:a361e3f42ba5 | 263 | { |
IanBenzMaxim | 26:a361e3f42ba5 | 264 | result = OneWireMaster::Success; |
IanBenzMaxim | 26:a361e3f42ba5 | 265 | } |
IanBenzMaxim | 21:00c94aeb533e | 266 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 267 | } |
IanBenzMaxim | 21:00c94aeb533e | 268 | |
IanBenzMaxim | 21:00c94aeb533e | 269 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 270 | // Set the 1-Wire Net line level pull-up to normal. The DS2465 does only |
IanBenzMaxim | 21:00c94aeb533e | 271 | // allows enabling strong pull-up on a bit or byte event. Consequently this |
IanBenzMaxim | 21:00c94aeb533e | 272 | // function only allows the MODE_STANDARD argument. To enable strong pull-up |
IanBenzMaxim | 21:00c94aeb533e | 273 | // use OWWriteBytePower or OWReadBitPower. |
IanBenzMaxim | 21:00c94aeb533e | 274 | // |
IanBenzMaxim | 21:00c94aeb533e | 275 | // 'new_level' - new level defined as |
IanBenzMaxim | 21:00c94aeb533e | 276 | // MODE_STANDARD 0x00 |
IanBenzMaxim | 21:00c94aeb533e | 277 | // |
IanBenzMaxim | 21:00c94aeb533e | 278 | // Returns: current 1-Wire Net level |
IanBenzMaxim | 21:00c94aeb533e | 279 | // |
IanBenzMaxim | 32:bce180b544ed | 280 | OneWireMaster::CmdResult DS2465::OWSetLevel(OWLevel new_level) |
IanBenzMaxim | 21:00c94aeb533e | 281 | { |
IanBenzMaxim | 32:bce180b544ed | 282 | if (new_level == LEVEL_STRONG) |
IanBenzMaxim | 27:d5aaefa252f1 | 283 | return OneWireMaster::OperationFailure; |
IanBenzMaxim | 27:d5aaefa252f1 | 284 | |
IanBenzMaxim | 34:11fffbe98ef9 | 285 | return configureLevel(new_level); |
IanBenzMaxim | 21:00c94aeb533e | 286 | } |
IanBenzMaxim | 21:00c94aeb533e | 287 | |
IanBenzMaxim | 21:00c94aeb533e | 288 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 289 | // Set the 1-Wire Net communication speed. |
IanBenzMaxim | 21:00c94aeb533e | 290 | // |
IanBenzMaxim | 21:00c94aeb533e | 291 | // 'new_speed' - new speed defined as |
IanBenzMaxim | 21:00c94aeb533e | 292 | // MODE_STANDARD 0x00 |
IanBenzMaxim | 21:00c94aeb533e | 293 | // MODE_OVERDRIVE 0x01 |
IanBenzMaxim | 21:00c94aeb533e | 294 | // |
IanBenzMaxim | 21:00c94aeb533e | 295 | // Returns: current 1-Wire Net speed |
IanBenzMaxim | 21:00c94aeb533e | 296 | // |
IanBenzMaxim | 32:bce180b544ed | 297 | OneWireMaster::CmdResult DS2465::OWSetSpeed(OWSpeed new_speed) |
IanBenzMaxim | 21:00c94aeb533e | 298 | { |
IanBenzMaxim | 27:d5aaefa252f1 | 299 | // Requested speed is already set |
IanBenzMaxim | 27:d5aaefa252f1 | 300 | if (m_curConfig.c1WS == (new_speed == SPEED_OVERDRIVE)) |
IanBenzMaxim | 27:d5aaefa252f1 | 301 | return OneWireMaster::Success; |
IanBenzMaxim | 27:d5aaefa252f1 | 302 | |
IanBenzMaxim | 27:d5aaefa252f1 | 303 | // set the speed |
IanBenzMaxim | 35:5d23395628f6 | 304 | Config newConfig = m_curConfig; |
IanBenzMaxim | 35:5d23395628f6 | 305 | newConfig.c1WS = (new_speed == SPEED_OVERDRIVE); |
IanBenzMaxim | 21:00c94aeb533e | 306 | |
IanBenzMaxim | 27:d5aaefa252f1 | 307 | // write the new config |
IanBenzMaxim | 35:5d23395628f6 | 308 | return writeConfig(newConfig, true); |
IanBenzMaxim | 21:00c94aeb533e | 309 | } |
IanBenzMaxim | 21:00c94aeb533e | 310 | |
IanBenzMaxim | 21:00c94aeb533e | 311 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 312 | // Use the DS2465 help command '1-Wire triplet' to perform one bit of a 1-Wire |
IanBenzMaxim | 21:00c94aeb533e | 313 | // search. This command does two read bits and one write bit. The write bit |
IanBenzMaxim | 21:00c94aeb533e | 314 | // is either the default direction (all device have same bit) or in case of |
IanBenzMaxim | 21:00c94aeb533e | 315 | // a discripancy, the 'search_direction' parameter is used. |
IanBenzMaxim | 21:00c94aeb533e | 316 | // |
j3 | 22:686273e55cdc | 317 | // Returns � The DS2465 status byte result from the triplet command |
IanBenzMaxim | 21:00c94aeb533e | 318 | // |
IanBenzMaxim | 32:bce180b544ed | 319 | OneWireMaster::CmdResult DS2465::OWTriplet(SearchDirection & search_direction, std::uint8_t & sbr, std::uint8_t & tsb) |
IanBenzMaxim | 21:00c94aeb533e | 320 | { |
IanBenzMaxim | 21:00c94aeb533e | 321 | // 1-Wire Triplet (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 322 | // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 323 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 324 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 325 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 326 | // SS indicates byte containing search direction bit value in msbit |
IanBenzMaxim | 24:8942d8478d68 | 327 | |
IanBenzMaxim | 24:8942d8478d68 | 328 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 329 | std::uint8_t command[2] = { CMD_1WT, ((search_direction == DIRECTION_WRITE_ONE) ? 0x80 : 0x00) }; |
IanBenzMaxim | 34:11fffbe98ef9 | 330 | result = writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 24:8942d8478d68 | 331 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 32:bce180b544ed | 332 | { |
IanBenzMaxim | 32:bce180b544ed | 333 | std::uint8_t status; |
IanBenzMaxim | 34:11fffbe98ef9 | 334 | result = pollBusy(&status); |
IanBenzMaxim | 32:bce180b544ed | 335 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 32:bce180b544ed | 336 | { |
IanBenzMaxim | 32:bce180b544ed | 337 | // check bit results in status byte |
IanBenzMaxim | 32:bce180b544ed | 338 | sbr = ((status & STATUS_SBR) == STATUS_SBR); |
IanBenzMaxim | 32:bce180b544ed | 339 | tsb = ((status & STATUS_TSB) == STATUS_TSB); |
IanBenzMaxim | 32:bce180b544ed | 340 | search_direction = ((status & STATUS_DIR) == STATUS_DIR) ? DIRECTION_WRITE_ONE : DIRECTION_WRITE_ZERO; |
IanBenzMaxim | 32:bce180b544ed | 341 | } |
IanBenzMaxim | 32:bce180b544ed | 342 | } |
IanBenzMaxim | 24:8942d8478d68 | 343 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 344 | } |
IanBenzMaxim | 21:00c94aeb533e | 345 | |
IanBenzMaxim | 21:00c94aeb533e | 346 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 347 | // The 'OWReadBlock' receives a block of data from the |
IanBenzMaxim | 21:00c94aeb533e | 348 | // 1-Wire Net. The destination is the mac buffer (rx_mac=1) or |
IanBenzMaxim | 21:00c94aeb533e | 349 | // the scratchpad (rx_mac=0). The result is buffer is returned. |
IanBenzMaxim | 21:00c94aeb533e | 350 | // |
IanBenzMaxim | 21:00c94aeb533e | 351 | // 'rx_buf' - pointer to a block to receive bytes |
IanBenzMaxim | 21:00c94aeb533e | 352 | // of length 'rx_len' from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 353 | // 'rx_len' - length in bytes to read. Only valid numbers are 8,16,20,32; |
IanBenzMaxim | 21:00c94aeb533e | 354 | // |
IanBenzMaxim | 27:d5aaefa252f1 | 355 | OneWireMaster::CmdResult DS2465::OWReadBlock(std::uint8_t *rx_buf, std::uint8_t rx_len) |
IanBenzMaxim | 21:00c94aeb533e | 356 | { |
IanBenzMaxim | 21:00c94aeb533e | 357 | // 1-Wire Receive Block (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 358 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRF [A] PR [A] P |
IanBenzMaxim | 21:00c94aeb533e | 359 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 360 | // PR indicates byte containing parameter |
IanBenzMaxim | 21:00c94aeb533e | 361 | |
IanBenzMaxim | 24:8942d8478d68 | 362 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 363 | std::uint8_t command[2] = { CMD_1WRF, rx_len }; |
IanBenzMaxim | 24:8942d8478d68 | 364 | |
IanBenzMaxim | 34:11fffbe98ef9 | 365 | result = writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 24:8942d8478d68 | 366 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 367 | result = pollBusy(); |
IanBenzMaxim | 24:8942d8478d68 | 368 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 369 | result = readMemory(ADDR_SPAD, rx_buf, rx_len, false); |
IanBenzMaxim | 21:00c94aeb533e | 370 | |
IanBenzMaxim | 24:8942d8478d68 | 371 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 372 | } |
IanBenzMaxim | 21:00c94aeb533e | 373 | |
IanBenzMaxim | 21:00c94aeb533e | 374 | |
IanBenzMaxim | 21:00c94aeb533e | 375 | |
IanBenzMaxim | 21:00c94aeb533e | 376 | |
IanBenzMaxim | 27:d5aaefa252f1 | 377 | OneWireMaster::CmdResult DS2465::OWWriteBlock(const std::uint8_t *tran_buf, std::uint8_t tran_len) |
IanBenzMaxim | 21:00c94aeb533e | 378 | { |
IanBenzMaxim | 21:00c94aeb533e | 379 | return OWWriteBlock(false, tran_buf, tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 380 | } |
IanBenzMaxim | 21:00c94aeb533e | 381 | |
IanBenzMaxim | 21:00c94aeb533e | 382 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 383 | // The 'OWWriteBlock' transfers a block of data to the |
IanBenzMaxim | 21:00c94aeb533e | 384 | // 1-Wire Net. The mac buffer can be sent (tx_mac=1) or a |
IanBenzMaxim | 21:00c94aeb533e | 385 | // portion of the scratchpad can be sent. |
IanBenzMaxim | 21:00c94aeb533e | 386 | // |
IanBenzMaxim | 21:00c94aeb533e | 387 | // 'tx_mac' - flag to indicate if the MAC buffer is to be sent (1) or |
IanBenzMaxim | 21:00c94aeb533e | 388 | // the data provided in teh tran_buf is to be sent (0) |
IanBenzMaxim | 21:00c94aeb533e | 389 | // 'tran_buf' - pointer to a block of bytes |
IanBenzMaxim | 21:00c94aeb533e | 390 | // of length 'tran_len' that will be sent |
IanBenzMaxim | 21:00c94aeb533e | 391 | // to the 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 392 | // 'tran_len' - length in bytes to transfer. Only valid numbers are 8,16,20,32; |
IanBenzMaxim | 21:00c94aeb533e | 393 | // |
IanBenzMaxim | 27:d5aaefa252f1 | 394 | OneWireMaster::CmdResult DS2465::OWWriteBlock(bool tx_mac, const std::uint8_t *tran_buf, std::uint8_t tran_len) |
IanBenzMaxim | 21:00c94aeb533e | 395 | { |
IanBenzMaxim | 21:00c94aeb533e | 396 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 397 | std::uint8_t command[2] = { CMD_1WTB, (tx_mac ? 0xFF : tran_len) }; |
IanBenzMaxim | 21:00c94aeb533e | 398 | |
IanBenzMaxim | 24:8942d8478d68 | 399 | if (!tx_mac) |
IanBenzMaxim | 21:00c94aeb533e | 400 | { |
IanBenzMaxim | 21:00c94aeb533e | 401 | // prefill scratchpad with required data |
IanBenzMaxim | 34:11fffbe98ef9 | 402 | result = writeMemory(ADDR_SPAD, tran_buf, tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 403 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 404 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 405 | } |
IanBenzMaxim | 21:00c94aeb533e | 406 | |
IanBenzMaxim | 21:00c94aeb533e | 407 | // 1-Wire Transmit Block (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 408 | // S AD,0 [A] ADDR_CMD_REG [A] 1WTB [A] PR [A] P |
IanBenzMaxim | 21:00c94aeb533e | 409 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 410 | // PR indicates byte containing parameter |
IanBenzMaxim | 24:8942d8478d68 | 411 | |
IanBenzMaxim | 34:11fffbe98ef9 | 412 | result = writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 24:8942d8478d68 | 413 | |
IanBenzMaxim | 24:8942d8478d68 | 414 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 415 | result = pollBusy(); |
IanBenzMaxim | 21:00c94aeb533e | 416 | |
IanBenzMaxim | 24:8942d8478d68 | 417 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 418 | } |
IanBenzMaxim | 21:00c94aeb533e | 419 | |
IanBenzMaxim | 21:00c94aeb533e | 420 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 421 | // Send 8 bits of read communication to the 1-Wire Net and return the |
IanBenzMaxim | 21:00c94aeb533e | 422 | // result 8 bits read from the 1-Wire Net. |
IanBenzMaxim | 21:00c94aeb533e | 423 | // |
IanBenzMaxim | 21:00c94aeb533e | 424 | // Returns: 8 bits read from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 425 | // |
IanBenzMaxim | 32:bce180b544ed | 426 | OneWireMaster::CmdResult DS2465::OWReadByte(std::uint8_t & recvbyte, OWLevel after_level) |
IanBenzMaxim | 21:00c94aeb533e | 427 | { |
IanBenzMaxim | 24:8942d8478d68 | 428 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 429 | std::uint8_t buf; |
IanBenzMaxim | 21:00c94aeb533e | 430 | |
IanBenzMaxim | 24:8942d8478d68 | 431 | // 1-Wire Read Bytes (Case C) |
IanBenzMaxim | 24:8942d8478d68 | 432 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A |
IanBenzMaxim | 24:8942d8478d68 | 433 | // \--------/ |
IanBenzMaxim | 24:8942d8478d68 | 434 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 24:8942d8478d68 | 435 | // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P |
IanBenzMaxim | 24:8942d8478d68 | 436 | // |
IanBenzMaxim | 24:8942d8478d68 | 437 | // [] indicates from slave |
IanBenzMaxim | 24:8942d8478d68 | 438 | // DD data read |
IanBenzMaxim | 26:a361e3f42ba5 | 439 | |
IanBenzMaxim | 34:11fffbe98ef9 | 440 | result = configureLevel(after_level); |
IanBenzMaxim | 26:a361e3f42ba5 | 441 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 26:a361e3f42ba5 | 442 | return result; |
IanBenzMaxim | 24:8942d8478d68 | 443 | |
IanBenzMaxim | 24:8942d8478d68 | 444 | buf = CMD_1WRB; |
IanBenzMaxim | 34:11fffbe98ef9 | 445 | result = writeMemory(ADDR_CMD_REG, &buf, 1); |
IanBenzMaxim | 21:00c94aeb533e | 446 | |
IanBenzMaxim | 24:8942d8478d68 | 447 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 448 | result = pollBusy(); |
IanBenzMaxim | 24:8942d8478d68 | 449 | |
IanBenzMaxim | 24:8942d8478d68 | 450 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 451 | result = readMemory(ADDR_DATA_REG, &buf, 1); |
IanBenzMaxim | 21:00c94aeb533e | 452 | |
IanBenzMaxim | 24:8942d8478d68 | 453 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 24:8942d8478d68 | 454 | recvbyte = buf; |
IanBenzMaxim | 21:00c94aeb533e | 455 | |
IanBenzMaxim | 24:8942d8478d68 | 456 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 457 | } |
IanBenzMaxim | 21:00c94aeb533e | 458 | |
IanBenzMaxim | 21:00c94aeb533e | 459 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 460 | // Send 8 bits of communication to the 1-Wire Net and verify that the |
IanBenzMaxim | 21:00c94aeb533e | 461 | // 8 bits read from the 1-Wire Net is the same (write operation). |
IanBenzMaxim | 21:00c94aeb533e | 462 | // The parameter 'sendbyte' least significant 8 bits are used. |
IanBenzMaxim | 21:00c94aeb533e | 463 | // |
IanBenzMaxim | 21:00c94aeb533e | 464 | // 'sendbyte' - 8 bits to send (least significant byte) |
IanBenzMaxim | 21:00c94aeb533e | 465 | // |
IanBenzMaxim | 21:00c94aeb533e | 466 | // Returns: true: bytes written and echo was the same |
IanBenzMaxim | 21:00c94aeb533e | 467 | // false: echo was not the same |
IanBenzMaxim | 21:00c94aeb533e | 468 | // |
IanBenzMaxim | 32:bce180b544ed | 469 | OneWireMaster::CmdResult DS2465::OWWriteByte(std::uint8_t sendbyte, OWLevel after_level) |
IanBenzMaxim | 24:8942d8478d68 | 470 | { |
IanBenzMaxim | 21:00c94aeb533e | 471 | // 1-Wire Write Byte (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 472 | // S AD,0 [A] ADDR_CMD_REG [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 473 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 474 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 475 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 476 | // DD data to write |
IanBenzMaxim | 24:8942d8478d68 | 477 | |
IanBenzMaxim | 24:8942d8478d68 | 478 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 26:a361e3f42ba5 | 479 | |
IanBenzMaxim | 34:11fffbe98ef9 | 480 | result = configureLevel(after_level); |
IanBenzMaxim | 26:a361e3f42ba5 | 481 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 26:a361e3f42ba5 | 482 | return result; |
IanBenzMaxim | 26:a361e3f42ba5 | 483 | |
IanBenzMaxim | 27:d5aaefa252f1 | 484 | std::uint8_t command[2] = { CMD_1WWB, sendbyte }; |
IanBenzMaxim | 24:8942d8478d68 | 485 | |
IanBenzMaxim | 34:11fffbe98ef9 | 486 | result = writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 24:8942d8478d68 | 487 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 488 | result = pollBusy(); |
IanBenzMaxim | 21:00c94aeb533e | 489 | |
IanBenzMaxim | 24:8942d8478d68 | 490 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 491 | } |
IanBenzMaxim | 21:00c94aeb533e | 492 | |
IanBenzMaxim | 21:00c94aeb533e | 493 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 494 | // Send 1 bit of communication to the 1-Wire Net and return the |
IanBenzMaxim | 21:00c94aeb533e | 495 | // result 1 bit read from the 1-Wire Net. The parameter 'sendbit' |
IanBenzMaxim | 21:00c94aeb533e | 496 | // least significant bit is used and the least significant bit |
IanBenzMaxim | 21:00c94aeb533e | 497 | // of the result is the return bit. |
IanBenzMaxim | 21:00c94aeb533e | 498 | // |
IanBenzMaxim | 21:00c94aeb533e | 499 | // 'sendbit' - the least significant bit is the bit to send |
IanBenzMaxim | 21:00c94aeb533e | 500 | // |
IanBenzMaxim | 21:00c94aeb533e | 501 | // Returns: 0: 0 bit read from sendbit |
IanBenzMaxim | 21:00c94aeb533e | 502 | // 1: 1 bit read from sendbit |
IanBenzMaxim | 21:00c94aeb533e | 503 | // |
IanBenzMaxim | 32:bce180b544ed | 504 | OneWireMaster::CmdResult DS2465::OWTouchBit(std::uint8_t & sendrecvbit, OWLevel after_level) |
IanBenzMaxim | 21:00c94aeb533e | 505 | { |
IanBenzMaxim | 21:00c94aeb533e | 506 | // 1-Wire bit (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 507 | // S AD,0 [A] ADDR_CMD_REG [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 508 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 509 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 510 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 511 | // BB indicates byte containing bit value in msbit |
IanBenzMaxim | 21:00c94aeb533e | 512 | |
IanBenzMaxim | 24:8942d8478d68 | 513 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 26:a361e3f42ba5 | 514 | |
IanBenzMaxim | 34:11fffbe98ef9 | 515 | result = configureLevel(after_level); |
IanBenzMaxim | 26:a361e3f42ba5 | 516 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 26:a361e3f42ba5 | 517 | return result; |
IanBenzMaxim | 26:a361e3f42ba5 | 518 | |
IanBenzMaxim | 27:d5aaefa252f1 | 519 | std::uint8_t command[2] = { CMD_1WSB, (sendrecvbit ? 0x80 : 0x00) }; |
IanBenzMaxim | 27:d5aaefa252f1 | 520 | std::uint8_t status; |
IanBenzMaxim | 24:8942d8478d68 | 521 | |
IanBenzMaxim | 34:11fffbe98ef9 | 522 | result = writeMemory(ADDR_CMD_REG, command, 2); |
IanBenzMaxim | 21:00c94aeb533e | 523 | |
IanBenzMaxim | 24:8942d8478d68 | 524 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 525 | result = pollBusy(&status); |
IanBenzMaxim | 21:00c94aeb533e | 526 | |
IanBenzMaxim | 24:8942d8478d68 | 527 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 24:8942d8478d68 | 528 | sendrecvbit = (status & STATUS_SBR); |
IanBenzMaxim | 24:8942d8478d68 | 529 | |
IanBenzMaxim | 24:8942d8478d68 | 530 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 531 | } |
IanBenzMaxim | 21:00c94aeb533e | 532 | |
IanBenzMaxim | 21:00c94aeb533e | 533 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 534 | // Write to Scratchpad (SRAM) memory on the DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 535 | // |
IanBenzMaxim | 21:00c94aeb533e | 536 | // 'addr' - address to start writing (must be in SRAM) |
IanBenzMaxim | 21:00c94aeb533e | 537 | // 'buf' - buffer of data to write |
IanBenzMaxim | 21:00c94aeb533e | 538 | // 'len' - length to write |
IanBenzMaxim | 21:00c94aeb533e | 539 | // |
IanBenzMaxim | 21:00c94aeb533e | 540 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 541 | // false failure to complete write |
IanBenzMaxim | 21:00c94aeb533e | 542 | // |
IanBenzMaxim | 34:11fffbe98ef9 | 543 | OneWireMaster::CmdResult DS2465::cWriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) const |
IanBenzMaxim | 21:00c94aeb533e | 544 | { |
IanBenzMaxim | 21:00c94aeb533e | 545 | int i; |
IanBenzMaxim | 21:00c94aeb533e | 546 | |
IanBenzMaxim | 21:00c94aeb533e | 547 | // Write SRAM (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 548 | // S AD,0 [A] VSA [A] DD [A] P |
IanBenzMaxim | 21:00c94aeb533e | 549 | // \-----/ |
IanBenzMaxim | 21:00c94aeb533e | 550 | // Repeat for each data byte |
IanBenzMaxim | 21:00c94aeb533e | 551 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 552 | // VSA valid SRAM memory address |
IanBenzMaxim | 21:00c94aeb533e | 553 | // DD memory data to write |
IanBenzMaxim | 21:00c94aeb533e | 554 | |
IanBenzMaxim | 21:00c94aeb533e | 555 | m_I2C_interface.start(); |
IanBenzMaxim | 32:bce180b544ed | 556 | if (m_I2C_interface.write((m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 557 | { |
IanBenzMaxim | 21:00c94aeb533e | 558 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 559 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 560 | } |
IanBenzMaxim | 32:bce180b544ed | 561 | if (m_I2C_interface.write(addr) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 562 | { |
IanBenzMaxim | 21:00c94aeb533e | 563 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 564 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 565 | } |
IanBenzMaxim | 21:00c94aeb533e | 566 | // loop to write each byte |
IanBenzMaxim | 21:00c94aeb533e | 567 | for (i = 0; i < bufLen; i++) |
IanBenzMaxim | 21:00c94aeb533e | 568 | { |
IanBenzMaxim | 21:00c94aeb533e | 569 | if (m_I2C_interface.write(buf[i]) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 570 | { |
IanBenzMaxim | 21:00c94aeb533e | 571 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 572 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 573 | } |
IanBenzMaxim | 21:00c94aeb533e | 574 | } |
IanBenzMaxim | 21:00c94aeb533e | 575 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 576 | |
IanBenzMaxim | 21:00c94aeb533e | 577 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 578 | } |
IanBenzMaxim | 21:00c94aeb533e | 579 | |
IanBenzMaxim | 21:00c94aeb533e | 580 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 581 | // Read memory from the DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 582 | // |
IanBenzMaxim | 21:00c94aeb533e | 583 | // 'addr' - address to start reading |
IanBenzMaxim | 21:00c94aeb533e | 584 | // 'buf' - buffer to hold memory read |
IanBenzMaxim | 21:00c94aeb533e | 585 | // 'len' - length to read |
IanBenzMaxim | 34:11fffbe98ef9 | 586 | // 'skipSetPointer' - flag to indicate to skip setting address pointer |
IanBenzMaxim | 21:00c94aeb533e | 587 | // |
IanBenzMaxim | 21:00c94aeb533e | 588 | // Returns: true read successful |
IanBenzMaxim | 21:00c94aeb533e | 589 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 590 | // |
IanBenzMaxim | 34:11fffbe98ef9 | 591 | OneWireMaster::CmdResult DS2465::readMemory(std::uint8_t addr, std::uint8_t * buf, std::size_t bufLen, bool skipSetPointer) const |
IanBenzMaxim | 21:00c94aeb533e | 592 | { |
IanBenzMaxim | 21:00c94aeb533e | 593 | int i; |
IanBenzMaxim | 21:00c94aeb533e | 594 | |
IanBenzMaxim | 21:00c94aeb533e | 595 | // Read (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 596 | // S AD,0 [A] MA [A] Sr AD,1 [A] [DD] A [DD] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 597 | // \-----/ |
IanBenzMaxim | 21:00c94aeb533e | 598 | // Repeat for each data byte, NAK last byte |
IanBenzMaxim | 21:00c94aeb533e | 599 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 600 | // MA memory address |
IanBenzMaxim | 21:00c94aeb533e | 601 | // DD memory data read |
IanBenzMaxim | 21:00c94aeb533e | 602 | |
IanBenzMaxim | 21:00c94aeb533e | 603 | m_I2C_interface.start(); |
IanBenzMaxim | 34:11fffbe98ef9 | 604 | if (!skipSetPointer) |
IanBenzMaxim | 21:00c94aeb533e | 605 | { |
IanBenzMaxim | 32:bce180b544ed | 606 | if (m_I2C_interface.write((m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 607 | { |
IanBenzMaxim | 21:00c94aeb533e | 608 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 609 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 610 | } |
IanBenzMaxim | 32:bce180b544ed | 611 | if (m_I2C_interface.write(addr) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 612 | { |
IanBenzMaxim | 21:00c94aeb533e | 613 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 614 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 615 | } |
IanBenzMaxim | 21:00c94aeb533e | 616 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 617 | } |
IanBenzMaxim | 21:00c94aeb533e | 618 | |
IanBenzMaxim | 32:bce180b544ed | 619 | if (m_I2C_interface.write((m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 620 | { |
IanBenzMaxim | 21:00c94aeb533e | 621 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 622 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 623 | } |
IanBenzMaxim | 21:00c94aeb533e | 624 | // loop to read each byte, NAK last byte |
IanBenzMaxim | 21:00c94aeb533e | 625 | for (i = 0; i < bufLen; i++) |
IanBenzMaxim | 21:00c94aeb533e | 626 | { |
IanBenzMaxim | 21:00c94aeb533e | 627 | buf[i] = m_I2C_interface.read((i == (bufLen - 1)) ? m_I2C_interface.NoACK : m_I2C_interface.ACK); |
IanBenzMaxim | 21:00c94aeb533e | 628 | } |
IanBenzMaxim | 21:00c94aeb533e | 629 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 630 | |
IanBenzMaxim | 21:00c94aeb533e | 631 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 632 | } |
IanBenzMaxim | 21:00c94aeb533e | 633 | |
IanBenzMaxim | 21:00c94aeb533e | 634 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 635 | // Write the configuration register in the DS2465. The configuration |
IanBenzMaxim | 21:00c94aeb533e | 636 | // options are provided in the lower nibble of the provided config byte. |
IanBenzMaxim | 21:00c94aeb533e | 637 | // The uppper nibble in bitwise inverted when written to the DS2465. |
IanBenzMaxim | 21:00c94aeb533e | 638 | // |
IanBenzMaxim | 21:00c94aeb533e | 639 | // Returns: true: config written and response correct |
IanBenzMaxim | 21:00c94aeb533e | 640 | // false: response incorrect |
IanBenzMaxim | 21:00c94aeb533e | 641 | // |
IanBenzMaxim | 34:11fffbe98ef9 | 642 | OneWireMaster::CmdResult DS2465::writeConfig(const Config & config, bool verify) |
IanBenzMaxim | 21:00c94aeb533e | 643 | { |
IanBenzMaxim | 35:5d23395628f6 | 644 | std::uint8_t configBuf; |
IanBenzMaxim | 35:5d23395628f6 | 645 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 646 | |
IanBenzMaxim | 35:5d23395628f6 | 647 | configBuf = config.writeByte(); |
IanBenzMaxim | 35:5d23395628f6 | 648 | result = writeMemory(ADDR_WCFG_REG, &configBuf, 1); |
IanBenzMaxim | 35:5d23395628f6 | 649 | if (verify) |
IanBenzMaxim | 35:5d23395628f6 | 650 | { |
IanBenzMaxim | 35:5d23395628f6 | 651 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 35:5d23395628f6 | 652 | { |
IanBenzMaxim | 35:5d23395628f6 | 653 | result = readMemory(ADDR_WCFG_REG, &configBuf, 1); |
IanBenzMaxim | 35:5d23395628f6 | 654 | } |
IanBenzMaxim | 35:5d23395628f6 | 655 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 35:5d23395628f6 | 656 | { |
IanBenzMaxim | 35:5d23395628f6 | 657 | if (configBuf != config.readByte()) |
IanBenzMaxim | 35:5d23395628f6 | 658 | result = OneWireMaster::OperationFailure; |
IanBenzMaxim | 35:5d23395628f6 | 659 | } |
IanBenzMaxim | 35:5d23395628f6 | 660 | } |
IanBenzMaxim | 35:5d23395628f6 | 661 | |
IanBenzMaxim | 35:5d23395628f6 | 662 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 35:5d23395628f6 | 663 | m_curConfig = config; |
IanBenzMaxim | 35:5d23395628f6 | 664 | |
IanBenzMaxim | 35:5d23395628f6 | 665 | return result; |
IanBenzMaxim | 24:8942d8478d68 | 666 | } |
IanBenzMaxim | 24:8942d8478d68 | 667 | |
IanBenzMaxim | 24:8942d8478d68 | 668 | |
IanBenzMaxim | 24:8942d8478d68 | 669 | |
IanBenzMaxim | 34:11fffbe98ef9 | 670 | DS2465::Config DS2465::currentConfig() const |
IanBenzMaxim | 32:bce180b544ed | 671 | { |
IanBenzMaxim | 32:bce180b544ed | 672 | return m_curConfig; |
IanBenzMaxim | 32:bce180b544ed | 673 | } |
IanBenzMaxim | 32:bce180b544ed | 674 | |
IanBenzMaxim | 32:bce180b544ed | 675 | |
IanBenzMaxim | 32:bce180b544ed | 676 | |
IanBenzMaxim | 24:8942d8478d68 | 677 | |
IanBenzMaxim | 34:11fffbe98ef9 | 678 | OneWireMaster::CmdResult DS2465::pollBusy(std::uint8_t * pStatus) |
IanBenzMaxim | 24:8942d8478d68 | 679 | { |
IanBenzMaxim | 24:8942d8478d68 | 680 | const unsigned int pollLimit = 200; |
IanBenzMaxim | 24:8942d8478d68 | 681 | |
IanBenzMaxim | 24:8942d8478d68 | 682 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 683 | std::uint8_t status; |
IanBenzMaxim | 24:8942d8478d68 | 684 | unsigned int pollCount = 0; |
IanBenzMaxim | 24:8942d8478d68 | 685 | |
IanBenzMaxim | 24:8942d8478d68 | 686 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 24:8942d8478d68 | 687 | // abort if poll limit reached |
IanBenzMaxim | 24:8942d8478d68 | 688 | |
IanBenzMaxim | 24:8942d8478d68 | 689 | do |
IanBenzMaxim | 24:8942d8478d68 | 690 | { |
IanBenzMaxim | 34:11fffbe98ef9 | 691 | result = readMemory(ADDR_STATUS_REG, &status, 1, true); |
IanBenzMaxim | 24:8942d8478d68 | 692 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 24:8942d8478d68 | 693 | return result; |
IanBenzMaxim | 24:8942d8478d68 | 694 | if (pStatus != NULL) |
IanBenzMaxim | 24:8942d8478d68 | 695 | *pStatus = status; |
IanBenzMaxim | 24:8942d8478d68 | 696 | if (pollCount++ >= pollLimit) |
IanBenzMaxim | 24:8942d8478d68 | 697 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 24:8942d8478d68 | 698 | } while (status & STATUS_1WB); |
IanBenzMaxim | 24:8942d8478d68 | 699 | |
IanBenzMaxim | 21:00c94aeb533e | 700 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 701 | } |
IanBenzMaxim | 21:00c94aeb533e | 702 | |
IanBenzMaxim | 21:00c94aeb533e | 703 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 704 | // Reset all of the devices on the 1-Wire Net and return the result. |
IanBenzMaxim | 21:00c94aeb533e | 705 | // |
IanBenzMaxim | 21:00c94aeb533e | 706 | // Returns: true(1): presense pulse(s) detected, device(s) reset |
IanBenzMaxim | 21:00c94aeb533e | 707 | // false(0): no presense pulses detected |
IanBenzMaxim | 21:00c94aeb533e | 708 | // |
IanBenzMaxim | 21:00c94aeb533e | 709 | OneWireMaster::CmdResult DS2465::OWReset(void) |
IanBenzMaxim | 24:8942d8478d68 | 710 | { |
IanBenzMaxim | 24:8942d8478d68 | 711 | // 1-Wire reset (Case B) |
IanBenzMaxim | 24:8942d8478d68 | 712 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 24:8942d8478d68 | 713 | // \--------/ |
IanBenzMaxim | 24:8942d8478d68 | 714 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 24:8942d8478d68 | 715 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 716 | |
IanBenzMaxim | 24:8942d8478d68 | 717 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 718 | std::uint8_t buf; |
IanBenzMaxim | 21:00c94aeb533e | 719 | |
IanBenzMaxim | 24:8942d8478d68 | 720 | buf = CMD_1WRS; |
IanBenzMaxim | 34:11fffbe98ef9 | 721 | result = writeMemory(ADDR_CMD_REG, &buf, 1); |
IanBenzMaxim | 21:00c94aeb533e | 722 | |
IanBenzMaxim | 24:8942d8478d68 | 723 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 724 | result = pollBusy(&buf); |
IanBenzMaxim | 24:8942d8478d68 | 725 | |
IanBenzMaxim | 24:8942d8478d68 | 726 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 24:8942d8478d68 | 727 | { |
IanBenzMaxim | 24:8942d8478d68 | 728 | // check for presence detect |
IanBenzMaxim | 24:8942d8478d68 | 729 | if ((buf & STATUS_PPD) != STATUS_PPD) |
IanBenzMaxim | 24:8942d8478d68 | 730 | result = OneWireMaster::OperationFailure; |
IanBenzMaxim | 24:8942d8478d68 | 731 | } |
IanBenzMaxim | 21:00c94aeb533e | 732 | |
IanBenzMaxim | 24:8942d8478d68 | 733 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 734 | } |
IanBenzMaxim | 21:00c94aeb533e | 735 | |
IanBenzMaxim | 34:11fffbe98ef9 | 736 | OneWireMaster::CmdResult DS2465::reset(void) |
IanBenzMaxim | 24:8942d8478d68 | 737 | { |
IanBenzMaxim | 21:00c94aeb533e | 738 | // Device Reset |
IanBenzMaxim | 21:00c94aeb533e | 739 | // S AD,0 [A] ADDR_CMD_REG [A] 1WMR [A] Sr AD,1 [A] [SS] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 740 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 741 | // SS status byte to read to verify state |
IanBenzMaxim | 21:00c94aeb533e | 742 | |
IanBenzMaxim | 24:8942d8478d68 | 743 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 27:d5aaefa252f1 | 744 | std::uint8_t buf; |
IanBenzMaxim | 21:00c94aeb533e | 745 | |
IanBenzMaxim | 24:8942d8478d68 | 746 | buf = CMD_1WMR; |
IanBenzMaxim | 34:11fffbe98ef9 | 747 | result = writeMemory(ADDR_CMD_REG, &buf, 1); |
IanBenzMaxim | 21:00c94aeb533e | 748 | |
IanBenzMaxim | 24:8942d8478d68 | 749 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 34:11fffbe98ef9 | 750 | result = readMemory(ADDR_STATUS_REG, &buf, 1, true); |
IanBenzMaxim | 24:8942d8478d68 | 751 | |
IanBenzMaxim | 24:8942d8478d68 | 752 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 753 | { |
IanBenzMaxim | 24:8942d8478d68 | 754 | if ((buf & 0xF7) != 0x10) |
IanBenzMaxim | 24:8942d8478d68 | 755 | result = OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 756 | } |
IanBenzMaxim | 24:8942d8478d68 | 757 | |
IanBenzMaxim | 24:8942d8478d68 | 758 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 24:8942d8478d68 | 759 | OWReset(); // do a command to get 1-Wire master reset out of holding state |
IanBenzMaxim | 21:00c94aeb533e | 760 | |
IanBenzMaxim | 24:8942d8478d68 | 761 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 762 | } |
IanBenzMaxim | 21:00c94aeb533e | 763 | |
IanBenzMaxim | 34:11fffbe98ef9 | 764 | OneWireMaster::CmdResult DS2465::detect() |
IanBenzMaxim | 21:00c94aeb533e | 765 | { |
IanBenzMaxim | 21:00c94aeb533e | 766 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 767 | |
IanBenzMaxim | 21:00c94aeb533e | 768 | // reset DS2465 |
IanBenzMaxim | 34:11fffbe98ef9 | 769 | result = reset(); |
IanBenzMaxim | 21:00c94aeb533e | 770 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 771 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 772 | |
IanBenzMaxim | 35:5d23395628f6 | 773 | // write the default configuration setup |
IanBenzMaxim | 35:5d23395628f6 | 774 | Config defaultConfig; |
IanBenzMaxim | 35:5d23395628f6 | 775 | result = writeConfig(defaultConfig, true); |
IanBenzMaxim | 35:5d23395628f6 | 776 | return result; |
IanBenzMaxim | 35:5d23395628f6 | 777 | } |