Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Fri Mar 25 11:11:59 2016 -0500
Revision:
27:d5aaefa252f1
Parent:
26:a361e3f42ba5
Child:
32:bce180b544ed
Do not reconfigure DS2465 if requested speed or level is already set. Use forward declarations to speed up compilation.

Who changed what in which revision?

UserRevisionLine numberNew 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 // delays (if not polling for complete)
IanBenzMaxim 21:00c94aeb533e 39 #define EEPROM_WRITE_DELAY 30
IanBenzMaxim 21:00c94aeb533e 40 #define LOAD_SECRET_DELAY 90
IanBenzMaxim 21:00c94aeb533e 41 #define SHA_COMPUTATION_DELAY 5
IanBenzMaxim 21:00c94aeb533e 42
IanBenzMaxim 21:00c94aeb533e 43 static const int I2C_WRITE_OK = 0;
IanBenzMaxim 21:00c94aeb533e 44
IanBenzMaxim 24:8942d8478d68 45
IanBenzMaxim 24:8942d8478d68 46 std::uint8_t DS2465::Config::readByte() const
IanBenzMaxim 24:8942d8478d68 47 {
IanBenzMaxim 24:8942d8478d68 48 std::uint8_t config = 0;
IanBenzMaxim 24:8942d8478d68 49 if (c1WS)
IanBenzMaxim 24:8942d8478d68 50 config |= 0x08;
IanBenzMaxim 24:8942d8478d68 51 if (cSPU)
IanBenzMaxim 24:8942d8478d68 52 config |= 0x04;
IanBenzMaxim 24:8942d8478d68 53 if (cPDN)
IanBenzMaxim 24:8942d8478d68 54 config |= 0x02;
IanBenzMaxim 24:8942d8478d68 55 if (cAPU)
IanBenzMaxim 24:8942d8478d68 56 config |= 0x01;
IanBenzMaxim 24:8942d8478d68 57 return config;
IanBenzMaxim 24:8942d8478d68 58 }
IanBenzMaxim 24:8942d8478d68 59
IanBenzMaxim 24:8942d8478d68 60 std::uint8_t DS2465::Config::writeByte() const
IanBenzMaxim 24:8942d8478d68 61 {
IanBenzMaxim 24:8942d8478d68 62 std::uint8_t config = readByte();
IanBenzMaxim 24:8942d8478d68 63 return ((~config << 4) | config);
IanBenzMaxim 24:8942d8478d68 64 }
IanBenzMaxim 24:8942d8478d68 65
IanBenzMaxim 24:8942d8478d68 66 void DS2465::Config::reset()
IanBenzMaxim 24:8942d8478d68 67 {
IanBenzMaxim 24:8942d8478d68 68 c1WS = cSPU = cPDN = false;
IanBenzMaxim 24:8942d8478d68 69 cAPU = true;
IanBenzMaxim 24:8942d8478d68 70 }
IanBenzMaxim 24:8942d8478d68 71
IanBenzMaxim 24:8942d8478d68 72
IanBenzMaxim 24:8942d8478d68 73
IanBenzMaxim 24:8942d8478d68 74
IanBenzMaxim 21:00c94aeb533e 75 DS2465::DS2465(I2C & I2C_interface, unsigned char I2C_address)
IanBenzMaxim 21:00c94aeb533e 76 : m_I2C_interface(I2C_interface), m_I2C_address(I2C_address)
IanBenzMaxim 21:00c94aeb533e 77 {
IanBenzMaxim 21:00c94aeb533e 78
IanBenzMaxim 21:00c94aeb533e 79 }
IanBenzMaxim 21:00c94aeb533e 80
IanBenzMaxim 21:00c94aeb533e 81
IanBenzMaxim 21:00c94aeb533e 82
IanBenzMaxim 21:00c94aeb533e 83
IanBenzMaxim 21:00c94aeb533e 84 OneWireMaster::CmdResult DS2465::OWInitMaster()
IanBenzMaxim 21:00c94aeb533e 85 {
IanBenzMaxim 21:00c94aeb533e 86 return Detect();
IanBenzMaxim 21:00c94aeb533e 87 }
IanBenzMaxim 21:00c94aeb533e 88
IanBenzMaxim 21:00c94aeb533e 89
IanBenzMaxim 21:00c94aeb533e 90 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 91 // Compute Next Master Secret DS2465
IanBenzMaxim 21:00c94aeb533e 92 //
IanBenzMaxim 21:00c94aeb533e 93 // 'swap' - 1 if swapping a page into the computation
IanBenzMaxim 21:00c94aeb533e 94 // 'page' - page number to swap in
IanBenzMaxim 21:00c94aeb533e 95 // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page
IanBenzMaxim 21:00c94aeb533e 96 //
IanBenzMaxim 21:00c94aeb533e 97 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 98 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 99 //
IanBenzMaxim 21:00c94aeb533e 100 OneWireMaster::CmdResult DS2465::Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 101 {
IanBenzMaxim 27:d5aaefa252f1 102 std::uint8_t command[2] = { CMD_CNMS, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 24:8942d8478d68 103 return WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 104 }
IanBenzMaxim 21:00c94aeb533e 105
IanBenzMaxim 21:00c94aeb533e 106 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 107 // Compute Write MAC DS2465
IanBenzMaxim 21:00c94aeb533e 108 //
IanBenzMaxim 21:00c94aeb533e 109 // 'regwrite' - true if writing to a register, false if regular memory
IanBenzMaxim 21:00c94aeb533e 110 // 'swap' - true if swapping a page into the computation
IanBenzMaxim 21:00c94aeb533e 111 // 'page' - page number to swap in
IanBenzMaxim 21:00c94aeb533e 112 // 'segment' - segment number if swaping
IanBenzMaxim 21:00c94aeb533e 113 //
IanBenzMaxim 21:00c94aeb533e 114 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 115 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 116 //
IanBenzMaxim 21:00c94aeb533e 117 OneWireMaster::CmdResult DS2465::Compute_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const
IanBenzMaxim 21:00c94aeb533e 118 {
IanBenzMaxim 27:d5aaefa252f1 119 std::uint8_t command[2] = { CMD_CSWM, ((regwrite << 7) | (swap << 6) | (pageNum << 4) | segmentNum) };
IanBenzMaxim 24:8942d8478d68 120 return CWriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 121 }
IanBenzMaxim 21:00c94aeb533e 122
IanBenzMaxim 21:00c94aeb533e 123 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 124 // Compute Slave Authentication MAC DS2465
IanBenzMaxim 21:00c94aeb533e 125 //
IanBenzMaxim 21:00c94aeb533e 126 // 'swap' - true if swapping a page into the computation
IanBenzMaxim 21:00c94aeb533e 127 // 'page' - page number to swap in
IanBenzMaxim 21:00c94aeb533e 128 // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page
IanBenzMaxim 21:00c94aeb533e 129 //
IanBenzMaxim 21:00c94aeb533e 130 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 131 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 132 //
IanBenzMaxim 21:00c94aeb533e 133 OneWireMaster::CmdResult DS2465::Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const
IanBenzMaxim 21:00c94aeb533e 134 {
IanBenzMaxim 27:d5aaefa252f1 135 std::uint8_t command[2] = { CMD_CSAM, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 24:8942d8478d68 136 return CWriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 137 }
IanBenzMaxim 21:00c94aeb533e 138
IanBenzMaxim 21:00c94aeb533e 139 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 140 // Compute S-Secret on DS2465
IanBenzMaxim 21:00c94aeb533e 141 //
IanBenzMaxim 21:00c94aeb533e 142 // 'swap' - true if swapping a page into the computation
IanBenzMaxim 21:00c94aeb533e 143 // 'page' - page number to swap in
IanBenzMaxim 21:00c94aeb533e 144 // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page
IanBenzMaxim 21:00c94aeb533e 145 //
IanBenzMaxim 21:00c94aeb533e 146 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 147 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 148 //
IanBenzMaxim 21:00c94aeb533e 149 OneWireMaster::CmdResult DS2465::Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region)
IanBenzMaxim 21:00c94aeb533e 150 {
IanBenzMaxim 27:d5aaefa252f1 151 std::uint8_t command[2] = { CMD_CSS, (swap ? (0xC8 | (pageNum << 4) | region) : 0xBF) };
IanBenzMaxim 24:8942d8478d68 152 return WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 153 }
IanBenzMaxim 21:00c94aeb533e 154
IanBenzMaxim 21:00c94aeb533e 155
IanBenzMaxim 21:00c94aeb533e 156
IanBenzMaxim 21:00c94aeb533e 157
IanBenzMaxim 21:00c94aeb533e 158 ISha256MacCoprocessor::CmdResult DS2465::setMasterSecret(const std::uint8_t (&secret)[secret_len])
IanBenzMaxim 21:00c94aeb533e 159 {
IanBenzMaxim 21:00c94aeb533e 160 OneWireMaster::CmdResult result;
IanBenzMaxim 24:8942d8478d68 161 result = WriteMemory(ADDR_SPAD, secret, secret_len);
IanBenzMaxim 21:00c94aeb533e 162 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 163 result = CopyScratchpad(1, 0, 1, 0);
IanBenzMaxim 21:00c94aeb533e 164 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 165 wait_ms(8 * EEPROM_WRITE_DELAY);
IanBenzMaxim 21:00c94aeb533e 166 return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 167 }
IanBenzMaxim 21:00c94aeb533e 168
IanBenzMaxim 21:00c94aeb533e 169 ISha256MacCoprocessor::CmdResult DS2465::ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const
IanBenzMaxim 21:00c94aeb533e 170 {
IanBenzMaxim 21:00c94aeb533e 171 OneWireMaster::CmdResult result;
IanBenzMaxim 21:00c94aeb533e 172 // Write input data to scratchpad
IanBenzMaxim 24:8942d8478d68 173 result = WriteScratchpad(WriteMAC_data, WriteMAC_data_len);
IanBenzMaxim 21:00c94aeb533e 174 // Compute MAC
IanBenzMaxim 21:00c94aeb533e 175 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 176 result = Compute_WriteMAC(false, false, 0, 0);
IanBenzMaxim 21:00c94aeb533e 177 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 178 {
IanBenzMaxim 21:00c94aeb533e 179 wait_ms(SHA_COMPUTATION_DELAY);
IanBenzMaxim 21:00c94aeb533e 180 // Read MAC from register
IanBenzMaxim 21:00c94aeb533e 181 result = ReadMemory(ADDR_MAC_READ, mac, mac_len, true);
IanBenzMaxim 21:00c94aeb533e 182 }
IanBenzMaxim 21:00c94aeb533e 183 return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 184 }
IanBenzMaxim 21:00c94aeb533e 185
IanBenzMaxim 21:00c94aeb533e 186 ISha256MacCoprocessor::CmdResult DS2465::ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len],
IanBenzMaxim 21:00c94aeb533e 187 const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const
IanBenzMaxim 21:00c94aeb533e 188 {
IanBenzMaxim 21:00c94aeb533e 189 OneWireMaster::CmdResult result;
IanBenzMaxim 21:00c94aeb533e 190 int addr = ADDR_SPAD;
IanBenzMaxim 21:00c94aeb533e 191 // Write input data to scratchpad
IanBenzMaxim 24:8942d8478d68 192 result = CWriteMemory(addr, devicePage, devicePage_len);
IanBenzMaxim 21:00c94aeb533e 193 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 194 {
IanBenzMaxim 21:00c94aeb533e 195 addr += devicePage_len;
IanBenzMaxim 24:8942d8478d68 196 result = CWriteMemory(addr, challenge, deviceScratchpad_len);
IanBenzMaxim 21:00c94aeb533e 197 }
IanBenzMaxim 21:00c94aeb533e 198 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 199 {
IanBenzMaxim 21:00c94aeb533e 200 addr += deviceScratchpad_len;
IanBenzMaxim 24:8942d8478d68 201 result = CWriteMemory(addr, AuthMAC_data, AuthMAC_data_len);
IanBenzMaxim 21:00c94aeb533e 202 }
IanBenzMaxim 21:00c94aeb533e 203 // Compute MAC
IanBenzMaxim 21:00c94aeb533e 204 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 205 result = Compute_AuthMAC(false, 0, REGION_FULL_PAGE);
IanBenzMaxim 21:00c94aeb533e 206 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 207 {
IanBenzMaxim 21:00c94aeb533e 208 wait_ms(SHA_COMPUTATION_DELAY * 2);
IanBenzMaxim 21:00c94aeb533e 209 // Read MAC from register
IanBenzMaxim 21:00c94aeb533e 210 result = ReadMemory(ADDR_MAC_READ, mac, mac_len, true);
IanBenzMaxim 21:00c94aeb533e 211 }
IanBenzMaxim 21:00c94aeb533e 212 return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 213 }
IanBenzMaxim 21:00c94aeb533e 214
IanBenzMaxim 21:00c94aeb533e 215 ISha256MacCoprocessor::CmdResult DS2465::Compute_SSecret(const unsigned char (&devicePage)[devicePage_len], const unsigned char (&deviceScratchpad)[deviceScratchpad_len],
IanBenzMaxim 21:00c94aeb533e 216 const unsigned char (&SSecret_data)[SSecret_data_len])
IanBenzMaxim 21:00c94aeb533e 217 {
IanBenzMaxim 21:00c94aeb533e 218 OneWireMaster::CmdResult result;
IanBenzMaxim 21:00c94aeb533e 219 int addr = ADDR_SPAD;
IanBenzMaxim 21:00c94aeb533e 220 // Write input data to scratchpad
IanBenzMaxim 24:8942d8478d68 221 result = WriteMemory(addr, devicePage, devicePage_len);
IanBenzMaxim 21:00c94aeb533e 222 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 223 {
IanBenzMaxim 21:00c94aeb533e 224 addr += devicePage_len;
IanBenzMaxim 24:8942d8478d68 225 result = WriteMemory(addr, deviceScratchpad, deviceScratchpad_len);
IanBenzMaxim 21:00c94aeb533e 226 }
IanBenzMaxim 21:00c94aeb533e 227 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 228 {
IanBenzMaxim 21:00c94aeb533e 229 addr += deviceScratchpad_len;
IanBenzMaxim 24:8942d8478d68 230 result = WriteMemory(addr, SSecret_data, SSecret_data_len);
IanBenzMaxim 21:00c94aeb533e 231 }
IanBenzMaxim 21:00c94aeb533e 232 // Compute secret
IanBenzMaxim 21:00c94aeb533e 233 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 234 result = Compute_SSecret(false, 0, REGION_FULL_PAGE);
IanBenzMaxim 21:00c94aeb533e 235 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 236 wait_ms(SHA_COMPUTATION_DELAY * 2);
IanBenzMaxim 21:00c94aeb533e 237 return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure);
IanBenzMaxim 21:00c94aeb533e 238 }
IanBenzMaxim 21:00c94aeb533e 239
IanBenzMaxim 21:00c94aeb533e 240 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 241 // Copy Scratchpad on DS2465 to either secret or memory page
IanBenzMaxim 21:00c94aeb533e 242 //
IanBenzMaxim 21:00c94aeb533e 243 // 'dest_secret' - 1 if destination is secret, 0 if memory page
IanBenzMaxim 21:00c94aeb533e 244 // 'page' - page number if dest_secret=0
IanBenzMaxim 21:00c94aeb533e 245 // 'notfull' - 0 if only 4 byte segment, 1 if writing to full page,
IanBenzMaxim 21:00c94aeb533e 246 // 'seg' - Segment number if full=0.
IanBenzMaxim 21:00c94aeb533e 247 //
IanBenzMaxim 21:00c94aeb533e 248 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 249 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 250 //
IanBenzMaxim 21:00c94aeb533e 251 OneWireMaster::CmdResult DS2465::CopyScratchpad(bool dest_secret, unsigned int pageNum, bool notFull, unsigned int segmentNum)
IanBenzMaxim 21:00c94aeb533e 252 {
IanBenzMaxim 27:d5aaefa252f1 253 std::uint8_t command[2] = { CMD_CPS, (dest_secret ? 0 : (0x80 | (pageNum << 4) | (notFull << 3) | segmentNum)) };
IanBenzMaxim 24:8942d8478d68 254 return WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 255 }
IanBenzMaxim 21:00c94aeb533e 256
IanBenzMaxim 21:00c94aeb533e 257 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 258 // APU enable or disable
IanBenzMaxim 21:00c94aeb533e 259 //
IanBenzMaxim 21:00c94aeb533e 260 // 'readflag' - 1 if reading current configuration
IanBenzMaxim 21:00c94aeb533e 261 // 'apu_enable' - 1 to enable
IanBenzMaxim 21:00c94aeb533e 262 //
IanBenzMaxim 21:00c94aeb533e 263 // Returns: true if write successful, or return configuration value if reading
IanBenzMaxim 21:00c94aeb533e 264 //
IanBenzMaxim 21:00c94aeb533e 265 OneWireMaster::CmdResult DS2465::ConfigureAPU(bool apu_enable)
IanBenzMaxim 21:00c94aeb533e 266 {
IanBenzMaxim 26:a361e3f42ba5 267 OneWireMaster::CmdResult result;
IanBenzMaxim 26:a361e3f42ba5 268 if (m_curConfig.cAPU != apu_enable)
IanBenzMaxim 26:a361e3f42ba5 269 {
IanBenzMaxim 26:a361e3f42ba5 270 m_curConfig.cAPU = apu_enable;
IanBenzMaxim 26:a361e3f42ba5 271 result = WriteConfig(m_curConfig);
IanBenzMaxim 26:a361e3f42ba5 272 }
IanBenzMaxim 26:a361e3f42ba5 273 else
IanBenzMaxim 26:a361e3f42ba5 274 {
IanBenzMaxim 26:a361e3f42ba5 275 result = OneWireMaster::Success;
IanBenzMaxim 26:a361e3f42ba5 276 }
IanBenzMaxim 26:a361e3f42ba5 277 return result;
IanBenzMaxim 26:a361e3f42ba5 278 }
IanBenzMaxim 26:a361e3f42ba5 279
IanBenzMaxim 21:00c94aeb533e 280
IanBenzMaxim 26:a361e3f42ba5 281
IanBenzMaxim 26:a361e3f42ba5 282 OneWireMaster::CmdResult DS2465::ConfigureSPU(bool spu_enable)
IanBenzMaxim 26:a361e3f42ba5 283 {
IanBenzMaxim 26:a361e3f42ba5 284 OneWireMaster::CmdResult result;
IanBenzMaxim 26:a361e3f42ba5 285 if (m_curConfig.cSPU != spu_enable)
IanBenzMaxim 26:a361e3f42ba5 286 {
IanBenzMaxim 26:a361e3f42ba5 287 m_curConfig.cSPU = spu_enable;
IanBenzMaxim 26:a361e3f42ba5 288 result = WriteConfig(m_curConfig);
IanBenzMaxim 26:a361e3f42ba5 289 }
IanBenzMaxim 26:a361e3f42ba5 290 else
IanBenzMaxim 26:a361e3f42ba5 291 {
IanBenzMaxim 26:a361e3f42ba5 292 result = OneWireMaster::Success;
IanBenzMaxim 26:a361e3f42ba5 293 }
IanBenzMaxim 26:a361e3f42ba5 294 return result;
IanBenzMaxim 21:00c94aeb533e 295 }
IanBenzMaxim 21:00c94aeb533e 296
IanBenzMaxim 21:00c94aeb533e 297 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 298 // Power up 1-Wire using extended function
IanBenzMaxim 21:00c94aeb533e 299 //
IanBenzMaxim 21:00c94aeb533e 300 // Returns: true successful
IanBenzMaxim 21:00c94aeb533e 301 // false failure during communication
IanBenzMaxim 21:00c94aeb533e 302 //
IanBenzMaxim 26:a361e3f42ba5 303 OneWireMaster::CmdResult DS2465::ConfigurePowerDown(bool pdn_enable)
IanBenzMaxim 21:00c94aeb533e 304 {
IanBenzMaxim 21:00c94aeb533e 305 OneWireMaster::CmdResult result;
IanBenzMaxim 26:a361e3f42ba5 306 if (m_curConfig.cPDN != pdn_enable)
IanBenzMaxim 21:00c94aeb533e 307 {
IanBenzMaxim 26:a361e3f42ba5 308 m_curConfig.cPDN = pdn_enable;
IanBenzMaxim 26:a361e3f42ba5 309 result = WriteConfig(m_curConfig);
IanBenzMaxim 26:a361e3f42ba5 310 if (!pdn_enable)
IanBenzMaxim 26:a361e3f42ba5 311 wait_ms(2); // Delay 2ms to allow units to power up
IanBenzMaxim 21:00c94aeb533e 312 }
IanBenzMaxim 26:a361e3f42ba5 313 else
IanBenzMaxim 26:a361e3f42ba5 314 {
IanBenzMaxim 26:a361e3f42ba5 315 result = OneWireMaster::Success;
IanBenzMaxim 26:a361e3f42ba5 316 }
IanBenzMaxim 21:00c94aeb533e 317 return result;
IanBenzMaxim 21:00c94aeb533e 318 }
IanBenzMaxim 21:00c94aeb533e 319
IanBenzMaxim 21:00c94aeb533e 320 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 321 // Set the 1-Wire Net line level pull-up to normal. The DS2465 does only
IanBenzMaxim 21:00c94aeb533e 322 // allows enabling strong pull-up on a bit or byte event. Consequently this
IanBenzMaxim 21:00c94aeb533e 323 // function only allows the MODE_STANDARD argument. To enable strong pull-up
IanBenzMaxim 21:00c94aeb533e 324 // use OWWriteBytePower or OWReadBitPower.
IanBenzMaxim 21:00c94aeb533e 325 //
IanBenzMaxim 21:00c94aeb533e 326 // 'new_level' - new level defined as
IanBenzMaxim 21:00c94aeb533e 327 // MODE_STANDARD 0x00
IanBenzMaxim 21:00c94aeb533e 328 //
IanBenzMaxim 21:00c94aeb533e 329 // Returns: current 1-Wire Net level
IanBenzMaxim 21:00c94aeb533e 330 //
IanBenzMaxim 21:00c94aeb533e 331 OneWireMaster::CmdResult DS2465::OWLevel(OW_LEVEL new_level)
IanBenzMaxim 21:00c94aeb533e 332 {
IanBenzMaxim 27:d5aaefa252f1 333 // function only will turn back to non-strong pull-up
IanBenzMaxim 27:d5aaefa252f1 334 if (new_level != LEVEL_NORMAL)
IanBenzMaxim 27:d5aaefa252f1 335 return OneWireMaster::OperationFailure;
IanBenzMaxim 27:d5aaefa252f1 336
IanBenzMaxim 27:d5aaefa252f1 337 // Requested level is already set
IanBenzMaxim 27:d5aaefa252f1 338 if (!m_curConfig.cSPU)
IanBenzMaxim 27:d5aaefa252f1 339 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 340
IanBenzMaxim 27:d5aaefa252f1 341 // clear the strong pull-up bit in the global config state
IanBenzMaxim 27:d5aaefa252f1 342 m_curConfig.cSPU = false;
IanBenzMaxim 21:00c94aeb533e 343
IanBenzMaxim 27:d5aaefa252f1 344 // write the new config
IanBenzMaxim 27:d5aaefa252f1 345 return WriteConfig(m_curConfig);
IanBenzMaxim 21:00c94aeb533e 346 }
IanBenzMaxim 21:00c94aeb533e 347
IanBenzMaxim 21:00c94aeb533e 348 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 349 // Set the 1-Wire Net communication speed.
IanBenzMaxim 21:00c94aeb533e 350 //
IanBenzMaxim 21:00c94aeb533e 351 // 'new_speed' - new speed defined as
IanBenzMaxim 21:00c94aeb533e 352 // MODE_STANDARD 0x00
IanBenzMaxim 21:00c94aeb533e 353 // MODE_OVERDRIVE 0x01
IanBenzMaxim 21:00c94aeb533e 354 //
IanBenzMaxim 21:00c94aeb533e 355 // Returns: current 1-Wire Net speed
IanBenzMaxim 21:00c94aeb533e 356 //
IanBenzMaxim 21:00c94aeb533e 357 OneWireMaster::CmdResult DS2465::OWSpeed(OW_SPEED new_speed)
IanBenzMaxim 21:00c94aeb533e 358 {
IanBenzMaxim 27:d5aaefa252f1 359 // Requested speed is already set
IanBenzMaxim 27:d5aaefa252f1 360 if (m_curConfig.c1WS == (new_speed == SPEED_OVERDRIVE))
IanBenzMaxim 27:d5aaefa252f1 361 return OneWireMaster::Success;
IanBenzMaxim 27:d5aaefa252f1 362
IanBenzMaxim 27:d5aaefa252f1 363 // set the speed
IanBenzMaxim 27:d5aaefa252f1 364 m_curConfig.c1WS = (new_speed == SPEED_OVERDRIVE);
IanBenzMaxim 21:00c94aeb533e 365
IanBenzMaxim 27:d5aaefa252f1 366 // write the new config
IanBenzMaxim 27:d5aaefa252f1 367 return WriteConfig(m_curConfig);
IanBenzMaxim 21:00c94aeb533e 368 }
IanBenzMaxim 21:00c94aeb533e 369
IanBenzMaxim 21:00c94aeb533e 370 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 371 // Use the DS2465 help command '1-Wire triplet' to perform one bit of a 1-Wire
IanBenzMaxim 21:00c94aeb533e 372 // search. This command does two read bits and one write bit. The write bit
IanBenzMaxim 21:00c94aeb533e 373 // is either the default direction (all device have same bit) or in case of
IanBenzMaxim 21:00c94aeb533e 374 // a discripancy, the 'search_direction' parameter is used.
IanBenzMaxim 21:00c94aeb533e 375 //
j3 22:686273e55cdc 376 // Returns � The DS2465 status byte result from the triplet command
IanBenzMaxim 21:00c94aeb533e 377 //
IanBenzMaxim 27:d5aaefa252f1 378 OneWireMaster::CmdResult DS2465::Triplet(Direction search_direction, std::uint8_t & status)
IanBenzMaxim 21:00c94aeb533e 379 {
IanBenzMaxim 21:00c94aeb533e 380 // 1-Wire Triplet (Case B)
IanBenzMaxim 21:00c94aeb533e 381 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 21:00c94aeb533e 382 // \--------/
IanBenzMaxim 21:00c94aeb533e 383 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 21:00c94aeb533e 384 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 385 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 24:8942d8478d68 386
IanBenzMaxim 24:8942d8478d68 387 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 388 std::uint8_t command[2] = { CMD_1WT, ((search_direction == DIRECTION_WRITE_ONE) ? 0x80 : 0x00) };
IanBenzMaxim 24:8942d8478d68 389 result = WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 24:8942d8478d68 390 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 391 result = PollBusy(&status);
IanBenzMaxim 24:8942d8478d68 392 return result;
IanBenzMaxim 21:00c94aeb533e 393 }
IanBenzMaxim 21:00c94aeb533e 394
IanBenzMaxim 21:00c94aeb533e 395 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 396 // The 'OWSearch' function does a general search. This function
IanBenzMaxim 21:00c94aeb533e 397 // continues from the previos search state. The search state
IanBenzMaxim 21:00c94aeb533e 398 // can be reset by using the 'OWFirst' function.
IanBenzMaxim 21:00c94aeb533e 399 // This function contains one parameter 'alarm_only'.
IanBenzMaxim 21:00c94aeb533e 400 // When 'alarm_only' is true (1) the find alarm command
IanBenzMaxim 21:00c94aeb533e 401 // 0xEC is sent instead of the normal search command 0xF0.
IanBenzMaxim 21:00c94aeb533e 402 // Using the find alarm command 0xEC will limit the search to only
IanBenzMaxim 21:00c94aeb533e 403 // 1-Wire devices that are in an 'alarm' state.
IanBenzMaxim 21:00c94aeb533e 404 //
IanBenzMaxim 21:00c94aeb533e 405 // Returns: true (1) : when a 1-Wire device was found and it's
IanBenzMaxim 21:00c94aeb533e 406 // Serial Number placed in the global ROM
IanBenzMaxim 21:00c94aeb533e 407 // false (0): when no new device was found. Either the
IanBenzMaxim 21:00c94aeb533e 408 // last search was the last device or there
IanBenzMaxim 21:00c94aeb533e 409 // are no devices on the 1-Wire Net.
IanBenzMaxim 21:00c94aeb533e 410 //
IanBenzMaxim 21:00c94aeb533e 411 OneWireMaster::CmdResult DS2465::OWSearch(RomId & romId)
IanBenzMaxim 21:00c94aeb533e 412 {
IanBenzMaxim 21:00c94aeb533e 413 int id_bit_number;
IanBenzMaxim 21:00c94aeb533e 414 int last_zero, rom_byte_number;
IanBenzMaxim 21:00c94aeb533e 415 int id_bit, cmp_id_bit;
IanBenzMaxim 21:00c94aeb533e 416 unsigned char rom_byte_mask, status;
IanBenzMaxim 21:00c94aeb533e 417 bool search_result;
IanBenzMaxim 21:00c94aeb533e 418 unsigned char crc8 = 0;
IanBenzMaxim 21:00c94aeb533e 419 Direction search_direction;
IanBenzMaxim 21:00c94aeb533e 420
IanBenzMaxim 21:00c94aeb533e 421 // initialize for search
IanBenzMaxim 21:00c94aeb533e 422 id_bit_number = 1;
IanBenzMaxim 21:00c94aeb533e 423 last_zero = 0;
IanBenzMaxim 21:00c94aeb533e 424 rom_byte_number = 0;
IanBenzMaxim 21:00c94aeb533e 425 rom_byte_mask = 1;
IanBenzMaxim 21:00c94aeb533e 426 search_result = false;
IanBenzMaxim 21:00c94aeb533e 427
IanBenzMaxim 21:00c94aeb533e 428 // if the last call was not the last one
IanBenzMaxim 24:8942d8478d68 429 if (!_last_device_flag)
IanBenzMaxim 21:00c94aeb533e 430 {
IanBenzMaxim 21:00c94aeb533e 431 // 1-Wire reset
IanBenzMaxim 21:00c94aeb533e 432 OneWireMaster::CmdResult result = OWReset();
IanBenzMaxim 21:00c94aeb533e 433 if (result != OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 434 {
IanBenzMaxim 21:00c94aeb533e 435 // reset the search
IanBenzMaxim 24:8942d8478d68 436 _last_discrepancy = 0;
IanBenzMaxim 24:8942d8478d68 437 _last_device_flag = false;
IanBenzMaxim 24:8942d8478d68 438 _last_family_discrepancy = 0;
IanBenzMaxim 21:00c94aeb533e 439 return result;
IanBenzMaxim 21:00c94aeb533e 440 }
IanBenzMaxim 21:00c94aeb533e 441
IanBenzMaxim 21:00c94aeb533e 442 // issue the search command
IanBenzMaxim 26:a361e3f42ba5 443 OneWireMaster::OWWriteByte(0xF0);
IanBenzMaxim 21:00c94aeb533e 444
IanBenzMaxim 21:00c94aeb533e 445 // loop to do the search
IanBenzMaxim 21:00c94aeb533e 446 do
IanBenzMaxim 21:00c94aeb533e 447 {
IanBenzMaxim 21:00c94aeb533e 448 // if this discrepancy if before the Last Discrepancy
IanBenzMaxim 21:00c94aeb533e 449 // on a previous next then pick the same as last time
IanBenzMaxim 24:8942d8478d68 450 if (id_bit_number < _last_discrepancy)
IanBenzMaxim 21:00c94aeb533e 451 {
IanBenzMaxim 21:00c94aeb533e 452 if ((romId[rom_byte_number] & rom_byte_mask) > 0)
IanBenzMaxim 21:00c94aeb533e 453 search_direction = DIRECTION_WRITE_ONE;
IanBenzMaxim 21:00c94aeb533e 454 else
IanBenzMaxim 21:00c94aeb533e 455 search_direction = DIRECTION_WRITE_ZERO;
IanBenzMaxim 21:00c94aeb533e 456 }
IanBenzMaxim 21:00c94aeb533e 457 else
IanBenzMaxim 21:00c94aeb533e 458 {
IanBenzMaxim 21:00c94aeb533e 459 // if equal to last pick 1, if not then pick 0
IanBenzMaxim 24:8942d8478d68 460 if (id_bit_number == _last_discrepancy)
IanBenzMaxim 21:00c94aeb533e 461 search_direction = DIRECTION_WRITE_ONE;
IanBenzMaxim 21:00c94aeb533e 462 else
IanBenzMaxim 21:00c94aeb533e 463 search_direction = DIRECTION_WRITE_ZERO;
IanBenzMaxim 21:00c94aeb533e 464 }
IanBenzMaxim 21:00c94aeb533e 465
IanBenzMaxim 21:00c94aeb533e 466 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
IanBenzMaxim 21:00c94aeb533e 467 Triplet(search_direction, status);
IanBenzMaxim 21:00c94aeb533e 468
IanBenzMaxim 21:00c94aeb533e 469 // check bit results in status byte
IanBenzMaxim 21:00c94aeb533e 470 id_bit = ((status & STATUS_SBR) == STATUS_SBR);
IanBenzMaxim 21:00c94aeb533e 471 cmp_id_bit = ((status & STATUS_TSB) == STATUS_TSB);
IanBenzMaxim 21:00c94aeb533e 472 search_direction = ((status & STATUS_DIR) == STATUS_DIR) ? DIRECTION_WRITE_ONE : DIRECTION_WRITE_ZERO;
IanBenzMaxim 21:00c94aeb533e 473
IanBenzMaxim 21:00c94aeb533e 474 // check for no devices on 1-wire
IanBenzMaxim 21:00c94aeb533e 475 if ((id_bit) && (cmp_id_bit))
IanBenzMaxim 21:00c94aeb533e 476 break;
IanBenzMaxim 21:00c94aeb533e 477 else
IanBenzMaxim 21:00c94aeb533e 478 {
IanBenzMaxim 21:00c94aeb533e 479 if ((!id_bit) && (!cmp_id_bit) && (search_direction == DIRECTION_WRITE_ZERO))
IanBenzMaxim 21:00c94aeb533e 480 {
IanBenzMaxim 21:00c94aeb533e 481 last_zero = id_bit_number;
IanBenzMaxim 21:00c94aeb533e 482
IanBenzMaxim 21:00c94aeb533e 483 // check for Last discrepancy in family
IanBenzMaxim 21:00c94aeb533e 484 if (last_zero < 9)
IanBenzMaxim 24:8942d8478d68 485 _last_family_discrepancy = last_zero;
IanBenzMaxim 21:00c94aeb533e 486 }
IanBenzMaxim 21:00c94aeb533e 487
IanBenzMaxim 21:00c94aeb533e 488 // set or clear the bit in the ROM byte rom_byte_number
IanBenzMaxim 21:00c94aeb533e 489 // with mask rom_byte_mask
IanBenzMaxim 21:00c94aeb533e 490 if (search_direction == DIRECTION_WRITE_ONE)
IanBenzMaxim 21:00c94aeb533e 491 romId[rom_byte_number] |= rom_byte_mask;
IanBenzMaxim 21:00c94aeb533e 492 else
IanBenzMaxim 21:00c94aeb533e 493 romId[rom_byte_number] &= (unsigned char)~rom_byte_mask;
IanBenzMaxim 21:00c94aeb533e 494
IanBenzMaxim 21:00c94aeb533e 495 // increment the byte counter id_bit_number
IanBenzMaxim 21:00c94aeb533e 496 // and shift the mask rom_byte_mask
IanBenzMaxim 21:00c94aeb533e 497 id_bit_number++;
IanBenzMaxim 21:00c94aeb533e 498 rom_byte_mask <<= 1;
IanBenzMaxim 21:00c94aeb533e 499
IanBenzMaxim 21:00c94aeb533e 500 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
IanBenzMaxim 21:00c94aeb533e 501 if (rom_byte_mask == 0)
IanBenzMaxim 21:00c94aeb533e 502 {
IanBenzMaxim 21:00c94aeb533e 503 crc8 = RomId::calculateCRC8(crc8, romId[rom_byte_number]); // accumulate the CRC
IanBenzMaxim 21:00c94aeb533e 504 rom_byte_number++;
IanBenzMaxim 21:00c94aeb533e 505 rom_byte_mask = 1;
IanBenzMaxim 21:00c94aeb533e 506 }
IanBenzMaxim 21:00c94aeb533e 507 }
IanBenzMaxim 21:00c94aeb533e 508 }
IanBenzMaxim 21:00c94aeb533e 509 while(rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7
IanBenzMaxim 21:00c94aeb533e 510
IanBenzMaxim 21:00c94aeb533e 511 // if the search was successful then
IanBenzMaxim 21:00c94aeb533e 512 if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0)))
IanBenzMaxim 21:00c94aeb533e 513 {
IanBenzMaxim 24:8942d8478d68 514 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
IanBenzMaxim 24:8942d8478d68 515 _last_discrepancy = last_zero;
IanBenzMaxim 21:00c94aeb533e 516
IanBenzMaxim 21:00c94aeb533e 517 // check for last device
IanBenzMaxim 24:8942d8478d68 518 if (_last_discrepancy == 0)
IanBenzMaxim 24:8942d8478d68 519 _last_device_flag = true;
IanBenzMaxim 21:00c94aeb533e 520
IanBenzMaxim 21:00c94aeb533e 521 search_result = true;
IanBenzMaxim 21:00c94aeb533e 522 }
IanBenzMaxim 21:00c94aeb533e 523 }
IanBenzMaxim 21:00c94aeb533e 524
IanBenzMaxim 21:00c94aeb533e 525 // if no device found then reset counters so next 'search' will be like a first
IanBenzMaxim 21:00c94aeb533e 526 if (!search_result || (romId.familyCode() == 0))
IanBenzMaxim 21:00c94aeb533e 527 {
IanBenzMaxim 24:8942d8478d68 528 _last_discrepancy = 0;
IanBenzMaxim 24:8942d8478d68 529 _last_device_flag = false;
IanBenzMaxim 24:8942d8478d68 530 _last_family_discrepancy = 0;
IanBenzMaxim 21:00c94aeb533e 531 search_result = false;
IanBenzMaxim 21:00c94aeb533e 532 }
IanBenzMaxim 21:00c94aeb533e 533
IanBenzMaxim 21:00c94aeb533e 534 return search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure;
IanBenzMaxim 21:00c94aeb533e 535 }
IanBenzMaxim 21:00c94aeb533e 536
IanBenzMaxim 21:00c94aeb533e 537 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 538 // The 'OWReadBlock' receives a block of data from the
IanBenzMaxim 21:00c94aeb533e 539 // 1-Wire Net. The destination is the mac buffer (rx_mac=1) or
IanBenzMaxim 21:00c94aeb533e 540 // the scratchpad (rx_mac=0). The result is buffer is returned.
IanBenzMaxim 21:00c94aeb533e 541 //
IanBenzMaxim 21:00c94aeb533e 542 // 'rx_buf' - pointer to a block to receive bytes
IanBenzMaxim 21:00c94aeb533e 543 // of length 'rx_len' from 1-Wire Net
IanBenzMaxim 21:00c94aeb533e 544 // 'rx_len' - length in bytes to read. Only valid numbers are 8,16,20,32;
IanBenzMaxim 21:00c94aeb533e 545 //
IanBenzMaxim 27:d5aaefa252f1 546 OneWireMaster::CmdResult DS2465::OWReadBlock(std::uint8_t *rx_buf, std::uint8_t rx_len)
IanBenzMaxim 21:00c94aeb533e 547 {
IanBenzMaxim 21:00c94aeb533e 548 // 1-Wire Receive Block (Case A)
IanBenzMaxim 21:00c94aeb533e 549 // S AD,0 [A] ADDR_CMD_REG [A] 1WRF [A] PR [A] P
IanBenzMaxim 21:00c94aeb533e 550 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 551 // PR indicates byte containing parameter
IanBenzMaxim 21:00c94aeb533e 552
IanBenzMaxim 24:8942d8478d68 553 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 554 std::uint8_t command[2] = { CMD_1WRF, rx_len };
IanBenzMaxim 24:8942d8478d68 555
IanBenzMaxim 24:8942d8478d68 556 result = WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 24:8942d8478d68 557 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 558 result = PollBusy();
IanBenzMaxim 24:8942d8478d68 559 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 560 result = ReadMemory(ADDR_SPAD, rx_buf, rx_len, false);
IanBenzMaxim 21:00c94aeb533e 561
IanBenzMaxim 24:8942d8478d68 562 return result;
IanBenzMaxim 21:00c94aeb533e 563 }
IanBenzMaxim 21:00c94aeb533e 564
IanBenzMaxim 21:00c94aeb533e 565
IanBenzMaxim 21:00c94aeb533e 566
IanBenzMaxim 21:00c94aeb533e 567
IanBenzMaxim 27:d5aaefa252f1 568 OneWireMaster::CmdResult DS2465::OWWriteBlock(const std::uint8_t *tran_buf, std::uint8_t tran_len)
IanBenzMaxim 21:00c94aeb533e 569 {
IanBenzMaxim 21:00c94aeb533e 570 return OWWriteBlock(false, tran_buf, tran_len);
IanBenzMaxim 21:00c94aeb533e 571 }
IanBenzMaxim 21:00c94aeb533e 572
IanBenzMaxim 21:00c94aeb533e 573 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 574 // The 'OWWriteBlock' transfers a block of data to the
IanBenzMaxim 21:00c94aeb533e 575 // 1-Wire Net. The mac buffer can be sent (tx_mac=1) or a
IanBenzMaxim 21:00c94aeb533e 576 // portion of the scratchpad can be sent.
IanBenzMaxim 21:00c94aeb533e 577 //
IanBenzMaxim 21:00c94aeb533e 578 // 'tx_mac' - flag to indicate if the MAC buffer is to be sent (1) or
IanBenzMaxim 21:00c94aeb533e 579 // the data provided in teh tran_buf is to be sent (0)
IanBenzMaxim 21:00c94aeb533e 580 // 'tran_buf' - pointer to a block of bytes
IanBenzMaxim 21:00c94aeb533e 581 // of length 'tran_len' that will be sent
IanBenzMaxim 21:00c94aeb533e 582 // to the 1-Wire Net
IanBenzMaxim 21:00c94aeb533e 583 // 'tran_len' - length in bytes to transfer. Only valid numbers are 8,16,20,32;
IanBenzMaxim 21:00c94aeb533e 584 //
IanBenzMaxim 27:d5aaefa252f1 585 OneWireMaster::CmdResult DS2465::OWWriteBlock(bool tx_mac, const std::uint8_t *tran_buf, std::uint8_t tran_len)
IanBenzMaxim 21:00c94aeb533e 586 {
IanBenzMaxim 21:00c94aeb533e 587 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 588 std::uint8_t command[2] = { CMD_1WTB, (tx_mac ? 0xFF : tran_len) };
IanBenzMaxim 21:00c94aeb533e 589
IanBenzMaxim 24:8942d8478d68 590 if (!tx_mac)
IanBenzMaxim 21:00c94aeb533e 591 {
IanBenzMaxim 21:00c94aeb533e 592 // prefill scratchpad with required data
IanBenzMaxim 24:8942d8478d68 593 result = WriteMemory(ADDR_SPAD, tran_buf, tran_len);
IanBenzMaxim 21:00c94aeb533e 594 if (result != OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 595 return result;
IanBenzMaxim 21:00c94aeb533e 596 }
IanBenzMaxim 21:00c94aeb533e 597
IanBenzMaxim 21:00c94aeb533e 598 // 1-Wire Transmit Block (Case A)
IanBenzMaxim 21:00c94aeb533e 599 // S AD,0 [A] ADDR_CMD_REG [A] 1WTB [A] PR [A] P
IanBenzMaxim 21:00c94aeb533e 600 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 601 // PR indicates byte containing parameter
IanBenzMaxim 24:8942d8478d68 602
IanBenzMaxim 24:8942d8478d68 603 result = WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 24:8942d8478d68 604
IanBenzMaxim 24:8942d8478d68 605 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 606 result = PollBusy();
IanBenzMaxim 21:00c94aeb533e 607
IanBenzMaxim 24:8942d8478d68 608 return result;
IanBenzMaxim 21:00c94aeb533e 609 }
IanBenzMaxim 21:00c94aeb533e 610
IanBenzMaxim 21:00c94aeb533e 611 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 612 // Send 8 bits of read communication to the 1-Wire Net and return the
IanBenzMaxim 21:00c94aeb533e 613 // result 8 bits read from the 1-Wire Net.
IanBenzMaxim 21:00c94aeb533e 614 //
IanBenzMaxim 21:00c94aeb533e 615 // Returns: 8 bits read from 1-Wire Net
IanBenzMaxim 21:00c94aeb533e 616 //
IanBenzMaxim 27:d5aaefa252f1 617 OneWireMaster::CmdResult DS2465::OWReadByte(std::uint8_t & recvbyte, OW_LEVEL after_level)
IanBenzMaxim 21:00c94aeb533e 618 {
IanBenzMaxim 24:8942d8478d68 619 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 620 std::uint8_t buf;
IanBenzMaxim 21:00c94aeb533e 621
IanBenzMaxim 24:8942d8478d68 622 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 24:8942d8478d68 623 // S AD,0 [A] ADDR_CMD_REG [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A
IanBenzMaxim 24:8942d8478d68 624 // \--------/
IanBenzMaxim 24:8942d8478d68 625 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 24:8942d8478d68 626 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 24:8942d8478d68 627 //
IanBenzMaxim 24:8942d8478d68 628 // [] indicates from slave
IanBenzMaxim 24:8942d8478d68 629 // DD data read
IanBenzMaxim 26:a361e3f42ba5 630
IanBenzMaxim 26:a361e3f42ba5 631 result = ConfigureSPU(after_level == LEVEL_STRONG);
IanBenzMaxim 26:a361e3f42ba5 632 if (result != OneWireMaster::Success)
IanBenzMaxim 26:a361e3f42ba5 633 return result;
IanBenzMaxim 24:8942d8478d68 634
IanBenzMaxim 24:8942d8478d68 635 buf = CMD_1WRB;
IanBenzMaxim 24:8942d8478d68 636 result = WriteMemory(ADDR_CMD_REG, &buf, 1);
IanBenzMaxim 21:00c94aeb533e 637
IanBenzMaxim 24:8942d8478d68 638 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 639 result = PollBusy();
IanBenzMaxim 24:8942d8478d68 640
IanBenzMaxim 24:8942d8478d68 641 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 642 result = ReadMemory(ADDR_DATA_REG, &buf, 1);
IanBenzMaxim 21:00c94aeb533e 643
IanBenzMaxim 24:8942d8478d68 644 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 645 recvbyte = buf;
IanBenzMaxim 21:00c94aeb533e 646
IanBenzMaxim 24:8942d8478d68 647 return result;
IanBenzMaxim 21:00c94aeb533e 648 }
IanBenzMaxim 21:00c94aeb533e 649
IanBenzMaxim 21:00c94aeb533e 650 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 651 // Send 8 bits of communication to the 1-Wire Net and verify that the
IanBenzMaxim 21:00c94aeb533e 652 // 8 bits read from the 1-Wire Net is the same (write operation).
IanBenzMaxim 21:00c94aeb533e 653 // The parameter 'sendbyte' least significant 8 bits are used.
IanBenzMaxim 21:00c94aeb533e 654 //
IanBenzMaxim 21:00c94aeb533e 655 // 'sendbyte' - 8 bits to send (least significant byte)
IanBenzMaxim 21:00c94aeb533e 656 //
IanBenzMaxim 21:00c94aeb533e 657 // Returns: true: bytes written and echo was the same
IanBenzMaxim 21:00c94aeb533e 658 // false: echo was not the same
IanBenzMaxim 21:00c94aeb533e 659 //
IanBenzMaxim 27:d5aaefa252f1 660 OneWireMaster::CmdResult DS2465::OWWriteByte(std::uint8_t sendbyte, OW_LEVEL after_level)
IanBenzMaxim 24:8942d8478d68 661 {
IanBenzMaxim 21:00c94aeb533e 662 // 1-Wire Write Byte (Case B)
IanBenzMaxim 21:00c94aeb533e 663 // S AD,0 [A] ADDR_CMD_REG [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 21:00c94aeb533e 664 // \--------/
IanBenzMaxim 21:00c94aeb533e 665 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 21:00c94aeb533e 666 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 667 // DD data to write
IanBenzMaxim 24:8942d8478d68 668
IanBenzMaxim 24:8942d8478d68 669 OneWireMaster::CmdResult result;
IanBenzMaxim 26:a361e3f42ba5 670
IanBenzMaxim 26:a361e3f42ba5 671 result = ConfigureSPU(after_level == LEVEL_STRONG);
IanBenzMaxim 26:a361e3f42ba5 672 if (result != OneWireMaster::Success)
IanBenzMaxim 26:a361e3f42ba5 673 return result;
IanBenzMaxim 26:a361e3f42ba5 674
IanBenzMaxim 27:d5aaefa252f1 675 std::uint8_t command[2] = { CMD_1WWB, sendbyte };
IanBenzMaxim 24:8942d8478d68 676
IanBenzMaxim 24:8942d8478d68 677 result = WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 24:8942d8478d68 678 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 679 result = PollBusy();
IanBenzMaxim 21:00c94aeb533e 680
IanBenzMaxim 24:8942d8478d68 681 return result;
IanBenzMaxim 21:00c94aeb533e 682 }
IanBenzMaxim 21:00c94aeb533e 683
IanBenzMaxim 21:00c94aeb533e 684 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 685 // Send 1 bit of communication to the 1-Wire Net and return the
IanBenzMaxim 21:00c94aeb533e 686 // result 1 bit read from the 1-Wire Net. The parameter 'sendbit'
IanBenzMaxim 21:00c94aeb533e 687 // least significant bit is used and the least significant bit
IanBenzMaxim 21:00c94aeb533e 688 // of the result is the return bit.
IanBenzMaxim 21:00c94aeb533e 689 //
IanBenzMaxim 21:00c94aeb533e 690 // 'sendbit' - the least significant bit is the bit to send
IanBenzMaxim 21:00c94aeb533e 691 //
IanBenzMaxim 21:00c94aeb533e 692 // Returns: 0: 0 bit read from sendbit
IanBenzMaxim 21:00c94aeb533e 693 // 1: 1 bit read from sendbit
IanBenzMaxim 21:00c94aeb533e 694 //
IanBenzMaxim 27:d5aaefa252f1 695 OneWireMaster::CmdResult DS2465::OWTouchBit(std::uint8_t & sendrecvbit, OW_LEVEL after_level)
IanBenzMaxim 21:00c94aeb533e 696 {
IanBenzMaxim 21:00c94aeb533e 697 // 1-Wire bit (Case B)
IanBenzMaxim 21:00c94aeb533e 698 // S AD,0 [A] ADDR_CMD_REG [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 21:00c94aeb533e 699 // \--------/
IanBenzMaxim 21:00c94aeb533e 700 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 21:00c94aeb533e 701 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 702 // BB indicates byte containing bit value in msbit
IanBenzMaxim 21:00c94aeb533e 703
IanBenzMaxim 24:8942d8478d68 704 OneWireMaster::CmdResult result;
IanBenzMaxim 26:a361e3f42ba5 705
IanBenzMaxim 26:a361e3f42ba5 706 result = ConfigureSPU(after_level == LEVEL_STRONG);
IanBenzMaxim 26:a361e3f42ba5 707 if (result != OneWireMaster::Success)
IanBenzMaxim 26:a361e3f42ba5 708 return result;
IanBenzMaxim 26:a361e3f42ba5 709
IanBenzMaxim 27:d5aaefa252f1 710 std::uint8_t command[2] = { CMD_1WSB, (sendrecvbit ? 0x80 : 0x00) };
IanBenzMaxim 27:d5aaefa252f1 711 std::uint8_t status;
IanBenzMaxim 24:8942d8478d68 712
IanBenzMaxim 24:8942d8478d68 713 result = WriteMemory(ADDR_CMD_REG, command, 2);
IanBenzMaxim 21:00c94aeb533e 714
IanBenzMaxim 24:8942d8478d68 715 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 716 result = PollBusy(&status);
IanBenzMaxim 21:00c94aeb533e 717
IanBenzMaxim 24:8942d8478d68 718 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 719 sendrecvbit = (status & STATUS_SBR);
IanBenzMaxim 24:8942d8478d68 720
IanBenzMaxim 24:8942d8478d68 721 return result;
IanBenzMaxim 21:00c94aeb533e 722 }
IanBenzMaxim 21:00c94aeb533e 723
IanBenzMaxim 21:00c94aeb533e 724 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 725 // Write to Scratchpad (SRAM) memory on the DS2465
IanBenzMaxim 21:00c94aeb533e 726 //
IanBenzMaxim 21:00c94aeb533e 727 // 'addr' - address to start writing (must be in SRAM)
IanBenzMaxim 21:00c94aeb533e 728 // 'buf' - buffer of data to write
IanBenzMaxim 21:00c94aeb533e 729 // 'len' - length to write
IanBenzMaxim 21:00c94aeb533e 730 //
IanBenzMaxim 21:00c94aeb533e 731 // Returns: true write successful
IanBenzMaxim 21:00c94aeb533e 732 // false failure to complete write
IanBenzMaxim 21:00c94aeb533e 733 //
IanBenzMaxim 27:d5aaefa252f1 734 OneWireMaster::CmdResult DS2465::CWriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) const
IanBenzMaxim 21:00c94aeb533e 735 {
IanBenzMaxim 21:00c94aeb533e 736 int i;
IanBenzMaxim 21:00c94aeb533e 737
IanBenzMaxim 21:00c94aeb533e 738 // Write SRAM (Case A)
IanBenzMaxim 21:00c94aeb533e 739 // S AD,0 [A] VSA [A] DD [A] P
IanBenzMaxim 21:00c94aeb533e 740 // \-----/
IanBenzMaxim 21:00c94aeb533e 741 // Repeat for each data byte
IanBenzMaxim 21:00c94aeb533e 742 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 743 // VSA valid SRAM memory address
IanBenzMaxim 21:00c94aeb533e 744 // DD memory data to write
IanBenzMaxim 21:00c94aeb533e 745
IanBenzMaxim 21:00c94aeb533e 746 m_I2C_interface.start();
IanBenzMaxim 21:00c94aeb533e 747 if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 748 {
IanBenzMaxim 21:00c94aeb533e 749 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 750 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 751 }
IanBenzMaxim 21:00c94aeb533e 752 if (m_I2C_interface.write((unsigned char)addr) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 753 {
IanBenzMaxim 21:00c94aeb533e 754 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 755 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 756 }
IanBenzMaxim 21:00c94aeb533e 757 // loop to write each byte
IanBenzMaxim 21:00c94aeb533e 758 for (i = 0; i < bufLen; i++)
IanBenzMaxim 21:00c94aeb533e 759 {
IanBenzMaxim 21:00c94aeb533e 760 if (m_I2C_interface.write(buf[i]) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 761 {
IanBenzMaxim 21:00c94aeb533e 762 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 763 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 764 }
IanBenzMaxim 21:00c94aeb533e 765 }
IanBenzMaxim 21:00c94aeb533e 766 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 767
IanBenzMaxim 21:00c94aeb533e 768 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 769 }
IanBenzMaxim 21:00c94aeb533e 770
IanBenzMaxim 21:00c94aeb533e 771 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 772 // Read memory from the DS2465
IanBenzMaxim 21:00c94aeb533e 773 //
IanBenzMaxim 21:00c94aeb533e 774 // 'addr' - address to start reading
IanBenzMaxim 21:00c94aeb533e 775 // 'buf' - buffer to hold memory read
IanBenzMaxim 21:00c94aeb533e 776 // 'len' - length to read
IanBenzMaxim 21:00c94aeb533e 777 // 'skip_set_pointer' - flag to indicate to skip setting address pointer
IanBenzMaxim 21:00c94aeb533e 778 //
IanBenzMaxim 21:00c94aeb533e 779 // Returns: true read successful
IanBenzMaxim 21:00c94aeb533e 780 // false failure to complete read
IanBenzMaxim 21:00c94aeb533e 781 //
IanBenzMaxim 27:d5aaefa252f1 782 OneWireMaster::CmdResult DS2465::ReadMemory(std::uint8_t addr, std::uint8_t * buf, std::size_t bufLen, bool skip_set_pointer) const
IanBenzMaxim 21:00c94aeb533e 783 {
IanBenzMaxim 21:00c94aeb533e 784 int i;
IanBenzMaxim 21:00c94aeb533e 785
IanBenzMaxim 21:00c94aeb533e 786 // Read (Case A)
IanBenzMaxim 21:00c94aeb533e 787 // S AD,0 [A] MA [A] Sr AD,1 [A] [DD] A [DD] A\ P
IanBenzMaxim 21:00c94aeb533e 788 // \-----/
IanBenzMaxim 21:00c94aeb533e 789 // Repeat for each data byte, NAK last byte
IanBenzMaxim 21:00c94aeb533e 790 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 791 // MA memory address
IanBenzMaxim 21:00c94aeb533e 792 // DD memory data read
IanBenzMaxim 21:00c94aeb533e 793
IanBenzMaxim 21:00c94aeb533e 794 m_I2C_interface.start();
IanBenzMaxim 21:00c94aeb533e 795 if (!skip_set_pointer)
IanBenzMaxim 21:00c94aeb533e 796 {
IanBenzMaxim 21:00c94aeb533e 797 if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 798 {
IanBenzMaxim 21:00c94aeb533e 799 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 800 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 801 }
IanBenzMaxim 21:00c94aeb533e 802 if (m_I2C_interface.write((unsigned char)addr) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 803 {
IanBenzMaxim 21:00c94aeb533e 804 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 805 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 806 }
IanBenzMaxim 21:00c94aeb533e 807 m_I2C_interface.start();
IanBenzMaxim 21:00c94aeb533e 808 }
IanBenzMaxim 21:00c94aeb533e 809
IanBenzMaxim 21:00c94aeb533e 810 if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK)
IanBenzMaxim 21:00c94aeb533e 811 {
IanBenzMaxim 21:00c94aeb533e 812 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 813 return OneWireMaster::CommunicationWriteError;
IanBenzMaxim 21:00c94aeb533e 814 }
IanBenzMaxim 21:00c94aeb533e 815 // loop to read each byte, NAK last byte
IanBenzMaxim 21:00c94aeb533e 816 for (i = 0; i < bufLen; i++)
IanBenzMaxim 21:00c94aeb533e 817 {
IanBenzMaxim 21:00c94aeb533e 818 buf[i] = m_I2C_interface.read((i == (bufLen - 1)) ? m_I2C_interface.NoACK : m_I2C_interface.ACK);
IanBenzMaxim 21:00c94aeb533e 819 }
IanBenzMaxim 21:00c94aeb533e 820 m_I2C_interface.stop();
IanBenzMaxim 21:00c94aeb533e 821
IanBenzMaxim 21:00c94aeb533e 822 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 823 }
IanBenzMaxim 21:00c94aeb533e 824
IanBenzMaxim 21:00c94aeb533e 825 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 826 // Write the configuration register in the DS2465. The configuration
IanBenzMaxim 21:00c94aeb533e 827 // options are provided in the lower nibble of the provided config byte.
IanBenzMaxim 21:00c94aeb533e 828 // The uppper nibble in bitwise inverted when written to the DS2465.
IanBenzMaxim 21:00c94aeb533e 829 //
IanBenzMaxim 21:00c94aeb533e 830 // Returns: true: config written and response correct
IanBenzMaxim 21:00c94aeb533e 831 // false: response incorrect
IanBenzMaxim 21:00c94aeb533e 832 //
IanBenzMaxim 24:8942d8478d68 833 OneWireMaster::CmdResult DS2465::WriteConfig(const Config & config)
IanBenzMaxim 21:00c94aeb533e 834 {
IanBenzMaxim 24:8942d8478d68 835 std::uint8_t configBuf;
IanBenzMaxim 24:8942d8478d68 836 OneWireMaster::CmdResult result;
IanBenzMaxim 21:00c94aeb533e 837
IanBenzMaxim 24:8942d8478d68 838 configBuf = config.writeByte();
IanBenzMaxim 24:8942d8478d68 839 result = WriteMemory(ADDR_WCFG_REG, &configBuf, 1);
IanBenzMaxim 24:8942d8478d68 840 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 841 {
IanBenzMaxim 24:8942d8478d68 842 result = ReadMemory(ADDR_WCFG_REG, &configBuf, 1);
IanBenzMaxim 24:8942d8478d68 843 }
IanBenzMaxim 24:8942d8478d68 844 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 845 {
IanBenzMaxim 24:8942d8478d68 846 if (configBuf != config.readByte())
IanBenzMaxim 24:8942d8478d68 847 result = OneWireMaster::OperationFailure;
IanBenzMaxim 21:00c94aeb533e 848 }
IanBenzMaxim 21:00c94aeb533e 849
IanBenzMaxim 24:8942d8478d68 850 return result;
IanBenzMaxim 24:8942d8478d68 851 }
IanBenzMaxim 24:8942d8478d68 852
IanBenzMaxim 24:8942d8478d68 853
IanBenzMaxim 24:8942d8478d68 854
IanBenzMaxim 24:8942d8478d68 855
IanBenzMaxim 27:d5aaefa252f1 856 OneWireMaster::CmdResult DS2465::PollBusy(std::uint8_t * pStatus)
IanBenzMaxim 24:8942d8478d68 857 {
IanBenzMaxim 24:8942d8478d68 858 const unsigned int pollLimit = 200;
IanBenzMaxim 24:8942d8478d68 859
IanBenzMaxim 24:8942d8478d68 860 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 861 std::uint8_t status;
IanBenzMaxim 24:8942d8478d68 862 unsigned int pollCount = 0;
IanBenzMaxim 24:8942d8478d68 863
IanBenzMaxim 24:8942d8478d68 864 // loop checking 1WB bit for completion of 1-Wire operation
IanBenzMaxim 24:8942d8478d68 865 // abort if poll limit reached
IanBenzMaxim 24:8942d8478d68 866
IanBenzMaxim 24:8942d8478d68 867 do
IanBenzMaxim 24:8942d8478d68 868 {
IanBenzMaxim 24:8942d8478d68 869 result = ReadMemory(ADDR_STATUS_REG, &status, 1, true);
IanBenzMaxim 24:8942d8478d68 870 if (result != OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 871 return result;
IanBenzMaxim 24:8942d8478d68 872 if (pStatus != NULL)
IanBenzMaxim 24:8942d8478d68 873 *pStatus = status;
IanBenzMaxim 24:8942d8478d68 874 if (pollCount++ >= pollLimit)
IanBenzMaxim 24:8942d8478d68 875 return OneWireMaster::TimeoutError;
IanBenzMaxim 24:8942d8478d68 876 } while (status & STATUS_1WB);
IanBenzMaxim 24:8942d8478d68 877
IanBenzMaxim 21:00c94aeb533e 878 return OneWireMaster::Success;
IanBenzMaxim 21:00c94aeb533e 879 }
IanBenzMaxim 21:00c94aeb533e 880
IanBenzMaxim 21:00c94aeb533e 881 //--------------------------------------------------------------------------
IanBenzMaxim 21:00c94aeb533e 882 // Reset all of the devices on the 1-Wire Net and return the result.
IanBenzMaxim 21:00c94aeb533e 883 //
IanBenzMaxim 21:00c94aeb533e 884 // Returns: true(1): presense pulse(s) detected, device(s) reset
IanBenzMaxim 21:00c94aeb533e 885 // false(0): no presense pulses detected
IanBenzMaxim 21:00c94aeb533e 886 //
IanBenzMaxim 21:00c94aeb533e 887 OneWireMaster::CmdResult DS2465::OWReset(void)
IanBenzMaxim 24:8942d8478d68 888 {
IanBenzMaxim 24:8942d8478d68 889 // 1-Wire reset (Case B)
IanBenzMaxim 24:8942d8478d68 890 // S AD,0 [A] ADDR_CMD_REG [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 24:8942d8478d68 891 // \--------/
IanBenzMaxim 24:8942d8478d68 892 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 24:8942d8478d68 893 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 894
IanBenzMaxim 24:8942d8478d68 895 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 896 std::uint8_t buf;
IanBenzMaxim 21:00c94aeb533e 897
IanBenzMaxim 24:8942d8478d68 898 buf = CMD_1WRS;
IanBenzMaxim 24:8942d8478d68 899 result = WriteMemory(ADDR_CMD_REG, &buf, 1);
IanBenzMaxim 21:00c94aeb533e 900
IanBenzMaxim 24:8942d8478d68 901 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 902 result = PollBusy(&buf);
IanBenzMaxim 24:8942d8478d68 903
IanBenzMaxim 24:8942d8478d68 904 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 905 {
IanBenzMaxim 24:8942d8478d68 906 // check for presence detect
IanBenzMaxim 24:8942d8478d68 907 if ((buf & STATUS_PPD) != STATUS_PPD)
IanBenzMaxim 24:8942d8478d68 908 result = OneWireMaster::OperationFailure;
IanBenzMaxim 24:8942d8478d68 909 }
IanBenzMaxim 21:00c94aeb533e 910
IanBenzMaxim 24:8942d8478d68 911 return result;
IanBenzMaxim 21:00c94aeb533e 912 }
IanBenzMaxim 21:00c94aeb533e 913
IanBenzMaxim 21:00c94aeb533e 914 OneWireMaster::CmdResult DS2465::Reset(void)
IanBenzMaxim 24:8942d8478d68 915 {
IanBenzMaxim 21:00c94aeb533e 916 // Device Reset
IanBenzMaxim 21:00c94aeb533e 917 // S AD,0 [A] ADDR_CMD_REG [A] 1WMR [A] Sr AD,1 [A] [SS] A\ P
IanBenzMaxim 21:00c94aeb533e 918 // [] indicates from slave
IanBenzMaxim 21:00c94aeb533e 919 // SS status byte to read to verify state
IanBenzMaxim 21:00c94aeb533e 920
IanBenzMaxim 24:8942d8478d68 921 OneWireMaster::CmdResult result;
IanBenzMaxim 27:d5aaefa252f1 922 std::uint8_t buf;
IanBenzMaxim 21:00c94aeb533e 923
IanBenzMaxim 24:8942d8478d68 924 buf = CMD_1WMR;
IanBenzMaxim 24:8942d8478d68 925 result = WriteMemory(ADDR_CMD_REG, &buf, 1);
IanBenzMaxim 21:00c94aeb533e 926
IanBenzMaxim 24:8942d8478d68 927 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 928 result = ReadMemory(ADDR_STATUS_REG, &buf, 1, true);
IanBenzMaxim 24:8942d8478d68 929
IanBenzMaxim 24:8942d8478d68 930 if (result == OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 931 {
IanBenzMaxim 24:8942d8478d68 932 if ((buf & 0xF7) != 0x10)
IanBenzMaxim 24:8942d8478d68 933 result = OneWireMaster::OperationFailure;
IanBenzMaxim 21:00c94aeb533e 934 }
IanBenzMaxim 24:8942d8478d68 935
IanBenzMaxim 24:8942d8478d68 936 if (result == OneWireMaster::Success)
IanBenzMaxim 24:8942d8478d68 937 OWReset(); // do a command to get 1-Wire master reset out of holding state
IanBenzMaxim 21:00c94aeb533e 938
IanBenzMaxim 24:8942d8478d68 939 return result;
IanBenzMaxim 21:00c94aeb533e 940 }
IanBenzMaxim 21:00c94aeb533e 941
IanBenzMaxim 21:00c94aeb533e 942 OneWireMaster::CmdResult DS2465::Detect(void)
IanBenzMaxim 21:00c94aeb533e 943 {
IanBenzMaxim 21:00c94aeb533e 944 OneWireMaster::CmdResult result;
IanBenzMaxim 21:00c94aeb533e 945
IanBenzMaxim 21:00c94aeb533e 946 // reset DS2465
IanBenzMaxim 21:00c94aeb533e 947 result = Reset();
IanBenzMaxim 21:00c94aeb533e 948 if (result != OneWireMaster::Success)
IanBenzMaxim 21:00c94aeb533e 949 return result;
IanBenzMaxim 21:00c94aeb533e 950
IanBenzMaxim 21:00c94aeb533e 951 // default configuration
IanBenzMaxim 24:8942d8478d68 952 m_curConfig.reset();
IanBenzMaxim 21:00c94aeb533e 953
IanBenzMaxim 21:00c94aeb533e 954 // write the default configuration setup
IanBenzMaxim 24:8942d8478d68 955 result = WriteConfig(m_curConfig);
IanBenzMaxim 21:00c94aeb533e 956 return result;
IanBenzMaxim 21:00c94aeb533e 957 }