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

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
IanBenzMaxim
Date:
Tue Mar 22 14:24:53 2016 -0500
Revision:
24:8942d8478d68
Parent:
22:686273e55cdc
Child:
26:a361e3f42ba5
Began cleanup of DS2465 class. Added relative include paths to help preprocessor.

Who changed what in which revision?

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