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.
OneWire_Masters/DS2465/DS2465.cpp@21:00c94aeb533e, 2016-03-21 (annotated)
- Committer:
- IanBenzMaxim
- Date:
- Mon Mar 21 14:12:28 2016 -0500
- Revision:
- 21:00c94aeb533e
- Child:
- 22:686273e55cdc
Added class for DS2465. Added a ReadBytePower operation to OneWireMaster since this is required by the authenticators including the DS28E15. Tweaked member data of OneWireMaster. Added path to header file includes to reduce compiler setup required.
Who changed what in which revision?
User | Revision | Line number | New 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 config bits |
IanBenzMaxim | 21:00c94aeb533e | 27 | #define CONFIG_APU 0x01 |
IanBenzMaxim | 21:00c94aeb533e | 28 | #define CONFIG_PDN 0x02 |
IanBenzMaxim | 21:00c94aeb533e | 29 | #define CONFIG_SPU 0x04 |
IanBenzMaxim | 21:00c94aeb533e | 30 | #define CONFIG_1WS 0x08 |
IanBenzMaxim | 21:00c94aeb533e | 31 | |
IanBenzMaxim | 21:00c94aeb533e | 32 | // DS2465 status bits |
IanBenzMaxim | 21:00c94aeb533e | 33 | #define STATUS_1WB 0x01 |
IanBenzMaxim | 21:00c94aeb533e | 34 | #define STATUS_PPD 0x02 |
IanBenzMaxim | 21:00c94aeb533e | 35 | #define STATUS_SD 0x04 |
IanBenzMaxim | 21:00c94aeb533e | 36 | #define STATUS_LL 0x08 |
IanBenzMaxim | 21:00c94aeb533e | 37 | #define STATUS_RST 0x10 |
IanBenzMaxim | 21:00c94aeb533e | 38 | #define STATUS_SBR 0x20 |
IanBenzMaxim | 21:00c94aeb533e | 39 | #define STATUS_TSB 0x40 |
IanBenzMaxim | 21:00c94aeb533e | 40 | #define STATUS_DIR 0x80 |
IanBenzMaxim | 21:00c94aeb533e | 41 | |
IanBenzMaxim | 21:00c94aeb533e | 42 | // delays (if not polling for complete) |
IanBenzMaxim | 21:00c94aeb533e | 43 | #define EEPROM_WRITE_DELAY 30 |
IanBenzMaxim | 21:00c94aeb533e | 44 | #define LOAD_SECRET_DELAY 90 |
IanBenzMaxim | 21:00c94aeb533e | 45 | #define SHA_COMPUTATION_DELAY 5 |
IanBenzMaxim | 21:00c94aeb533e | 46 | |
IanBenzMaxim | 21:00c94aeb533e | 47 | static const int I2C_WRITE_OK = 0; |
IanBenzMaxim | 21:00c94aeb533e | 48 | |
IanBenzMaxim | 21:00c94aeb533e | 49 | DS2465::DS2465(I2C & I2C_interface, unsigned char I2C_address) |
IanBenzMaxim | 21:00c94aeb533e | 50 | : m_I2C_interface(I2C_interface), m_I2C_address(I2C_address) |
IanBenzMaxim | 21:00c94aeb533e | 51 | { |
IanBenzMaxim | 21:00c94aeb533e | 52 | |
IanBenzMaxim | 21:00c94aeb533e | 53 | } |
IanBenzMaxim | 21:00c94aeb533e | 54 | |
IanBenzMaxim | 21:00c94aeb533e | 55 | |
IanBenzMaxim | 21:00c94aeb533e | 56 | |
IanBenzMaxim | 21:00c94aeb533e | 57 | |
IanBenzMaxim | 21:00c94aeb533e | 58 | OneWireMaster::CmdResult DS2465::OWInitMaster() |
IanBenzMaxim | 21:00c94aeb533e | 59 | { |
IanBenzMaxim | 21:00c94aeb533e | 60 | return Detect(); |
IanBenzMaxim | 21:00c94aeb533e | 61 | } |
IanBenzMaxim | 21:00c94aeb533e | 62 | |
IanBenzMaxim | 21:00c94aeb533e | 63 | |
IanBenzMaxim | 21:00c94aeb533e | 64 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 65 | // Compute Next Master Secret DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 66 | // |
IanBenzMaxim | 21:00c94aeb533e | 67 | // 'swap' - 1 if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 68 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 69 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 70 | // |
IanBenzMaxim | 21:00c94aeb533e | 71 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 72 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 73 | // |
IanBenzMaxim | 21:00c94aeb533e | 74 | OneWireMaster::CmdResult DS2465::Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region) |
IanBenzMaxim | 21:00c94aeb533e | 75 | { |
IanBenzMaxim | 21:00c94aeb533e | 76 | uint8_t par; |
IanBenzMaxim | 21:00c94aeb533e | 77 | |
IanBenzMaxim | 21:00c94aeb533e | 78 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 79 | if (!swap) |
IanBenzMaxim | 21:00c94aeb533e | 80 | par = 0xBF; |
IanBenzMaxim | 21:00c94aeb533e | 81 | else |
IanBenzMaxim | 21:00c94aeb533e | 82 | par = (0xC8 | (pageNum << 4) | region); |
IanBenzMaxim | 21:00c94aeb533e | 83 | |
IanBenzMaxim | 21:00c94aeb533e | 84 | return Write_Command_Reg(CMD_CNMS, par, false); |
IanBenzMaxim | 21:00c94aeb533e | 85 | } |
IanBenzMaxim | 21:00c94aeb533e | 86 | |
IanBenzMaxim | 21:00c94aeb533e | 87 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 88 | // Compute Write MAC DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 89 | // |
IanBenzMaxim | 21:00c94aeb533e | 90 | // 'regwrite' - true if writing to a register, false if regular memory |
IanBenzMaxim | 21:00c94aeb533e | 91 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 92 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 93 | // 'segment' - segment number if swaping |
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_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const |
IanBenzMaxim | 21:00c94aeb533e | 99 | { |
IanBenzMaxim | 21:00c94aeb533e | 100 | uint8_t par; |
IanBenzMaxim | 21:00c94aeb533e | 101 | |
IanBenzMaxim | 21:00c94aeb533e | 102 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 103 | par = ((regwrite << 7) | (swap << 6) | (pageNum << 4) | segmentNum); |
IanBenzMaxim | 21:00c94aeb533e | 104 | |
IanBenzMaxim | 21:00c94aeb533e | 105 | return Write_Command_Reg(CMD_CSWM, par, false); |
IanBenzMaxim | 21:00c94aeb533e | 106 | } |
IanBenzMaxim | 21:00c94aeb533e | 107 | |
IanBenzMaxim | 21:00c94aeb533e | 108 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 109 | // Compute Slave Authentication MAC DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 110 | // |
IanBenzMaxim | 21:00c94aeb533e | 111 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 112 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 113 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 114 | // |
IanBenzMaxim | 21:00c94aeb533e | 115 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 116 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 117 | // |
IanBenzMaxim | 21:00c94aeb533e | 118 | OneWireMaster::CmdResult DS2465::Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const |
IanBenzMaxim | 21:00c94aeb533e | 119 | { |
IanBenzMaxim | 21:00c94aeb533e | 120 | uint8_t par; |
IanBenzMaxim | 21:00c94aeb533e | 121 | |
IanBenzMaxim | 21:00c94aeb533e | 122 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 123 | if (!swap) |
IanBenzMaxim | 21:00c94aeb533e | 124 | par = 0xBF; |
IanBenzMaxim | 21:00c94aeb533e | 125 | else |
IanBenzMaxim | 21:00c94aeb533e | 126 | par = (0xC8 | (pageNum << 4) | region); |
IanBenzMaxim | 21:00c94aeb533e | 127 | |
IanBenzMaxim | 21:00c94aeb533e | 128 | return Write_Command_Reg(CMD_CSAM, par, false); |
IanBenzMaxim | 21:00c94aeb533e | 129 | } |
IanBenzMaxim | 21:00c94aeb533e | 130 | |
IanBenzMaxim | 21:00c94aeb533e | 131 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 132 | // Compute S-Secret on DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 133 | // |
IanBenzMaxim | 21:00c94aeb533e | 134 | // 'swap' - true if swapping a page into the computation |
IanBenzMaxim | 21:00c94aeb533e | 135 | // 'page' - page number to swap in |
IanBenzMaxim | 21:00c94aeb533e | 136 | // 'region' - (1) first 1/2 page, (2) second 1/2 page, (3) entire page |
IanBenzMaxim | 21:00c94aeb533e | 137 | // |
IanBenzMaxim | 21:00c94aeb533e | 138 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 139 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 140 | // |
IanBenzMaxim | 21:00c94aeb533e | 141 | OneWireMaster::CmdResult DS2465::Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region) |
IanBenzMaxim | 21:00c94aeb533e | 142 | { |
IanBenzMaxim | 21:00c94aeb533e | 143 | uint8_t par; |
IanBenzMaxim | 21:00c94aeb533e | 144 | |
IanBenzMaxim | 21:00c94aeb533e | 145 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 146 | if (!swap) |
IanBenzMaxim | 21:00c94aeb533e | 147 | par = 0xBF; |
IanBenzMaxim | 21:00c94aeb533e | 148 | else |
IanBenzMaxim | 21:00c94aeb533e | 149 | par = (0xC8 | (pageNum << 4) | region); |
IanBenzMaxim | 21:00c94aeb533e | 150 | |
IanBenzMaxim | 21:00c94aeb533e | 151 | return Write_Command_Reg(CMD_CSS, par, false); |
IanBenzMaxim | 21:00c94aeb533e | 152 | } |
IanBenzMaxim | 21:00c94aeb533e | 153 | |
IanBenzMaxim | 21:00c94aeb533e | 154 | |
IanBenzMaxim | 21:00c94aeb533e | 155 | |
IanBenzMaxim | 21:00c94aeb533e | 156 | |
IanBenzMaxim | 21:00c94aeb533e | 157 | ISha256MacCoprocessor::CmdResult DS2465::setMasterSecret(const std::uint8_t (&secret)[secret_len]) |
IanBenzMaxim | 21:00c94aeb533e | 158 | { |
IanBenzMaxim | 21:00c94aeb533e | 159 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 160 | result = WriteScratchpad(ADDR_SPAD, secret, secret_len); |
IanBenzMaxim | 21:00c94aeb533e | 161 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 162 | result = CopyScratchpad(1, 0, 1, 0); |
IanBenzMaxim | 21:00c94aeb533e | 163 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 164 | wait_ms(8 * EEPROM_WRITE_DELAY); |
IanBenzMaxim | 21:00c94aeb533e | 165 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 166 | } |
IanBenzMaxim | 21:00c94aeb533e | 167 | |
IanBenzMaxim | 21:00c94aeb533e | 168 | ISha256MacCoprocessor::CmdResult DS2465::ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const |
IanBenzMaxim | 21:00c94aeb533e | 169 | { |
IanBenzMaxim | 21:00c94aeb533e | 170 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 171 | // Write input data to scratchpad |
IanBenzMaxim | 21:00c94aeb533e | 172 | result = WriteScratchpad(ADDR_SPAD, WriteMAC_data, WriteMAC_data_len); |
IanBenzMaxim | 21:00c94aeb533e | 173 | // Compute MAC |
IanBenzMaxim | 21:00c94aeb533e | 174 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 175 | result = Compute_WriteMAC(false, false, 0, 0); |
IanBenzMaxim | 21:00c94aeb533e | 176 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 177 | { |
IanBenzMaxim | 21:00c94aeb533e | 178 | wait_ms(SHA_COMPUTATION_DELAY); |
IanBenzMaxim | 21:00c94aeb533e | 179 | // Read MAC from register |
IanBenzMaxim | 21:00c94aeb533e | 180 | result = ReadMemory(ADDR_MAC_READ, mac, mac_len, true); |
IanBenzMaxim | 21:00c94aeb533e | 181 | } |
IanBenzMaxim | 21:00c94aeb533e | 182 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 183 | } |
IanBenzMaxim | 21:00c94aeb533e | 184 | |
IanBenzMaxim | 21:00c94aeb533e | 185 | ISha256MacCoprocessor::CmdResult DS2465::ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len], |
IanBenzMaxim | 21:00c94aeb533e | 186 | const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const |
IanBenzMaxim | 21:00c94aeb533e | 187 | { |
IanBenzMaxim | 21:00c94aeb533e | 188 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 189 | int addr = ADDR_SPAD; |
IanBenzMaxim | 21:00c94aeb533e | 190 | // Write input data to scratchpad |
IanBenzMaxim | 21:00c94aeb533e | 191 | result = WriteScratchpad(addr, devicePage, devicePage_len); |
IanBenzMaxim | 21:00c94aeb533e | 192 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 193 | { |
IanBenzMaxim | 21:00c94aeb533e | 194 | addr += devicePage_len; |
IanBenzMaxim | 21:00c94aeb533e | 195 | result = WriteScratchpad(addr, challenge, deviceScratchpad_len); |
IanBenzMaxim | 21:00c94aeb533e | 196 | } |
IanBenzMaxim | 21:00c94aeb533e | 197 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 198 | { |
IanBenzMaxim | 21:00c94aeb533e | 199 | addr += deviceScratchpad_len; |
IanBenzMaxim | 21:00c94aeb533e | 200 | result = WriteScratchpad(addr, AuthMAC_data, AuthMAC_data_len); |
IanBenzMaxim | 21:00c94aeb533e | 201 | } |
IanBenzMaxim | 21:00c94aeb533e | 202 | // Compute MAC |
IanBenzMaxim | 21:00c94aeb533e | 203 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 204 | result = Compute_AuthMAC(false, 0, REGION_FULL_PAGE); |
IanBenzMaxim | 21:00c94aeb533e | 205 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 206 | { |
IanBenzMaxim | 21:00c94aeb533e | 207 | wait_ms(SHA_COMPUTATION_DELAY * 2); |
IanBenzMaxim | 21:00c94aeb533e | 208 | // Read MAC from register |
IanBenzMaxim | 21:00c94aeb533e | 209 | result = ReadMemory(ADDR_MAC_READ, mac, mac_len, true); |
IanBenzMaxim | 21:00c94aeb533e | 210 | } |
IanBenzMaxim | 21:00c94aeb533e | 211 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 212 | } |
IanBenzMaxim | 21:00c94aeb533e | 213 | |
IanBenzMaxim | 21:00c94aeb533e | 214 | ISha256MacCoprocessor::CmdResult DS2465::Compute_SSecret(const unsigned char (&devicePage)[devicePage_len], const unsigned char (&deviceScratchpad)[deviceScratchpad_len], |
IanBenzMaxim | 21:00c94aeb533e | 215 | const unsigned char (&SSecret_data)[SSecret_data_len]) |
IanBenzMaxim | 21:00c94aeb533e | 216 | { |
IanBenzMaxim | 21:00c94aeb533e | 217 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 218 | int addr = ADDR_SPAD; |
IanBenzMaxim | 21:00c94aeb533e | 219 | // Write input data to scratchpad |
IanBenzMaxim | 21:00c94aeb533e | 220 | result = WriteScratchpad(addr, devicePage, devicePage_len); |
IanBenzMaxim | 21:00c94aeb533e | 221 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 222 | { |
IanBenzMaxim | 21:00c94aeb533e | 223 | addr += devicePage_len; |
IanBenzMaxim | 21:00c94aeb533e | 224 | result = WriteScratchpad(addr, deviceScratchpad, deviceScratchpad_len); |
IanBenzMaxim | 21:00c94aeb533e | 225 | } |
IanBenzMaxim | 21:00c94aeb533e | 226 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 227 | { |
IanBenzMaxim | 21:00c94aeb533e | 228 | addr += deviceScratchpad_len; |
IanBenzMaxim | 21:00c94aeb533e | 229 | result = WriteScratchpad(addr, SSecret_data, SSecret_data_len); |
IanBenzMaxim | 21:00c94aeb533e | 230 | } |
IanBenzMaxim | 21:00c94aeb533e | 231 | // Compute secret |
IanBenzMaxim | 21:00c94aeb533e | 232 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 233 | result = Compute_SSecret(false, 0, REGION_FULL_PAGE); |
IanBenzMaxim | 21:00c94aeb533e | 234 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 235 | wait_ms(SHA_COMPUTATION_DELAY * 2); |
IanBenzMaxim | 21:00c94aeb533e | 236 | return (result == OneWireMaster::Success ? ISha256MacCoprocessor::Success : ISha256MacCoprocessor::OperationFailure); |
IanBenzMaxim | 21:00c94aeb533e | 237 | } |
IanBenzMaxim | 21:00c94aeb533e | 238 | |
IanBenzMaxim | 21:00c94aeb533e | 239 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 240 | // Copy Scratchpad on DS2465 to either secret or memory page |
IanBenzMaxim | 21:00c94aeb533e | 241 | // |
IanBenzMaxim | 21:00c94aeb533e | 242 | // 'dest_secret' - 1 if destination is secret, 0 if memory page |
IanBenzMaxim | 21:00c94aeb533e | 243 | // 'page' - page number if dest_secret=0 |
IanBenzMaxim | 21:00c94aeb533e | 244 | // 'notfull' - 0 if only 4 byte segment, 1 if writing to full page, |
IanBenzMaxim | 21:00c94aeb533e | 245 | // 'seg' - Segment number if full=0. |
IanBenzMaxim | 21:00c94aeb533e | 246 | // |
IanBenzMaxim | 21:00c94aeb533e | 247 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 248 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 249 | // |
IanBenzMaxim | 21:00c94aeb533e | 250 | OneWireMaster::CmdResult DS2465::CopyScratchpad(bool dest_secret, unsigned int pageNum, bool notFull, unsigned int segmentNum) |
IanBenzMaxim | 21:00c94aeb533e | 251 | { |
IanBenzMaxim | 21:00c94aeb533e | 252 | uint8_t par; |
IanBenzMaxim | 21:00c94aeb533e | 253 | |
IanBenzMaxim | 21:00c94aeb533e | 254 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 255 | if (dest_secret) |
IanBenzMaxim | 21:00c94aeb533e | 256 | par = 0; |
IanBenzMaxim | 21:00c94aeb533e | 257 | else |
IanBenzMaxim | 21:00c94aeb533e | 258 | par = (0x80 | (pageNum << 4) | (notFull << 3) | segmentNum); |
IanBenzMaxim | 21:00c94aeb533e | 259 | |
IanBenzMaxim | 21:00c94aeb533e | 260 | return Write_Command_Reg(CMD_CPS, par, false); |
IanBenzMaxim | 21:00c94aeb533e | 261 | } |
IanBenzMaxim | 21:00c94aeb533e | 262 | |
IanBenzMaxim | 21:00c94aeb533e | 263 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 264 | // APU enable or disable |
IanBenzMaxim | 21:00c94aeb533e | 265 | // |
IanBenzMaxim | 21:00c94aeb533e | 266 | // 'readflag' - 1 if reading current configuration |
IanBenzMaxim | 21:00c94aeb533e | 267 | // 'apu_enable' - 1 to enable |
IanBenzMaxim | 21:00c94aeb533e | 268 | // |
IanBenzMaxim | 21:00c94aeb533e | 269 | // Returns: true if write successful, or return configuration value if reading |
IanBenzMaxim | 21:00c94aeb533e | 270 | // |
IanBenzMaxim | 21:00c94aeb533e | 271 | OneWireMaster::CmdResult DS2465::ConfigureAPU(bool apu_enable) |
IanBenzMaxim | 21:00c94aeb533e | 272 | { |
IanBenzMaxim | 21:00c94aeb533e | 273 | // clear power down bit in the global config state |
IanBenzMaxim | 21:00c94aeb533e | 274 | cAPU = apu_enable ? CONFIG_APU : 0; |
IanBenzMaxim | 21:00c94aeb533e | 275 | |
IanBenzMaxim | 21:00c94aeb533e | 276 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 277 | return Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 278 | } |
IanBenzMaxim | 21:00c94aeb533e | 279 | |
IanBenzMaxim | 21:00c94aeb533e | 280 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 281 | // Power up 1-Wire using extended function |
IanBenzMaxim | 21:00c94aeb533e | 282 | // |
IanBenzMaxim | 21:00c94aeb533e | 283 | // Returns: true successful |
IanBenzMaxim | 21:00c94aeb533e | 284 | // false failure during communication |
IanBenzMaxim | 21:00c94aeb533e | 285 | // |
IanBenzMaxim | 21:00c94aeb533e | 286 | OneWireMaster::CmdResult DS2465::OWPowerUp(void) |
IanBenzMaxim | 21:00c94aeb533e | 287 | { |
IanBenzMaxim | 21:00c94aeb533e | 288 | OneWireMaster::CmdResult rt; |
IanBenzMaxim | 21:00c94aeb533e | 289 | |
IanBenzMaxim | 21:00c94aeb533e | 290 | // clear power down bit in the global config state |
IanBenzMaxim | 21:00c94aeb533e | 291 | cPDN = 0; |
IanBenzMaxim | 21:00c94aeb533e | 292 | |
IanBenzMaxim | 21:00c94aeb533e | 293 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 294 | rt = Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 295 | |
IanBenzMaxim | 21:00c94aeb533e | 296 | // delay 2ms to allow units to power up |
IanBenzMaxim | 21:00c94aeb533e | 297 | wait_ms(2); |
IanBenzMaxim | 21:00c94aeb533e | 298 | |
IanBenzMaxim | 21:00c94aeb533e | 299 | return rt; |
IanBenzMaxim | 21:00c94aeb533e | 300 | } |
IanBenzMaxim | 21:00c94aeb533e | 301 | |
IanBenzMaxim | 21:00c94aeb533e | 302 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 303 | // Power down 1-Wire using extended function |
IanBenzMaxim | 21:00c94aeb533e | 304 | // |
IanBenzMaxim | 21:00c94aeb533e | 305 | // Returns: true successful |
IanBenzMaxim | 21:00c94aeb533e | 306 | // false program voltage not available |
IanBenzMaxim | 21:00c94aeb533e | 307 | // |
IanBenzMaxim | 21:00c94aeb533e | 308 | OneWireMaster::CmdResult DS2465::OWPowerDown(void) |
IanBenzMaxim | 21:00c94aeb533e | 309 | { |
IanBenzMaxim | 21:00c94aeb533e | 310 | // set power down bit in the global config state |
IanBenzMaxim | 21:00c94aeb533e | 311 | cPDN = CONFIG_PDN; |
IanBenzMaxim | 21:00c94aeb533e | 312 | |
IanBenzMaxim | 21:00c94aeb533e | 313 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 314 | return Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 315 | } |
IanBenzMaxim | 21:00c94aeb533e | 316 | |
IanBenzMaxim | 21:00c94aeb533e | 317 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 318 | // Send 1 bit of communication to the 1-Wire Net and verify that the |
IanBenzMaxim | 21:00c94aeb533e | 319 | // response matches the 'applyPowerResponse' bit and apply power delivery |
IanBenzMaxim | 21:00c94aeb533e | 320 | // to the 1-Wire net. Note that some implementations may apply the power |
IanBenzMaxim | 21:00c94aeb533e | 321 | // first and then turn it off if the response is incorrect. |
IanBenzMaxim | 21:00c94aeb533e | 322 | // |
IanBenzMaxim | 21:00c94aeb533e | 323 | // 'applyPowerResponse' - 1 bit response to check, if correct then start |
IanBenzMaxim | 21:00c94aeb533e | 324 | // power delivery |
IanBenzMaxim | 21:00c94aeb533e | 325 | // |
IanBenzMaxim | 21:00c94aeb533e | 326 | // Returns: true: bit written and response correct, strong pullup now on |
IanBenzMaxim | 21:00c94aeb533e | 327 | // false: response incorrect |
IanBenzMaxim | 21:00c94aeb533e | 328 | // |
IanBenzMaxim | 21:00c94aeb533e | 329 | OneWireMaster::CmdResult DS2465::OWReadBitPower(uint8_t applyPowerResponse) |
IanBenzMaxim | 21:00c94aeb533e | 330 | { |
IanBenzMaxim | 21:00c94aeb533e | 331 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 332 | uint8_t rdbit; |
IanBenzMaxim | 21:00c94aeb533e | 333 | |
IanBenzMaxim | 21:00c94aeb533e | 334 | // set strong pull-up enable |
IanBenzMaxim | 21:00c94aeb533e | 335 | cSPU = CONFIG_SPU; |
IanBenzMaxim | 21:00c94aeb533e | 336 | |
IanBenzMaxim | 21:00c94aeb533e | 337 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 338 | result = Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 339 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 340 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 341 | |
IanBenzMaxim | 21:00c94aeb533e | 342 | // perform read bit |
IanBenzMaxim | 21:00c94aeb533e | 343 | result = OWReadBit(rdbit); |
IanBenzMaxim | 21:00c94aeb533e | 344 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 345 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 346 | |
IanBenzMaxim | 21:00c94aeb533e | 347 | // check if response was correct, if not then turn off strong pull-up |
IanBenzMaxim | 21:00c94aeb533e | 348 | if (rdbit != applyPowerResponse) |
IanBenzMaxim | 21:00c94aeb533e | 349 | { |
IanBenzMaxim | 21:00c94aeb533e | 350 | OWLevel(LEVEL_NORMAL); |
IanBenzMaxim | 21:00c94aeb533e | 351 | return OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 352 | } |
IanBenzMaxim | 21:00c94aeb533e | 353 | |
IanBenzMaxim | 21:00c94aeb533e | 354 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 355 | } |
IanBenzMaxim | 21:00c94aeb533e | 356 | |
IanBenzMaxim | 21:00c94aeb533e | 357 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 358 | // Read 8 bits of communication from the 1-Wire Net. After the |
IanBenzMaxim | 21:00c94aeb533e | 359 | // 8 bits are read then change the level of the 1-Wire net. |
IanBenzMaxim | 21:00c94aeb533e | 360 | // |
IanBenzMaxim | 21:00c94aeb533e | 361 | // Returns: 8 bits read from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 362 | // |
IanBenzMaxim | 21:00c94aeb533e | 363 | OneWireMaster::CmdResult DS2465::OWReadBytePower(uint8_t & recvbyte) |
IanBenzMaxim | 21:00c94aeb533e | 364 | { |
IanBenzMaxim | 21:00c94aeb533e | 365 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 366 | |
IanBenzMaxim | 21:00c94aeb533e | 367 | // set strong pull-up enable |
IanBenzMaxim | 21:00c94aeb533e | 368 | cSPU = CONFIG_SPU; |
IanBenzMaxim | 21:00c94aeb533e | 369 | |
IanBenzMaxim | 21:00c94aeb533e | 370 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 371 | result = Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 372 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 373 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 374 | |
IanBenzMaxim | 21:00c94aeb533e | 375 | // do the read byte |
IanBenzMaxim | 21:00c94aeb533e | 376 | result = OWReadByte(recvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 377 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 378 | } |
IanBenzMaxim | 21:00c94aeb533e | 379 | |
IanBenzMaxim | 21:00c94aeb533e | 380 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 381 | // Send 8 bits of communication to the 1-Wire Net and verify that the |
IanBenzMaxim | 21:00c94aeb533e | 382 | // 8 bits read from the 1-Wire Net is the same (write operation). |
IanBenzMaxim | 21:00c94aeb533e | 383 | // The parameter 'sendbyte' least significant 8 bits are used. After the |
IanBenzMaxim | 21:00c94aeb533e | 384 | // 8 bits are sent change the level of the 1-Wire net. |
IanBenzMaxim | 21:00c94aeb533e | 385 | // |
IanBenzMaxim | 21:00c94aeb533e | 386 | // 'sendbyte' - 8 bits to send (least significant bit) |
IanBenzMaxim | 21:00c94aeb533e | 387 | // |
IanBenzMaxim | 21:00c94aeb533e | 388 | OneWireMaster::CmdResult DS2465::OWWriteBytePower(uint8_t sendbyte) |
IanBenzMaxim | 21:00c94aeb533e | 389 | { |
IanBenzMaxim | 21:00c94aeb533e | 390 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 391 | |
IanBenzMaxim | 21:00c94aeb533e | 392 | // set strong pull-up enable |
IanBenzMaxim | 21:00c94aeb533e | 393 | cSPU = CONFIG_SPU; |
IanBenzMaxim | 21:00c94aeb533e | 394 | |
IanBenzMaxim | 21:00c94aeb533e | 395 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 396 | result = Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 397 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 398 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 399 | |
IanBenzMaxim | 21:00c94aeb533e | 400 | // perform write byte |
IanBenzMaxim | 21:00c94aeb533e | 401 | return OWWriteByte(sendbyte); |
IanBenzMaxim | 21:00c94aeb533e | 402 | } |
IanBenzMaxim | 21:00c94aeb533e | 403 | |
IanBenzMaxim | 21:00c94aeb533e | 404 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 405 | // Set the 1-Wire Net line level pull-up to normal. The DS2465 does only |
IanBenzMaxim | 21:00c94aeb533e | 406 | // allows enabling strong pull-up on a bit or byte event. Consequently this |
IanBenzMaxim | 21:00c94aeb533e | 407 | // function only allows the MODE_STANDARD argument. To enable strong pull-up |
IanBenzMaxim | 21:00c94aeb533e | 408 | // use OWWriteBytePower or OWReadBitPower. |
IanBenzMaxim | 21:00c94aeb533e | 409 | // |
IanBenzMaxim | 21:00c94aeb533e | 410 | // 'new_level' - new level defined as |
IanBenzMaxim | 21:00c94aeb533e | 411 | // MODE_STANDARD 0x00 |
IanBenzMaxim | 21:00c94aeb533e | 412 | // |
IanBenzMaxim | 21:00c94aeb533e | 413 | // Returns: current 1-Wire Net level |
IanBenzMaxim | 21:00c94aeb533e | 414 | // |
IanBenzMaxim | 21:00c94aeb533e | 415 | OneWireMaster::CmdResult DS2465::OWLevel(OW_LEVEL new_level) |
IanBenzMaxim | 21:00c94aeb533e | 416 | { |
IanBenzMaxim | 21:00c94aeb533e | 417 | // function only will turn back to non-strong pull-up |
IanBenzMaxim | 21:00c94aeb533e | 418 | if (new_level != LEVEL_NORMAL) |
IanBenzMaxim | 21:00c94aeb533e | 419 | return OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 420 | |
IanBenzMaxim | 21:00c94aeb533e | 421 | // clear the strong pull-up bit in the global config state |
IanBenzMaxim | 21:00c94aeb533e | 422 | cSPU = 0; |
IanBenzMaxim | 21:00c94aeb533e | 423 | |
IanBenzMaxim | 21:00c94aeb533e | 424 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 425 | return Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 426 | } |
IanBenzMaxim | 21:00c94aeb533e | 427 | |
IanBenzMaxim | 21:00c94aeb533e | 428 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 429 | // The 'OWOverdriveMatchROM' function does an overdrive Match-ROM using the |
IanBenzMaxim | 21:00c94aeb533e | 430 | // global ROM_NO device |
IanBenzMaxim | 21:00c94aeb533e | 431 | // |
IanBenzMaxim | 21:00c94aeb533e | 432 | // Returns: true (1) : OWReset successful and match rom sent. |
IanBenzMaxim | 21:00c94aeb533e | 433 | // false (0): OWReset did not have presence |
IanBenzMaxim | 21:00c94aeb533e | 434 | // |
IanBenzMaxim | 21:00c94aeb533e | 435 | OneWireMaster::CmdResult DS2465::OWOverdriveMatchROM(const RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 436 | { |
IanBenzMaxim | 21:00c94aeb533e | 437 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 438 | // use overdrive MatchROM |
IanBenzMaxim | 21:00c94aeb533e | 439 | OWSpeed(SPEED_STANDARD); |
IanBenzMaxim | 21:00c94aeb533e | 440 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 441 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 442 | { |
IanBenzMaxim | 21:00c94aeb533e | 443 | result = OWWriteByte(0x69); |
IanBenzMaxim | 21:00c94aeb533e | 444 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 445 | { |
IanBenzMaxim | 21:00c94aeb533e | 446 | OWSpeed(SPEED_OVERDRIVE); |
IanBenzMaxim | 21:00c94aeb533e | 447 | // send ROM |
IanBenzMaxim | 21:00c94aeb533e | 448 | result = OWWriteBlock(false, romId, RomId::byteLen); |
IanBenzMaxim | 21:00c94aeb533e | 449 | } |
IanBenzMaxim | 21:00c94aeb533e | 450 | } |
IanBenzMaxim | 21:00c94aeb533e | 451 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 452 | } |
IanBenzMaxim | 21:00c94aeb533e | 453 | |
IanBenzMaxim | 21:00c94aeb533e | 454 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 455 | // The 'OWMatchROM' function does a Match-ROM using the global ROM_NO device |
IanBenzMaxim | 21:00c94aeb533e | 456 | // |
IanBenzMaxim | 21:00c94aeb533e | 457 | // Returns: true (1) : OWReset successful and match rom sent. |
IanBenzMaxim | 21:00c94aeb533e | 458 | // false (0): OWReset did not have presence |
IanBenzMaxim | 21:00c94aeb533e | 459 | // |
IanBenzMaxim | 21:00c94aeb533e | 460 | OneWireMaster::CmdResult DS2465::OWMatchROM(const RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 461 | { |
IanBenzMaxim | 21:00c94aeb533e | 462 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 463 | uint8_t buf[1 + RomId::byteLen]; |
IanBenzMaxim | 21:00c94aeb533e | 464 | |
IanBenzMaxim | 21:00c94aeb533e | 465 | // use MatchROM |
IanBenzMaxim | 21:00c94aeb533e | 466 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 467 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 468 | { |
IanBenzMaxim | 21:00c94aeb533e | 469 | buf[0] = 0x55; |
IanBenzMaxim | 21:00c94aeb533e | 470 | std::memcpy(&buf[1], romId, RomId::byteLen); |
IanBenzMaxim | 21:00c94aeb533e | 471 | // send command and rom |
IanBenzMaxim | 21:00c94aeb533e | 472 | result = OWWriteBlock(false, buf, 1 + RomId::byteLen); |
IanBenzMaxim | 21:00c94aeb533e | 473 | } |
IanBenzMaxim | 21:00c94aeb533e | 474 | |
IanBenzMaxim | 21:00c94aeb533e | 475 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 476 | } |
IanBenzMaxim | 21:00c94aeb533e | 477 | |
IanBenzMaxim | 21:00c94aeb533e | 478 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 479 | // Setup the search to skip the current device type on the next call |
IanBenzMaxim | 21:00c94aeb533e | 480 | // to OWNext(). |
IanBenzMaxim | 21:00c94aeb533e | 481 | // |
IanBenzMaxim | 21:00c94aeb533e | 482 | void DS2465::OWFamilySkipSetup(void) |
IanBenzMaxim | 21:00c94aeb533e | 483 | { |
IanBenzMaxim | 21:00c94aeb533e | 484 | // set the Last discrepancy to last family discrepancy |
IanBenzMaxim | 21:00c94aeb533e | 485 | m_lastDiscrepancy = m_lastFamilyDiscrepancy; |
IanBenzMaxim | 21:00c94aeb533e | 486 | |
IanBenzMaxim | 21:00c94aeb533e | 487 | // clear the last family discrpepancy |
IanBenzMaxim | 21:00c94aeb533e | 488 | m_lastFamilyDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 489 | |
IanBenzMaxim | 21:00c94aeb533e | 490 | // check for end of list |
IanBenzMaxim | 21:00c94aeb533e | 491 | if (m_lastDiscrepancy == 0) |
IanBenzMaxim | 21:00c94aeb533e | 492 | m_lastDeviceFlag = true; |
IanBenzMaxim | 21:00c94aeb533e | 493 | } |
IanBenzMaxim | 21:00c94aeb533e | 494 | |
IanBenzMaxim | 21:00c94aeb533e | 495 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 496 | // Setup the search to find the device type 'family_code' on the next call |
IanBenzMaxim | 21:00c94aeb533e | 497 | // to OWNext() if it is present. |
IanBenzMaxim | 21:00c94aeb533e | 498 | // |
IanBenzMaxim | 21:00c94aeb533e | 499 | void DS2465::OWTargetSetup(RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 500 | { |
IanBenzMaxim | 21:00c94aeb533e | 501 | // set the search state to find SearchFamily type devices |
IanBenzMaxim | 21:00c94aeb533e | 502 | for (int i = 1; i < 8; i++) |
IanBenzMaxim | 21:00c94aeb533e | 503 | romId[i] = 0; |
IanBenzMaxim | 21:00c94aeb533e | 504 | m_lastDiscrepancy = 64; |
IanBenzMaxim | 21:00c94aeb533e | 505 | m_lastFamilyDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 506 | m_lastDeviceFlag = false; |
IanBenzMaxim | 21:00c94aeb533e | 507 | } |
IanBenzMaxim | 21:00c94aeb533e | 508 | |
IanBenzMaxim | 21:00c94aeb533e | 509 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 510 | // Verify the device with the ROM number in ROM_NO buffer is present. |
IanBenzMaxim | 21:00c94aeb533e | 511 | // Return true : device verified present |
IanBenzMaxim | 21:00c94aeb533e | 512 | // false : device not present |
IanBenzMaxim | 21:00c94aeb533e | 513 | // |
IanBenzMaxim | 21:00c94aeb533e | 514 | OneWireMaster::CmdResult DS2465::OWVerify(const RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 515 | { |
IanBenzMaxim | 21:00c94aeb533e | 516 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 517 | RomId romIdCopy(romId); |
IanBenzMaxim | 21:00c94aeb533e | 518 | int ld_backup, ldf_backup, lfd_backup; |
IanBenzMaxim | 21:00c94aeb533e | 519 | |
IanBenzMaxim | 21:00c94aeb533e | 520 | // keep a backup copy of the current state |
IanBenzMaxim | 21:00c94aeb533e | 521 | ld_backup = m_lastDiscrepancy; |
IanBenzMaxim | 21:00c94aeb533e | 522 | ldf_backup = m_lastDeviceFlag; |
IanBenzMaxim | 21:00c94aeb533e | 523 | lfd_backup = m_lastFamilyDiscrepancy; |
IanBenzMaxim | 21:00c94aeb533e | 524 | |
IanBenzMaxim | 21:00c94aeb533e | 525 | // set search to find the same device |
IanBenzMaxim | 21:00c94aeb533e | 526 | m_lastDiscrepancy = 64; |
IanBenzMaxim | 21:00c94aeb533e | 527 | m_lastDeviceFlag = false; |
IanBenzMaxim | 21:00c94aeb533e | 528 | |
IanBenzMaxim | 21:00c94aeb533e | 529 | result = OWSearch(romIdCopy); |
IanBenzMaxim | 21:00c94aeb533e | 530 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 531 | { |
IanBenzMaxim | 21:00c94aeb533e | 532 | // check if same device found |
IanBenzMaxim | 21:00c94aeb533e | 533 | if (romId != romIdCopy) |
IanBenzMaxim | 21:00c94aeb533e | 534 | { |
IanBenzMaxim | 21:00c94aeb533e | 535 | result = OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 536 | } |
IanBenzMaxim | 21:00c94aeb533e | 537 | } |
IanBenzMaxim | 21:00c94aeb533e | 538 | |
IanBenzMaxim | 21:00c94aeb533e | 539 | // restore the search state |
IanBenzMaxim | 21:00c94aeb533e | 540 | m_lastDiscrepancy = ld_backup; |
IanBenzMaxim | 21:00c94aeb533e | 541 | m_lastDeviceFlag = ldf_backup; |
IanBenzMaxim | 21:00c94aeb533e | 542 | m_lastFamilyDiscrepancy = lfd_backup; |
IanBenzMaxim | 21:00c94aeb533e | 543 | |
IanBenzMaxim | 21:00c94aeb533e | 544 | // return the result of the verify |
IanBenzMaxim | 21:00c94aeb533e | 545 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 546 | } |
IanBenzMaxim | 21:00c94aeb533e | 547 | |
IanBenzMaxim | 21:00c94aeb533e | 548 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 549 | // Find the 'next' devices on the 1-Wire network |
IanBenzMaxim | 21:00c94aeb533e | 550 | // Return true : device found, ROM number in ROM_NO buffer |
IanBenzMaxim | 21:00c94aeb533e | 551 | // false : device not found, end of search |
IanBenzMaxim | 21:00c94aeb533e | 552 | // |
IanBenzMaxim | 21:00c94aeb533e | 553 | OneWireMaster::CmdResult DS2465::OWNext(RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 554 | { |
IanBenzMaxim | 21:00c94aeb533e | 555 | // leave the search state alone |
IanBenzMaxim | 21:00c94aeb533e | 556 | return OWSearch(romId); |
IanBenzMaxim | 21:00c94aeb533e | 557 | } |
IanBenzMaxim | 21:00c94aeb533e | 558 | |
IanBenzMaxim | 21:00c94aeb533e | 559 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 560 | // Set the 1-Wire Net communication speed. |
IanBenzMaxim | 21:00c94aeb533e | 561 | // |
IanBenzMaxim | 21:00c94aeb533e | 562 | // 'new_speed' - new speed defined as |
IanBenzMaxim | 21:00c94aeb533e | 563 | // MODE_STANDARD 0x00 |
IanBenzMaxim | 21:00c94aeb533e | 564 | // MODE_OVERDRIVE 0x01 |
IanBenzMaxim | 21:00c94aeb533e | 565 | // |
IanBenzMaxim | 21:00c94aeb533e | 566 | // Returns: current 1-Wire Net speed |
IanBenzMaxim | 21:00c94aeb533e | 567 | // |
IanBenzMaxim | 21:00c94aeb533e | 568 | OneWireMaster::CmdResult DS2465::OWSpeed(OW_SPEED new_speed) |
IanBenzMaxim | 21:00c94aeb533e | 569 | { |
IanBenzMaxim | 21:00c94aeb533e | 570 | // set the speed |
IanBenzMaxim | 21:00c94aeb533e | 571 | if (new_speed == SPEED_OVERDRIVE) |
IanBenzMaxim | 21:00c94aeb533e | 572 | c1WS = CONFIG_1WS; |
IanBenzMaxim | 21:00c94aeb533e | 573 | else |
IanBenzMaxim | 21:00c94aeb533e | 574 | c1WS = 0; |
IanBenzMaxim | 21:00c94aeb533e | 575 | |
IanBenzMaxim | 21:00c94aeb533e | 576 | // write the new config |
IanBenzMaxim | 21:00c94aeb533e | 577 | return Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 578 | } |
IanBenzMaxim | 21:00c94aeb533e | 579 | |
IanBenzMaxim | 21:00c94aeb533e | 580 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 581 | // The 'OWOverdriveSkipROM' function does an Overdrive skip-ROM. Ignores |
IanBenzMaxim | 21:00c94aeb533e | 582 | // result from standard speed OWReset(). |
IanBenzMaxim | 21:00c94aeb533e | 583 | // |
IanBenzMaxim | 21:00c94aeb533e | 584 | // Returns: true (1) : OWReset and skip rom sent. |
IanBenzMaxim | 21:00c94aeb533e | 585 | // false (0): Could not change to overdrive |
IanBenzMaxim | 21:00c94aeb533e | 586 | // |
IanBenzMaxim | 21:00c94aeb533e | 587 | OneWireMaster::CmdResult DS2465::OWOverdriveSkipROM(void) |
IanBenzMaxim | 21:00c94aeb533e | 588 | { |
IanBenzMaxim | 21:00c94aeb533e | 589 | OneWireMaster::CmdResult result = OWSpeed(SPEED_STANDARD); |
IanBenzMaxim | 21:00c94aeb533e | 590 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 591 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 592 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 593 | result = OWWriteByte(0x3C); |
IanBenzMaxim | 21:00c94aeb533e | 594 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 595 | result = OWSpeed(SPEED_OVERDRIVE); |
IanBenzMaxim | 21:00c94aeb533e | 596 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 597 | } |
IanBenzMaxim | 21:00c94aeb533e | 598 | |
IanBenzMaxim | 21:00c94aeb533e | 599 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 600 | // The 'OWResume' function does a Resume command 0xA5. |
IanBenzMaxim | 21:00c94aeb533e | 601 | // |
IanBenzMaxim | 21:00c94aeb533e | 602 | // Returns: true (1) : OWReset successful and RESUME sent. |
IanBenzMaxim | 21:00c94aeb533e | 603 | // false (0): OWReset did not have presence |
IanBenzMaxim | 21:00c94aeb533e | 604 | // |
IanBenzMaxim | 21:00c94aeb533e | 605 | OneWireMaster::CmdResult DS2465::OWResume(void) |
IanBenzMaxim | 21:00c94aeb533e | 606 | { |
IanBenzMaxim | 21:00c94aeb533e | 607 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 608 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 609 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 610 | { |
IanBenzMaxim | 21:00c94aeb533e | 611 | result = OWWriteByte(0xA5); |
IanBenzMaxim | 21:00c94aeb533e | 612 | } |
IanBenzMaxim | 21:00c94aeb533e | 613 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 614 | } |
IanBenzMaxim | 21:00c94aeb533e | 615 | |
IanBenzMaxim | 21:00c94aeb533e | 616 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 617 | // The 'OWSkipROM' function does a skip-ROM. This function |
IanBenzMaxim | 21:00c94aeb533e | 618 | // uses the Skip-ROM function CCh. |
IanBenzMaxim | 21:00c94aeb533e | 619 | // |
IanBenzMaxim | 21:00c94aeb533e | 620 | // Returns: true (1) : OWReset successful and skip rom sent. |
IanBenzMaxim | 21:00c94aeb533e | 621 | // false (0): OWReset did not have presence |
IanBenzMaxim | 21:00c94aeb533e | 622 | // |
IanBenzMaxim | 21:00c94aeb533e | 623 | OneWireMaster::CmdResult DS2465::OWSkipROM(void) |
IanBenzMaxim | 21:00c94aeb533e | 624 | { |
IanBenzMaxim | 21:00c94aeb533e | 625 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 626 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 627 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 628 | { |
IanBenzMaxim | 21:00c94aeb533e | 629 | result = OWWriteByte(0xCC); |
IanBenzMaxim | 21:00c94aeb533e | 630 | } |
IanBenzMaxim | 21:00c94aeb533e | 631 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 632 | } |
IanBenzMaxim | 21:00c94aeb533e | 633 | |
IanBenzMaxim | 21:00c94aeb533e | 634 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 635 | // The 'OWReadROM' function does a Read-ROM. This function |
IanBenzMaxim | 21:00c94aeb533e | 636 | // uses the read-ROM function 33h to read a ROM number and verify CRC8. |
IanBenzMaxim | 21:00c94aeb533e | 637 | // |
IanBenzMaxim | 21:00c94aeb533e | 638 | // Returns: true (1) : OWReset successful and Serial Number placed |
IanBenzMaxim | 21:00c94aeb533e | 639 | // in the global ROM, CRC8 valid |
IanBenzMaxim | 21:00c94aeb533e | 640 | // false (0): OWReset did not have presence or CRC8 invalid |
IanBenzMaxim | 21:00c94aeb533e | 641 | // |
IanBenzMaxim | 21:00c94aeb533e | 642 | OneWireMaster::CmdResult DS2465::OWReadROM(RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 643 | { |
IanBenzMaxim | 21:00c94aeb533e | 644 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 645 | uint8_t buf[2 + RomId::byteLen]; |
IanBenzMaxim | 21:00c94aeb533e | 646 | |
IanBenzMaxim | 21:00c94aeb533e | 647 | result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 648 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 649 | result = OWWriteByte(0x33); // READ ROM |
IanBenzMaxim | 21:00c94aeb533e | 650 | |
IanBenzMaxim | 21:00c94aeb533e | 651 | // read the ROM |
IanBenzMaxim | 21:00c94aeb533e | 652 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 653 | result = OWReadBlock(buf, RomId::byteLen); |
IanBenzMaxim | 21:00c94aeb533e | 654 | |
IanBenzMaxim | 21:00c94aeb533e | 655 | // verify CRC8 |
IanBenzMaxim | 21:00c94aeb533e | 656 | if ((result == OneWireMaster::Success) && (RomId::calculateCRC8(buf, RomId::byteLen) == 0) && (buf[1] != 0)) |
IanBenzMaxim | 21:00c94aeb533e | 657 | romId = RomId(reinterpret_cast<std::uint8_t (&)[RomId::byteLen]>(buf[0])); |
IanBenzMaxim | 21:00c94aeb533e | 658 | |
IanBenzMaxim | 21:00c94aeb533e | 659 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 660 | } |
IanBenzMaxim | 21:00c94aeb533e | 661 | |
IanBenzMaxim | 21:00c94aeb533e | 662 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 663 | // Use the DS2465 help command '1-Wire triplet' to perform one bit of a 1-Wire |
IanBenzMaxim | 21:00c94aeb533e | 664 | // search. This command does two read bits and one write bit. The write bit |
IanBenzMaxim | 21:00c94aeb533e | 665 | // is either the default direction (all device have same bit) or in case of |
IanBenzMaxim | 21:00c94aeb533e | 666 | // a discripancy, the 'search_direction' parameter is used. |
IanBenzMaxim | 21:00c94aeb533e | 667 | // |
IanBenzMaxim | 21:00c94aeb533e | 668 | // Returns The DS2465 status byte result from the triplet command |
IanBenzMaxim | 21:00c94aeb533e | 669 | // |
IanBenzMaxim | 21:00c94aeb533e | 670 | OneWireMaster::CmdResult DS2465::Triplet(Direction search_direction, uint8_t & status) |
IanBenzMaxim | 21:00c94aeb533e | 671 | { |
IanBenzMaxim | 21:00c94aeb533e | 672 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 673 | |
IanBenzMaxim | 21:00c94aeb533e | 674 | // 1-Wire Triplet (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 675 | // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 676 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 677 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 678 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 679 | // SS indicates byte containing search direction bit value in msbit |
IanBenzMaxim | 21:00c94aeb533e | 680 | |
IanBenzMaxim | 21:00c94aeb533e | 681 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 682 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 683 | { |
IanBenzMaxim | 21:00c94aeb533e | 684 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 685 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 686 | } |
IanBenzMaxim | 21:00c94aeb533e | 687 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 688 | { |
IanBenzMaxim | 21:00c94aeb533e | 689 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 690 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 691 | } |
IanBenzMaxim | 21:00c94aeb533e | 692 | if (m_I2C_interface.write(CMD_1WT) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 693 | { |
IanBenzMaxim | 21:00c94aeb533e | 694 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 695 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 696 | } |
IanBenzMaxim | 21:00c94aeb533e | 697 | if (m_I2C_interface.write((unsigned char)((search_direction == DIRECTION_WRITE_ONE) ? 0x80 : 0x00)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 698 | { |
IanBenzMaxim | 21:00c94aeb533e | 699 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 700 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 701 | } |
IanBenzMaxim | 21:00c94aeb533e | 702 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 703 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 704 | { |
IanBenzMaxim | 21:00c94aeb533e | 705 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 706 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 707 | } |
IanBenzMaxim | 21:00c94aeb533e | 708 | |
IanBenzMaxim | 21:00c94aeb533e | 709 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 710 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 711 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 712 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 713 | { |
IanBenzMaxim | 21:00c94aeb533e | 714 | status = m_I2C_interface.read(status & STATUS_1WB); |
IanBenzMaxim | 21:00c94aeb533e | 715 | } |
IanBenzMaxim | 21:00c94aeb533e | 716 | |
IanBenzMaxim | 21:00c94aeb533e | 717 | // one last read with NACK |
IanBenzMaxim | 21:00c94aeb533e | 718 | m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 719 | |
IanBenzMaxim | 21:00c94aeb533e | 720 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 721 | |
IanBenzMaxim | 21:00c94aeb533e | 722 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 723 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 724 | { |
IanBenzMaxim | 21:00c94aeb533e | 725 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 726 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 727 | Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 728 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 729 | } |
IanBenzMaxim | 21:00c94aeb533e | 730 | |
IanBenzMaxim | 21:00c94aeb533e | 731 | // return status byte |
IanBenzMaxim | 21:00c94aeb533e | 732 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 733 | } |
IanBenzMaxim | 21:00c94aeb533e | 734 | |
IanBenzMaxim | 21:00c94aeb533e | 735 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 736 | // The 'OWSearch' function does a general search. This function |
IanBenzMaxim | 21:00c94aeb533e | 737 | // continues from the previos search state. The search state |
IanBenzMaxim | 21:00c94aeb533e | 738 | // can be reset by using the 'OWFirst' function. |
IanBenzMaxim | 21:00c94aeb533e | 739 | // This function contains one parameter 'alarm_only'. |
IanBenzMaxim | 21:00c94aeb533e | 740 | // When 'alarm_only' is true (1) the find alarm command |
IanBenzMaxim | 21:00c94aeb533e | 741 | // 0xEC is sent instead of the normal search command 0xF0. |
IanBenzMaxim | 21:00c94aeb533e | 742 | // Using the find alarm command 0xEC will limit the search to only |
IanBenzMaxim | 21:00c94aeb533e | 743 | // 1-Wire devices that are in an 'alarm' state. |
IanBenzMaxim | 21:00c94aeb533e | 744 | // |
IanBenzMaxim | 21:00c94aeb533e | 745 | // Returns: true (1) : when a 1-Wire device was found and it's |
IanBenzMaxim | 21:00c94aeb533e | 746 | // Serial Number placed in the global ROM |
IanBenzMaxim | 21:00c94aeb533e | 747 | // false (0): when no new device was found. Either the |
IanBenzMaxim | 21:00c94aeb533e | 748 | // last search was the last device or there |
IanBenzMaxim | 21:00c94aeb533e | 749 | // are no devices on the 1-Wire Net. |
IanBenzMaxim | 21:00c94aeb533e | 750 | // |
IanBenzMaxim | 21:00c94aeb533e | 751 | OneWireMaster::CmdResult DS2465::OWSearch(RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 752 | { |
IanBenzMaxim | 21:00c94aeb533e | 753 | int id_bit_number; |
IanBenzMaxim | 21:00c94aeb533e | 754 | int last_zero, rom_byte_number; |
IanBenzMaxim | 21:00c94aeb533e | 755 | int id_bit, cmp_id_bit; |
IanBenzMaxim | 21:00c94aeb533e | 756 | unsigned char rom_byte_mask, status; |
IanBenzMaxim | 21:00c94aeb533e | 757 | bool search_result; |
IanBenzMaxim | 21:00c94aeb533e | 758 | unsigned char crc8 = 0; |
IanBenzMaxim | 21:00c94aeb533e | 759 | Direction search_direction; |
IanBenzMaxim | 21:00c94aeb533e | 760 | |
IanBenzMaxim | 21:00c94aeb533e | 761 | // initialize for search |
IanBenzMaxim | 21:00c94aeb533e | 762 | id_bit_number = 1; |
IanBenzMaxim | 21:00c94aeb533e | 763 | last_zero = 0; |
IanBenzMaxim | 21:00c94aeb533e | 764 | rom_byte_number = 0; |
IanBenzMaxim | 21:00c94aeb533e | 765 | rom_byte_mask = 1; |
IanBenzMaxim | 21:00c94aeb533e | 766 | search_result = false; |
IanBenzMaxim | 21:00c94aeb533e | 767 | |
IanBenzMaxim | 21:00c94aeb533e | 768 | // if the last call was not the last one |
IanBenzMaxim | 21:00c94aeb533e | 769 | if (!m_lastDeviceFlag) |
IanBenzMaxim | 21:00c94aeb533e | 770 | { |
IanBenzMaxim | 21:00c94aeb533e | 771 | // 1-Wire reset |
IanBenzMaxim | 21:00c94aeb533e | 772 | OneWireMaster::CmdResult result = OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 773 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 774 | { |
IanBenzMaxim | 21:00c94aeb533e | 775 | // reset the search |
IanBenzMaxim | 21:00c94aeb533e | 776 | m_lastDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 777 | m_lastDeviceFlag = false; |
IanBenzMaxim | 21:00c94aeb533e | 778 | m_lastFamilyDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 779 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 780 | } |
IanBenzMaxim | 21:00c94aeb533e | 781 | |
IanBenzMaxim | 21:00c94aeb533e | 782 | // issue the search command |
IanBenzMaxim | 21:00c94aeb533e | 783 | OWWriteByte(0xF0); |
IanBenzMaxim | 21:00c94aeb533e | 784 | |
IanBenzMaxim | 21:00c94aeb533e | 785 | // loop to do the search |
IanBenzMaxim | 21:00c94aeb533e | 786 | do |
IanBenzMaxim | 21:00c94aeb533e | 787 | { |
IanBenzMaxim | 21:00c94aeb533e | 788 | // if this discrepancy if before the Last Discrepancy |
IanBenzMaxim | 21:00c94aeb533e | 789 | // on a previous next then pick the same as last time |
IanBenzMaxim | 21:00c94aeb533e | 790 | if (id_bit_number < m_lastDiscrepancy) |
IanBenzMaxim | 21:00c94aeb533e | 791 | { |
IanBenzMaxim | 21:00c94aeb533e | 792 | if ((romId[rom_byte_number] & rom_byte_mask) > 0) |
IanBenzMaxim | 21:00c94aeb533e | 793 | search_direction = DIRECTION_WRITE_ONE; |
IanBenzMaxim | 21:00c94aeb533e | 794 | else |
IanBenzMaxim | 21:00c94aeb533e | 795 | search_direction = DIRECTION_WRITE_ZERO; |
IanBenzMaxim | 21:00c94aeb533e | 796 | } |
IanBenzMaxim | 21:00c94aeb533e | 797 | else |
IanBenzMaxim | 21:00c94aeb533e | 798 | { |
IanBenzMaxim | 21:00c94aeb533e | 799 | // if equal to last pick 1, if not then pick 0 |
IanBenzMaxim | 21:00c94aeb533e | 800 | if (id_bit_number == m_lastDiscrepancy) |
IanBenzMaxim | 21:00c94aeb533e | 801 | search_direction = DIRECTION_WRITE_ONE; |
IanBenzMaxim | 21:00c94aeb533e | 802 | else |
IanBenzMaxim | 21:00c94aeb533e | 803 | search_direction = DIRECTION_WRITE_ZERO; |
IanBenzMaxim | 21:00c94aeb533e | 804 | } |
IanBenzMaxim | 21:00c94aeb533e | 805 | |
IanBenzMaxim | 21:00c94aeb533e | 806 | // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit |
IanBenzMaxim | 21:00c94aeb533e | 807 | Triplet(search_direction, status); |
IanBenzMaxim | 21:00c94aeb533e | 808 | |
IanBenzMaxim | 21:00c94aeb533e | 809 | // check bit results in status byte |
IanBenzMaxim | 21:00c94aeb533e | 810 | id_bit = ((status & STATUS_SBR) == STATUS_SBR); |
IanBenzMaxim | 21:00c94aeb533e | 811 | cmp_id_bit = ((status & STATUS_TSB) == STATUS_TSB); |
IanBenzMaxim | 21:00c94aeb533e | 812 | search_direction = ((status & STATUS_DIR) == STATUS_DIR) ? DIRECTION_WRITE_ONE : DIRECTION_WRITE_ZERO; |
IanBenzMaxim | 21:00c94aeb533e | 813 | |
IanBenzMaxim | 21:00c94aeb533e | 814 | // check for no devices on 1-wire |
IanBenzMaxim | 21:00c94aeb533e | 815 | if ((id_bit) && (cmp_id_bit)) |
IanBenzMaxim | 21:00c94aeb533e | 816 | break; |
IanBenzMaxim | 21:00c94aeb533e | 817 | else |
IanBenzMaxim | 21:00c94aeb533e | 818 | { |
IanBenzMaxim | 21:00c94aeb533e | 819 | if ((!id_bit) && (!cmp_id_bit) && (search_direction == DIRECTION_WRITE_ZERO)) |
IanBenzMaxim | 21:00c94aeb533e | 820 | { |
IanBenzMaxim | 21:00c94aeb533e | 821 | last_zero = id_bit_number; |
IanBenzMaxim | 21:00c94aeb533e | 822 | |
IanBenzMaxim | 21:00c94aeb533e | 823 | // check for Last discrepancy in family |
IanBenzMaxim | 21:00c94aeb533e | 824 | if (last_zero < 9) |
IanBenzMaxim | 21:00c94aeb533e | 825 | m_lastFamilyDiscrepancy = last_zero; |
IanBenzMaxim | 21:00c94aeb533e | 826 | } |
IanBenzMaxim | 21:00c94aeb533e | 827 | |
IanBenzMaxim | 21:00c94aeb533e | 828 | // set or clear the bit in the ROM byte rom_byte_number |
IanBenzMaxim | 21:00c94aeb533e | 829 | // with mask rom_byte_mask |
IanBenzMaxim | 21:00c94aeb533e | 830 | if (search_direction == DIRECTION_WRITE_ONE) |
IanBenzMaxim | 21:00c94aeb533e | 831 | romId[rom_byte_number] |= rom_byte_mask; |
IanBenzMaxim | 21:00c94aeb533e | 832 | else |
IanBenzMaxim | 21:00c94aeb533e | 833 | romId[rom_byte_number] &= (unsigned char)~rom_byte_mask; |
IanBenzMaxim | 21:00c94aeb533e | 834 | |
IanBenzMaxim | 21:00c94aeb533e | 835 | // increment the byte counter id_bit_number |
IanBenzMaxim | 21:00c94aeb533e | 836 | // and shift the mask rom_byte_mask |
IanBenzMaxim | 21:00c94aeb533e | 837 | id_bit_number++; |
IanBenzMaxim | 21:00c94aeb533e | 838 | rom_byte_mask <<= 1; |
IanBenzMaxim | 21:00c94aeb533e | 839 | |
IanBenzMaxim | 21:00c94aeb533e | 840 | // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask |
IanBenzMaxim | 21:00c94aeb533e | 841 | if (rom_byte_mask == 0) |
IanBenzMaxim | 21:00c94aeb533e | 842 | { |
IanBenzMaxim | 21:00c94aeb533e | 843 | crc8 = RomId::calculateCRC8(crc8, romId[rom_byte_number]); // accumulate the CRC |
IanBenzMaxim | 21:00c94aeb533e | 844 | rom_byte_number++; |
IanBenzMaxim | 21:00c94aeb533e | 845 | rom_byte_mask = 1; |
IanBenzMaxim | 21:00c94aeb533e | 846 | } |
IanBenzMaxim | 21:00c94aeb533e | 847 | } |
IanBenzMaxim | 21:00c94aeb533e | 848 | } |
IanBenzMaxim | 21:00c94aeb533e | 849 | while(rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7 |
IanBenzMaxim | 21:00c94aeb533e | 850 | |
IanBenzMaxim | 21:00c94aeb533e | 851 | // if the search was successful then |
IanBenzMaxim | 21:00c94aeb533e | 852 | if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0))) |
IanBenzMaxim | 21:00c94aeb533e | 853 | { |
IanBenzMaxim | 21:00c94aeb533e | 854 | // search successful so set m_lastDiscrepancy,m_lastDeviceFlag,search_result |
IanBenzMaxim | 21:00c94aeb533e | 855 | m_lastDiscrepancy = last_zero; |
IanBenzMaxim | 21:00c94aeb533e | 856 | |
IanBenzMaxim | 21:00c94aeb533e | 857 | // check for last device |
IanBenzMaxim | 21:00c94aeb533e | 858 | if (m_lastDiscrepancy == 0) |
IanBenzMaxim | 21:00c94aeb533e | 859 | m_lastDeviceFlag = true; |
IanBenzMaxim | 21:00c94aeb533e | 860 | |
IanBenzMaxim | 21:00c94aeb533e | 861 | search_result = true; |
IanBenzMaxim | 21:00c94aeb533e | 862 | } |
IanBenzMaxim | 21:00c94aeb533e | 863 | } |
IanBenzMaxim | 21:00c94aeb533e | 864 | |
IanBenzMaxim | 21:00c94aeb533e | 865 | // if no device found then reset counters so next 'search' will be like a first |
IanBenzMaxim | 21:00c94aeb533e | 866 | if (!search_result || (romId.familyCode() == 0)) |
IanBenzMaxim | 21:00c94aeb533e | 867 | { |
IanBenzMaxim | 21:00c94aeb533e | 868 | m_lastDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 869 | m_lastDeviceFlag = false; |
IanBenzMaxim | 21:00c94aeb533e | 870 | m_lastFamilyDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 871 | search_result = false; |
IanBenzMaxim | 21:00c94aeb533e | 872 | } |
IanBenzMaxim | 21:00c94aeb533e | 873 | |
IanBenzMaxim | 21:00c94aeb533e | 874 | return search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 875 | } |
IanBenzMaxim | 21:00c94aeb533e | 876 | |
IanBenzMaxim | 21:00c94aeb533e | 877 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 878 | // Find the 'first' devices on the 1-Wire network |
IanBenzMaxim | 21:00c94aeb533e | 879 | // Return true : device found, ROM number in ROM_NO buffer |
IanBenzMaxim | 21:00c94aeb533e | 880 | // false : no device present |
IanBenzMaxim | 21:00c94aeb533e | 881 | // |
IanBenzMaxim | 21:00c94aeb533e | 882 | OneWireMaster::CmdResult DS2465::OWFirst(RomId & romId) |
IanBenzMaxim | 21:00c94aeb533e | 883 | { |
IanBenzMaxim | 21:00c94aeb533e | 884 | // reset the search state |
IanBenzMaxim | 21:00c94aeb533e | 885 | m_lastDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 886 | m_lastDeviceFlag = false; |
IanBenzMaxim | 21:00c94aeb533e | 887 | m_lastFamilyDiscrepancy = 0; |
IanBenzMaxim | 21:00c94aeb533e | 888 | |
IanBenzMaxim | 21:00c94aeb533e | 889 | return OWSearch(romId); |
IanBenzMaxim | 21:00c94aeb533e | 890 | } |
IanBenzMaxim | 21:00c94aeb533e | 891 | |
IanBenzMaxim | 21:00c94aeb533e | 892 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 893 | // The 'OWReadBlock' receives a block of data from the |
IanBenzMaxim | 21:00c94aeb533e | 894 | // 1-Wire Net. The destination is the mac buffer (rx_mac=1) or |
IanBenzMaxim | 21:00c94aeb533e | 895 | // the scratchpad (rx_mac=0). The result is buffer is returned. |
IanBenzMaxim | 21:00c94aeb533e | 896 | // |
IanBenzMaxim | 21:00c94aeb533e | 897 | // 'rx_buf' - pointer to a block to receive bytes |
IanBenzMaxim | 21:00c94aeb533e | 898 | // of length 'rx_len' from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 899 | // 'rx_len' - length in bytes to read. Only valid numbers are 8,16,20,32; |
IanBenzMaxim | 21:00c94aeb533e | 900 | // |
IanBenzMaxim | 21:00c94aeb533e | 901 | OneWireMaster::CmdResult DS2465::OWReadBlock(uint8_t *rx_buf, uint8_t rx_len) |
IanBenzMaxim | 21:00c94aeb533e | 902 | { |
IanBenzMaxim | 21:00c94aeb533e | 903 | uint8_t status; |
IanBenzMaxim | 21:00c94aeb533e | 904 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 905 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 906 | |
IanBenzMaxim | 21:00c94aeb533e | 907 | // 1-Wire Receive Block (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 908 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRF [A] PR [A] P |
IanBenzMaxim | 21:00c94aeb533e | 909 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 910 | // PR indicates byte containing parameter |
IanBenzMaxim | 21:00c94aeb533e | 911 | |
IanBenzMaxim | 21:00c94aeb533e | 912 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 913 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 914 | { |
IanBenzMaxim | 21:00c94aeb533e | 915 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 916 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 917 | } |
IanBenzMaxim | 21:00c94aeb533e | 918 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 919 | { |
IanBenzMaxim | 21:00c94aeb533e | 920 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 921 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 922 | } |
IanBenzMaxim | 21:00c94aeb533e | 923 | if (m_I2C_interface.write(CMD_1WRF) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 924 | { |
IanBenzMaxim | 21:00c94aeb533e | 925 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 926 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 927 | } |
IanBenzMaxim | 21:00c94aeb533e | 928 | if (m_I2C_interface.write((unsigned char)rx_len) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 929 | { |
IanBenzMaxim | 21:00c94aeb533e | 930 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 931 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 932 | } |
IanBenzMaxim | 21:00c94aeb533e | 933 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 934 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 935 | |
IanBenzMaxim | 21:00c94aeb533e | 936 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 937 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 938 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 939 | { |
IanBenzMaxim | 21:00c94aeb533e | 940 | result = ReadMemory(ADDR_STATUS_REG, &status, 1, false); |
IanBenzMaxim | 21:00c94aeb533e | 941 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 942 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 943 | } |
IanBenzMaxim | 21:00c94aeb533e | 944 | |
IanBenzMaxim | 21:00c94aeb533e | 945 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 946 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 947 | { |
IanBenzMaxim | 21:00c94aeb533e | 948 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 949 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 950 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 951 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 952 | } |
IanBenzMaxim | 21:00c94aeb533e | 953 | |
IanBenzMaxim | 21:00c94aeb533e | 954 | result = ReadMemory(ADDR_SPAD, rx_buf, rx_len, false); |
IanBenzMaxim | 21:00c94aeb533e | 955 | |
IanBenzMaxim | 21:00c94aeb533e | 956 | // read out the data |
IanBenzMaxim | 21:00c94aeb533e | 957 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 958 | } |
IanBenzMaxim | 21:00c94aeb533e | 959 | |
IanBenzMaxim | 21:00c94aeb533e | 960 | |
IanBenzMaxim | 21:00c94aeb533e | 961 | |
IanBenzMaxim | 21:00c94aeb533e | 962 | |
IanBenzMaxim | 21:00c94aeb533e | 963 | OneWireMaster::CmdResult DS2465::OWWriteBlock(const uint8_t *tran_buf, uint8_t tran_len) |
IanBenzMaxim | 21:00c94aeb533e | 964 | { |
IanBenzMaxim | 21:00c94aeb533e | 965 | return OWWriteBlock(false, tran_buf, tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 966 | } |
IanBenzMaxim | 21:00c94aeb533e | 967 | |
IanBenzMaxim | 21:00c94aeb533e | 968 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 969 | // The 'OWWriteBlock' transfers a block of data to the |
IanBenzMaxim | 21:00c94aeb533e | 970 | // 1-Wire Net. The mac buffer can be sent (tx_mac=1) or a |
IanBenzMaxim | 21:00c94aeb533e | 971 | // portion of the scratchpad can be sent. |
IanBenzMaxim | 21:00c94aeb533e | 972 | // |
IanBenzMaxim | 21:00c94aeb533e | 973 | // 'tx_mac' - flag to indicate if the MAC buffer is to be sent (1) or |
IanBenzMaxim | 21:00c94aeb533e | 974 | // the data provided in teh tran_buf is to be sent (0) |
IanBenzMaxim | 21:00c94aeb533e | 975 | // 'tran_buf' - pointer to a block of bytes |
IanBenzMaxim | 21:00c94aeb533e | 976 | // of length 'tran_len' that will be sent |
IanBenzMaxim | 21:00c94aeb533e | 977 | // to the 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 978 | // 'tran_len' - length in bytes to transfer. Only valid numbers are 8,16,20,32; |
IanBenzMaxim | 21:00c94aeb533e | 979 | // |
IanBenzMaxim | 21:00c94aeb533e | 980 | OneWireMaster::CmdResult DS2465::OWWriteBlock(bool tx_mac, const uint8_t *tran_buf, uint8_t tran_len) |
IanBenzMaxim | 21:00c94aeb533e | 981 | { |
IanBenzMaxim | 21:00c94aeb533e | 982 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 983 | uint8_t par, status; |
IanBenzMaxim | 21:00c94aeb533e | 984 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 985 | |
IanBenzMaxim | 21:00c94aeb533e | 986 | // create parameter byte |
IanBenzMaxim | 21:00c94aeb533e | 987 | if (tx_mac) |
IanBenzMaxim | 21:00c94aeb533e | 988 | par = 0xFF; |
IanBenzMaxim | 21:00c94aeb533e | 989 | else |
IanBenzMaxim | 21:00c94aeb533e | 990 | { |
IanBenzMaxim | 21:00c94aeb533e | 991 | // scratchpad is source |
IanBenzMaxim | 21:00c94aeb533e | 992 | par = tran_len; |
IanBenzMaxim | 21:00c94aeb533e | 993 | |
IanBenzMaxim | 21:00c94aeb533e | 994 | // prefill scratchpad with required data |
IanBenzMaxim | 21:00c94aeb533e | 995 | result = WriteScratchpad(ADDR_SPAD, tran_buf, tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 996 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 997 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 998 | } |
IanBenzMaxim | 21:00c94aeb533e | 999 | |
IanBenzMaxim | 21:00c94aeb533e | 1000 | // 1-Wire Transmit Block (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 1001 | // S AD,0 [A] ADDR_CMD_REG [A] 1WTB [A] PR [A] P |
IanBenzMaxim | 21:00c94aeb533e | 1002 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1003 | // PR indicates byte containing parameter |
IanBenzMaxim | 21:00c94aeb533e | 1004 | |
IanBenzMaxim | 21:00c94aeb533e | 1005 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1006 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1007 | { |
IanBenzMaxim | 21:00c94aeb533e | 1008 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1009 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1010 | } |
IanBenzMaxim | 21:00c94aeb533e | 1011 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1012 | { |
IanBenzMaxim | 21:00c94aeb533e | 1013 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1014 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1015 | } |
IanBenzMaxim | 21:00c94aeb533e | 1016 | if (m_I2C_interface.write(CMD_1WTB) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1017 | { |
IanBenzMaxim | 21:00c94aeb533e | 1018 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1019 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1020 | } |
IanBenzMaxim | 21:00c94aeb533e | 1021 | if (m_I2C_interface.write(par) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1022 | { |
IanBenzMaxim | 21:00c94aeb533e | 1023 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1024 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1025 | } |
IanBenzMaxim | 21:00c94aeb533e | 1026 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1027 | |
IanBenzMaxim | 21:00c94aeb533e | 1028 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 1029 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1030 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 1031 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 1032 | { |
IanBenzMaxim | 21:00c94aeb533e | 1033 | result = ReadMemory(ADDR_STATUS_REG, &status, 1, false); |
IanBenzMaxim | 21:00c94aeb533e | 1034 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 1035 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1036 | } |
IanBenzMaxim | 21:00c94aeb533e | 1037 | |
IanBenzMaxim | 21:00c94aeb533e | 1038 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1039 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1040 | { |
IanBenzMaxim | 21:00c94aeb533e | 1041 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1042 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1043 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1044 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1045 | } |
IanBenzMaxim | 21:00c94aeb533e | 1046 | |
IanBenzMaxim | 21:00c94aeb533e | 1047 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1048 | } |
IanBenzMaxim | 21:00c94aeb533e | 1049 | |
IanBenzMaxim | 21:00c94aeb533e | 1050 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1051 | // The 'OWBlock' transfers a block of data to and from the |
IanBenzMaxim | 21:00c94aeb533e | 1052 | // 1-Wire Net. The result is returned in the same buffer. |
IanBenzMaxim | 21:00c94aeb533e | 1053 | // |
IanBenzMaxim | 21:00c94aeb533e | 1054 | // 'tran_buf' - pointer to a block of unsigned |
IanBenzMaxim | 21:00c94aeb533e | 1055 | // chars of length 'tran_len' that will be sent |
IanBenzMaxim | 21:00c94aeb533e | 1056 | // to the 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 1057 | // 'tran_len' - length in bytes to transfer |
IanBenzMaxim | 21:00c94aeb533e | 1058 | // |
IanBenzMaxim | 21:00c94aeb533e | 1059 | OneWireMaster::CmdResult DS2465::OWBlock(uint8_t *tran_buf, uint8_t tran_len) |
IanBenzMaxim | 21:00c94aeb533e | 1060 | { |
IanBenzMaxim | 21:00c94aeb533e | 1061 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 1062 | for (uint8_t i = 0; i < tran_len; i++) |
IanBenzMaxim | 21:00c94aeb533e | 1063 | { |
IanBenzMaxim | 21:00c94aeb533e | 1064 | result = OWTouchByte(tran_buf[i]); |
IanBenzMaxim | 21:00c94aeb533e | 1065 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 1066 | break; |
IanBenzMaxim | 21:00c94aeb533e | 1067 | } |
IanBenzMaxim | 21:00c94aeb533e | 1068 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1069 | } |
IanBenzMaxim | 21:00c94aeb533e | 1070 | |
IanBenzMaxim | 21:00c94aeb533e | 1071 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1072 | // Send 8 bits of communication to the 1-Wire Net and return the |
IanBenzMaxim | 21:00c94aeb533e | 1073 | // result 8 bits read from the 1-Wire Net. The parameter 'sendbyte' |
IanBenzMaxim | 21:00c94aeb533e | 1074 | // least significant 8 bits are used and the least significant 8 bits |
IanBenzMaxim | 21:00c94aeb533e | 1075 | // of the result is the return byte. |
IanBenzMaxim | 21:00c94aeb533e | 1076 | // |
IanBenzMaxim | 21:00c94aeb533e | 1077 | // 'sendbyte' - 8 bits to send (least significant byte) |
IanBenzMaxim | 21:00c94aeb533e | 1078 | // |
IanBenzMaxim | 21:00c94aeb533e | 1079 | // Returns: 8 bits read from sendbyte |
IanBenzMaxim | 21:00c94aeb533e | 1080 | // |
IanBenzMaxim | 21:00c94aeb533e | 1081 | OneWireMaster::CmdResult DS2465::OWTouchByte(uint8_t & sendrecvbyte) |
IanBenzMaxim | 21:00c94aeb533e | 1082 | { |
IanBenzMaxim | 21:00c94aeb533e | 1083 | OneWireMaster::CmdResult result = OWWriteByte(sendrecvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 1084 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 1085 | OWReadByte(sendrecvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 1086 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1087 | } |
IanBenzMaxim | 21:00c94aeb533e | 1088 | |
IanBenzMaxim | 21:00c94aeb533e | 1089 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1090 | // Send 8 bits of read communication to the 1-Wire Net and return the |
IanBenzMaxim | 21:00c94aeb533e | 1091 | // result 8 bits read from the 1-Wire Net. |
IanBenzMaxim | 21:00c94aeb533e | 1092 | // |
IanBenzMaxim | 21:00c94aeb533e | 1093 | // Returns: 8 bits read from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 1094 | // |
IanBenzMaxim | 21:00c94aeb533e | 1095 | OneWireMaster::CmdResult DS2465::OWReadByte(uint8_t & recvbyte) |
IanBenzMaxim | 21:00c94aeb533e | 1096 | { |
IanBenzMaxim | 21:00c94aeb533e | 1097 | uint8_t status; |
IanBenzMaxim | 21:00c94aeb533e | 1098 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1099 | |
IanBenzMaxim | 21:00c94aeb533e | 1100 | // 1-Wire Read Bytes (Case C) |
IanBenzMaxim | 21:00c94aeb533e | 1101 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A\ |
IanBenzMaxim | 21:00c94aeb533e | 1102 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 1103 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 1104 | // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1105 | // |
IanBenzMaxim | 21:00c94aeb533e | 1106 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1107 | // DD data read |
IanBenzMaxim | 21:00c94aeb533e | 1108 | |
IanBenzMaxim | 21:00c94aeb533e | 1109 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1110 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1111 | { |
IanBenzMaxim | 21:00c94aeb533e | 1112 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1113 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1114 | } |
IanBenzMaxim | 21:00c94aeb533e | 1115 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1116 | { |
IanBenzMaxim | 21:00c94aeb533e | 1117 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1118 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1119 | } |
IanBenzMaxim | 21:00c94aeb533e | 1120 | if (m_I2C_interface.write(CMD_1WRB) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1121 | { |
IanBenzMaxim | 21:00c94aeb533e | 1122 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1123 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1124 | } |
IanBenzMaxim | 21:00c94aeb533e | 1125 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1126 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1127 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1128 | |
IanBenzMaxim | 21:00c94aeb533e | 1129 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 1130 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1131 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 1132 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 1133 | { |
IanBenzMaxim | 21:00c94aeb533e | 1134 | status = m_I2C_interface.read(m_I2C_interface.ACK); |
IanBenzMaxim | 21:00c94aeb533e | 1135 | } |
IanBenzMaxim | 21:00c94aeb533e | 1136 | |
IanBenzMaxim | 21:00c94aeb533e | 1137 | // one last read with NACK |
IanBenzMaxim | 21:00c94aeb533e | 1138 | m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1139 | |
IanBenzMaxim | 21:00c94aeb533e | 1140 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1141 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1142 | { |
IanBenzMaxim | 21:00c94aeb533e | 1143 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1144 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1145 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1146 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1147 | } |
IanBenzMaxim | 21:00c94aeb533e | 1148 | |
IanBenzMaxim | 21:00c94aeb533e | 1149 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1150 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1151 | { |
IanBenzMaxim | 21:00c94aeb533e | 1152 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1153 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1154 | } |
IanBenzMaxim | 21:00c94aeb533e | 1155 | if (m_I2C_interface.write(ADDR_DATA_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1156 | { |
IanBenzMaxim | 21:00c94aeb533e | 1157 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1158 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1159 | } |
IanBenzMaxim | 21:00c94aeb533e | 1160 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1161 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1162 | { |
IanBenzMaxim | 21:00c94aeb533e | 1163 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1164 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1165 | } |
IanBenzMaxim | 21:00c94aeb533e | 1166 | recvbyte = m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1167 | |
IanBenzMaxim | 21:00c94aeb533e | 1168 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1169 | |
IanBenzMaxim | 21:00c94aeb533e | 1170 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1171 | } |
IanBenzMaxim | 21:00c94aeb533e | 1172 | |
IanBenzMaxim | 21:00c94aeb533e | 1173 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1174 | // Send 8 bits of communication to the 1-Wire Net and verify that the |
IanBenzMaxim | 21:00c94aeb533e | 1175 | // 8 bits read from the 1-Wire Net is the same (write operation). |
IanBenzMaxim | 21:00c94aeb533e | 1176 | // The parameter 'sendbyte' least significant 8 bits are used. |
IanBenzMaxim | 21:00c94aeb533e | 1177 | // |
IanBenzMaxim | 21:00c94aeb533e | 1178 | // 'sendbyte' - 8 bits to send (least significant byte) |
IanBenzMaxim | 21:00c94aeb533e | 1179 | // |
IanBenzMaxim | 21:00c94aeb533e | 1180 | // Returns: true: bytes written and echo was the same |
IanBenzMaxim | 21:00c94aeb533e | 1181 | // false: echo was not the same |
IanBenzMaxim | 21:00c94aeb533e | 1182 | // |
IanBenzMaxim | 21:00c94aeb533e | 1183 | OneWireMaster::CmdResult DS2465::OWWriteByte(uint8_t sendbyte) |
IanBenzMaxim | 21:00c94aeb533e | 1184 | { |
IanBenzMaxim | 21:00c94aeb533e | 1185 | uint8_t status; |
IanBenzMaxim | 21:00c94aeb533e | 1186 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1187 | |
IanBenzMaxim | 21:00c94aeb533e | 1188 | // 1-Wire Write Byte (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 1189 | // S AD,0 [A] ADDR_CMD_REG [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1190 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 1191 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 1192 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1193 | // DD data to write |
IanBenzMaxim | 21:00c94aeb533e | 1194 | |
IanBenzMaxim | 21:00c94aeb533e | 1195 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1196 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1197 | { |
IanBenzMaxim | 21:00c94aeb533e | 1198 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1199 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1200 | } |
IanBenzMaxim | 21:00c94aeb533e | 1201 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1202 | { |
IanBenzMaxim | 21:00c94aeb533e | 1203 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1204 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1205 | } |
IanBenzMaxim | 21:00c94aeb533e | 1206 | if (m_I2C_interface.write(CMD_1WWB) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1207 | { |
IanBenzMaxim | 21:00c94aeb533e | 1208 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1209 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1210 | } |
IanBenzMaxim | 21:00c94aeb533e | 1211 | if (m_I2C_interface.write(sendbyte) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1212 | { |
IanBenzMaxim | 21:00c94aeb533e | 1213 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1214 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1215 | } |
IanBenzMaxim | 21:00c94aeb533e | 1216 | |
IanBenzMaxim | 21:00c94aeb533e | 1217 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1218 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1219 | { |
IanBenzMaxim | 21:00c94aeb533e | 1220 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1221 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1222 | } |
IanBenzMaxim | 21:00c94aeb533e | 1223 | |
IanBenzMaxim | 21:00c94aeb533e | 1224 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 1225 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1226 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 1227 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 1228 | { |
IanBenzMaxim | 21:00c94aeb533e | 1229 | status = m_I2C_interface.read(m_I2C_interface.ACK); |
IanBenzMaxim | 21:00c94aeb533e | 1230 | } |
IanBenzMaxim | 21:00c94aeb533e | 1231 | |
IanBenzMaxim | 21:00c94aeb533e | 1232 | // one last read with NACK |
IanBenzMaxim | 21:00c94aeb533e | 1233 | m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1234 | |
IanBenzMaxim | 21:00c94aeb533e | 1235 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1236 | |
IanBenzMaxim | 21:00c94aeb533e | 1237 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1238 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1239 | { |
IanBenzMaxim | 21:00c94aeb533e | 1240 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1241 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1242 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1243 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1244 | } |
IanBenzMaxim | 21:00c94aeb533e | 1245 | |
IanBenzMaxim | 21:00c94aeb533e | 1246 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1247 | } |
IanBenzMaxim | 21:00c94aeb533e | 1248 | |
IanBenzMaxim | 21:00c94aeb533e | 1249 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1250 | // Send 1 bit of communication to the 1-Wire Net and return the |
IanBenzMaxim | 21:00c94aeb533e | 1251 | // result 1 bit read from the 1-Wire Net. The parameter 'sendbit' |
IanBenzMaxim | 21:00c94aeb533e | 1252 | // least significant bit is used and the least significant bit |
IanBenzMaxim | 21:00c94aeb533e | 1253 | // of the result is the return bit. |
IanBenzMaxim | 21:00c94aeb533e | 1254 | // |
IanBenzMaxim | 21:00c94aeb533e | 1255 | // 'sendbit' - the least significant bit is the bit to send |
IanBenzMaxim | 21:00c94aeb533e | 1256 | // |
IanBenzMaxim | 21:00c94aeb533e | 1257 | // Returns: 0: 0 bit read from sendbit |
IanBenzMaxim | 21:00c94aeb533e | 1258 | // 1: 1 bit read from sendbit |
IanBenzMaxim | 21:00c94aeb533e | 1259 | // |
IanBenzMaxim | 21:00c94aeb533e | 1260 | OneWireMaster::CmdResult DS2465::OWTouchBit(uint8_t & sendrecvbit) |
IanBenzMaxim | 21:00c94aeb533e | 1261 | { |
IanBenzMaxim | 21:00c94aeb533e | 1262 | unsigned char status; |
IanBenzMaxim | 21:00c94aeb533e | 1263 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1264 | |
IanBenzMaxim | 21:00c94aeb533e | 1265 | // 1-Wire bit (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 1266 | // S AD,0 [A] ADDR_CMD_REG [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1267 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 1268 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 1269 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1270 | // BB indicates byte containing bit value in msbit |
IanBenzMaxim | 21:00c94aeb533e | 1271 | |
IanBenzMaxim | 21:00c94aeb533e | 1272 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1273 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1274 | { |
IanBenzMaxim | 21:00c94aeb533e | 1275 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1276 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1277 | } |
IanBenzMaxim | 21:00c94aeb533e | 1278 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1279 | { |
IanBenzMaxim | 21:00c94aeb533e | 1280 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1281 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1282 | } |
IanBenzMaxim | 21:00c94aeb533e | 1283 | if (m_I2C_interface.write(CMD_1WSB) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1284 | { |
IanBenzMaxim | 21:00c94aeb533e | 1285 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1286 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1287 | } |
IanBenzMaxim | 21:00c94aeb533e | 1288 | if (m_I2C_interface.write(sendrecvbit ? 0x80 : 0x00) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1289 | { |
IanBenzMaxim | 21:00c94aeb533e | 1290 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1291 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1292 | } |
IanBenzMaxim | 21:00c94aeb533e | 1293 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1294 | if (m_I2C_interface.write(m_I2C_address | I2C_READ) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1295 | { |
IanBenzMaxim | 21:00c94aeb533e | 1296 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1297 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1298 | } |
IanBenzMaxim | 21:00c94aeb533e | 1299 | |
IanBenzMaxim | 21:00c94aeb533e | 1300 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 1301 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1302 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 1303 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 1304 | { |
IanBenzMaxim | 21:00c94aeb533e | 1305 | status = m_I2C_interface.read(status & STATUS_1WB); |
IanBenzMaxim | 21:00c94aeb533e | 1306 | } |
IanBenzMaxim | 21:00c94aeb533e | 1307 | |
IanBenzMaxim | 21:00c94aeb533e | 1308 | // one last read with NACK |
IanBenzMaxim | 21:00c94aeb533e | 1309 | m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1310 | |
IanBenzMaxim | 21:00c94aeb533e | 1311 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1312 | |
IanBenzMaxim | 21:00c94aeb533e | 1313 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1314 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1315 | { |
IanBenzMaxim | 21:00c94aeb533e | 1316 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1317 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1318 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1319 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1320 | } |
IanBenzMaxim | 21:00c94aeb533e | 1321 | |
IanBenzMaxim | 21:00c94aeb533e | 1322 | // check bit state |
IanBenzMaxim | 21:00c94aeb533e | 1323 | sendrecvbit = (status & STATUS_SBR); |
IanBenzMaxim | 21:00c94aeb533e | 1324 | |
IanBenzMaxim | 21:00c94aeb533e | 1325 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1326 | } |
IanBenzMaxim | 21:00c94aeb533e | 1327 | |
IanBenzMaxim | 21:00c94aeb533e | 1328 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1329 | // Reads 1 bit of communication from the 1-Wire Net and returns the |
IanBenzMaxim | 21:00c94aeb533e | 1330 | // result |
IanBenzMaxim | 21:00c94aeb533e | 1331 | // |
IanBenzMaxim | 21:00c94aeb533e | 1332 | // Returns: 1 bit read from 1-Wire Net |
IanBenzMaxim | 21:00c94aeb533e | 1333 | // |
IanBenzMaxim | 21:00c94aeb533e | 1334 | OneWireMaster::CmdResult DS2465::OWReadBit(uint8_t & recvbit) |
IanBenzMaxim | 21:00c94aeb533e | 1335 | { |
IanBenzMaxim | 21:00c94aeb533e | 1336 | recvbit = 0x01; |
IanBenzMaxim | 21:00c94aeb533e | 1337 | return OWTouchBit(recvbit); |
IanBenzMaxim | 21:00c94aeb533e | 1338 | } |
IanBenzMaxim | 21:00c94aeb533e | 1339 | |
IanBenzMaxim | 21:00c94aeb533e | 1340 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1341 | // Send 1 bit of communication to the 1-Wire Net. |
IanBenzMaxim | 21:00c94aeb533e | 1342 | // The parameter 'sendbit' least significant bit is used. |
IanBenzMaxim | 21:00c94aeb533e | 1343 | // |
IanBenzMaxim | 21:00c94aeb533e | 1344 | // 'sendbit' - 1 bit to send (least significant byte) |
IanBenzMaxim | 21:00c94aeb533e | 1345 | // |
IanBenzMaxim | 21:00c94aeb533e | 1346 | OneWireMaster::CmdResult DS2465::OWWriteBit(uint8_t sendbit) |
IanBenzMaxim | 21:00c94aeb533e | 1347 | { |
IanBenzMaxim | 21:00c94aeb533e | 1348 | return OWTouchBit(sendbit); |
IanBenzMaxim | 21:00c94aeb533e | 1349 | } |
IanBenzMaxim | 21:00c94aeb533e | 1350 | |
IanBenzMaxim | 21:00c94aeb533e | 1351 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1352 | // |
IanBenzMaxim | 21:00c94aeb533e | 1353 | // |
IanBenzMaxim | 21:00c94aeb533e | 1354 | // |
IanBenzMaxim | 21:00c94aeb533e | 1355 | // |
IanBenzMaxim | 21:00c94aeb533e | 1356 | // |
IanBenzMaxim | 21:00c94aeb533e | 1357 | // |
IanBenzMaxim | 21:00c94aeb533e | 1358 | // |
IanBenzMaxim | 21:00c94aeb533e | 1359 | // Returns: |
IanBenzMaxim | 21:00c94aeb533e | 1360 | // |
IanBenzMaxim | 21:00c94aeb533e | 1361 | // |
IanBenzMaxim | 21:00c94aeb533e | 1362 | OneWireMaster::CmdResult DS2465::Write_Command_Reg(unsigned char cmd, unsigned char par, bool poll) const |
IanBenzMaxim | 21:00c94aeb533e | 1363 | { |
IanBenzMaxim | 21:00c94aeb533e | 1364 | int poll_count = 0, status; |
IanBenzMaxim | 21:00c94aeb533e | 1365 | |
IanBenzMaxim | 21:00c94aeb533e | 1366 | // Generic command |
IanBenzMaxim | 21:00c94aeb533e | 1367 | // S AD,0 [A] ADDR_CMD_REG [A] CMD [A] PP [A] P |
IanBenzMaxim | 21:00c94aeb533e | 1368 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1369 | // CMD command |
IanBenzMaxim | 21:00c94aeb533e | 1370 | // PP parameter |
IanBenzMaxim | 21:00c94aeb533e | 1371 | |
IanBenzMaxim | 21:00c94aeb533e | 1372 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1373 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1374 | { |
IanBenzMaxim | 21:00c94aeb533e | 1375 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1376 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1377 | } |
IanBenzMaxim | 21:00c94aeb533e | 1378 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1379 | { |
IanBenzMaxim | 21:00c94aeb533e | 1380 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1381 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1382 | } |
IanBenzMaxim | 21:00c94aeb533e | 1383 | if (m_I2C_interface.write(cmd) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1384 | { |
IanBenzMaxim | 21:00c94aeb533e | 1385 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1386 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1387 | } |
IanBenzMaxim | 21:00c94aeb533e | 1388 | if (m_I2C_interface.write(par) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1389 | { |
IanBenzMaxim | 21:00c94aeb533e | 1390 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1391 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1392 | } |
IanBenzMaxim | 21:00c94aeb533e | 1393 | |
IanBenzMaxim | 21:00c94aeb533e | 1394 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1395 | |
IanBenzMaxim | 21:00c94aeb533e | 1396 | poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1397 | if (poll) |
IanBenzMaxim | 21:00c94aeb533e | 1398 | { |
IanBenzMaxim | 21:00c94aeb533e | 1399 | // Poll for completion by checking for NAK on address |
IanBenzMaxim | 21:00c94aeb533e | 1400 | do |
IanBenzMaxim | 21:00c94aeb533e | 1401 | { |
IanBenzMaxim | 21:00c94aeb533e | 1402 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1403 | status = m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)); |
IanBenzMaxim | 21:00c94aeb533e | 1404 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1405 | } while ((status != I2C_WRITE_OK) && (poll_count++ < POLL_LIMIT)); |
IanBenzMaxim | 21:00c94aeb533e | 1406 | } |
IanBenzMaxim | 21:00c94aeb533e | 1407 | else |
IanBenzMaxim | 21:00c94aeb533e | 1408 | { |
IanBenzMaxim | 21:00c94aeb533e | 1409 | // delay instead of poll, longest operation (only for SHA compute) |
IanBenzMaxim | 21:00c94aeb533e | 1410 | wait_ms(SHA_COMPUTATION_DELAY * 2); |
IanBenzMaxim | 21:00c94aeb533e | 1411 | wait_ms(8); // Additional delay |
IanBenzMaxim | 21:00c94aeb533e | 1412 | } |
IanBenzMaxim | 21:00c94aeb533e | 1413 | |
IanBenzMaxim | 21:00c94aeb533e | 1414 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1415 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1416 | { |
IanBenzMaxim | 21:00c94aeb533e | 1417 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1418 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1419 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1420 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1421 | } |
IanBenzMaxim | 21:00c94aeb533e | 1422 | |
IanBenzMaxim | 21:00c94aeb533e | 1423 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1424 | } |
IanBenzMaxim | 21:00c94aeb533e | 1425 | |
IanBenzMaxim | 21:00c94aeb533e | 1426 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1427 | // Write to Scratchpad (SRAM) memory on the DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 1428 | // |
IanBenzMaxim | 21:00c94aeb533e | 1429 | // 'addr' - address to start writing (must be in SRAM) |
IanBenzMaxim | 21:00c94aeb533e | 1430 | // 'buf' - buffer of data to write |
IanBenzMaxim | 21:00c94aeb533e | 1431 | // 'len' - length to write |
IanBenzMaxim | 21:00c94aeb533e | 1432 | // |
IanBenzMaxim | 21:00c94aeb533e | 1433 | // Returns: true write successful |
IanBenzMaxim | 21:00c94aeb533e | 1434 | // false failure to complete write |
IanBenzMaxim | 21:00c94aeb533e | 1435 | // |
IanBenzMaxim | 21:00c94aeb533e | 1436 | OneWireMaster::CmdResult DS2465::WriteScratchpad(std::uint8_t addr, const std::uint8_t * buf, size_t bufLen) const |
IanBenzMaxim | 21:00c94aeb533e | 1437 | { |
IanBenzMaxim | 21:00c94aeb533e | 1438 | int i; |
IanBenzMaxim | 21:00c94aeb533e | 1439 | |
IanBenzMaxim | 21:00c94aeb533e | 1440 | // Write SRAM (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 1441 | // S AD,0 [A] VSA [A] DD [A] P |
IanBenzMaxim | 21:00c94aeb533e | 1442 | // \-----/ |
IanBenzMaxim | 21:00c94aeb533e | 1443 | // Repeat for each data byte |
IanBenzMaxim | 21:00c94aeb533e | 1444 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1445 | // VSA valid SRAM memory address |
IanBenzMaxim | 21:00c94aeb533e | 1446 | // DD memory data to write |
IanBenzMaxim | 21:00c94aeb533e | 1447 | |
IanBenzMaxim | 21:00c94aeb533e | 1448 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1449 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1450 | { |
IanBenzMaxim | 21:00c94aeb533e | 1451 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1452 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1453 | } |
IanBenzMaxim | 21:00c94aeb533e | 1454 | if (m_I2C_interface.write((unsigned char)addr) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1455 | { |
IanBenzMaxim | 21:00c94aeb533e | 1456 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1457 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1458 | } |
IanBenzMaxim | 21:00c94aeb533e | 1459 | // loop to write each byte |
IanBenzMaxim | 21:00c94aeb533e | 1460 | for (i = 0; i < bufLen; i++) |
IanBenzMaxim | 21:00c94aeb533e | 1461 | { |
IanBenzMaxim | 21:00c94aeb533e | 1462 | if (m_I2C_interface.write(buf[i]) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1463 | { |
IanBenzMaxim | 21:00c94aeb533e | 1464 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1465 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1466 | } |
IanBenzMaxim | 21:00c94aeb533e | 1467 | } |
IanBenzMaxim | 21:00c94aeb533e | 1468 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1469 | |
IanBenzMaxim | 21:00c94aeb533e | 1470 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1471 | } |
IanBenzMaxim | 21:00c94aeb533e | 1472 | |
IanBenzMaxim | 21:00c94aeb533e | 1473 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1474 | // Read memory from the DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 1475 | // |
IanBenzMaxim | 21:00c94aeb533e | 1476 | // 'addr' - address to start reading |
IanBenzMaxim | 21:00c94aeb533e | 1477 | // 'buf' - buffer to hold memory read |
IanBenzMaxim | 21:00c94aeb533e | 1478 | // 'len' - length to read |
IanBenzMaxim | 21:00c94aeb533e | 1479 | // 'skip_set_pointer' - flag to indicate to skip setting address pointer |
IanBenzMaxim | 21:00c94aeb533e | 1480 | // |
IanBenzMaxim | 21:00c94aeb533e | 1481 | // Returns: true read successful |
IanBenzMaxim | 21:00c94aeb533e | 1482 | // false failure to complete read |
IanBenzMaxim | 21:00c94aeb533e | 1483 | // |
IanBenzMaxim | 21:00c94aeb533e | 1484 | OneWireMaster::CmdResult DS2465::ReadMemory(std::uint8_t addr, std::uint8_t * buf, size_t bufLen, bool skip_set_pointer) const |
IanBenzMaxim | 21:00c94aeb533e | 1485 | { |
IanBenzMaxim | 21:00c94aeb533e | 1486 | int i; |
IanBenzMaxim | 21:00c94aeb533e | 1487 | |
IanBenzMaxim | 21:00c94aeb533e | 1488 | // Read (Case A) |
IanBenzMaxim | 21:00c94aeb533e | 1489 | // S AD,0 [A] MA [A] Sr AD,1 [A] [DD] A [DD] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1490 | // \-----/ |
IanBenzMaxim | 21:00c94aeb533e | 1491 | // Repeat for each data byte, NAK last byte |
IanBenzMaxim | 21:00c94aeb533e | 1492 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1493 | // MA memory address |
IanBenzMaxim | 21:00c94aeb533e | 1494 | // DD memory data read |
IanBenzMaxim | 21:00c94aeb533e | 1495 | |
IanBenzMaxim | 21:00c94aeb533e | 1496 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1497 | if (!skip_set_pointer) |
IanBenzMaxim | 21:00c94aeb533e | 1498 | { |
IanBenzMaxim | 21:00c94aeb533e | 1499 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1500 | { |
IanBenzMaxim | 21:00c94aeb533e | 1501 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1502 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1503 | } |
IanBenzMaxim | 21:00c94aeb533e | 1504 | if (m_I2C_interface.write((unsigned char)addr) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1505 | { |
IanBenzMaxim | 21:00c94aeb533e | 1506 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1507 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1508 | } |
IanBenzMaxim | 21:00c94aeb533e | 1509 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1510 | } |
IanBenzMaxim | 21:00c94aeb533e | 1511 | |
IanBenzMaxim | 21:00c94aeb533e | 1512 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1513 | { |
IanBenzMaxim | 21:00c94aeb533e | 1514 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1515 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1516 | } |
IanBenzMaxim | 21:00c94aeb533e | 1517 | // loop to read each byte, NAK last byte |
IanBenzMaxim | 21:00c94aeb533e | 1518 | for (i = 0; i < bufLen; i++) |
IanBenzMaxim | 21:00c94aeb533e | 1519 | { |
IanBenzMaxim | 21:00c94aeb533e | 1520 | buf[i] = m_I2C_interface.read((i == (bufLen - 1)) ? m_I2C_interface.NoACK : m_I2C_interface.ACK); |
IanBenzMaxim | 21:00c94aeb533e | 1521 | } |
IanBenzMaxim | 21:00c94aeb533e | 1522 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1523 | |
IanBenzMaxim | 21:00c94aeb533e | 1524 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1525 | } |
IanBenzMaxim | 21:00c94aeb533e | 1526 | |
IanBenzMaxim | 21:00c94aeb533e | 1527 | |
IanBenzMaxim | 21:00c94aeb533e | 1528 | |
IanBenzMaxim | 21:00c94aeb533e | 1529 | |
IanBenzMaxim | 21:00c94aeb533e | 1530 | |
IanBenzMaxim | 21:00c94aeb533e | 1531 | OneWireMaster::CmdResult DS2465::ReadOneWireConfig(OWConfigAddr addr, std::uint8_t & config) const |
IanBenzMaxim | 21:00c94aeb533e | 1532 | { |
IanBenzMaxim | 21:00c94aeb533e | 1533 | std::uint8_t buf; |
IanBenzMaxim | 21:00c94aeb533e | 1534 | OneWireMaster::CmdResult result = ReadMemory(addr, &buf, 1, false); |
IanBenzMaxim | 21:00c94aeb533e | 1535 | if (result == OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 1536 | config = buf; |
IanBenzMaxim | 21:00c94aeb533e | 1537 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1538 | } |
IanBenzMaxim | 21:00c94aeb533e | 1539 | |
IanBenzMaxim | 21:00c94aeb533e | 1540 | |
IanBenzMaxim | 21:00c94aeb533e | 1541 | |
IanBenzMaxim | 21:00c94aeb533e | 1542 | |
IanBenzMaxim | 21:00c94aeb533e | 1543 | |
IanBenzMaxim | 21:00c94aeb533e | 1544 | OneWireMaster::CmdResult DS2465::WriteOneWireConfig(OWConfigAddr addr, unsigned int ovr, unsigned int std) |
IanBenzMaxim | 21:00c94aeb533e | 1545 | { |
IanBenzMaxim | 21:00c94aeb533e | 1546 | std::uint8_t buf; |
IanBenzMaxim | 21:00c94aeb533e | 1547 | |
IanBenzMaxim | 21:00c94aeb533e | 1548 | // convert and write value |
IanBenzMaxim | 21:00c94aeb533e | 1549 | buf = (ovr << 4) | std; |
IanBenzMaxim | 21:00c94aeb533e | 1550 | return (WriteScratchpad(addr, &buf, 1)); |
IanBenzMaxim | 21:00c94aeb533e | 1551 | } |
IanBenzMaxim | 21:00c94aeb533e | 1552 | |
IanBenzMaxim | 21:00c94aeb533e | 1553 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1554 | // Write the configuration register in the DS2465. The configuration |
IanBenzMaxim | 21:00c94aeb533e | 1555 | // options are provided in the lower nibble of the provided config byte. |
IanBenzMaxim | 21:00c94aeb533e | 1556 | // The uppper nibble in bitwise inverted when written to the DS2465. |
IanBenzMaxim | 21:00c94aeb533e | 1557 | // |
IanBenzMaxim | 21:00c94aeb533e | 1558 | // Returns: true: config written and response correct |
IanBenzMaxim | 21:00c94aeb533e | 1559 | // false: response incorrect |
IanBenzMaxim | 21:00c94aeb533e | 1560 | // |
IanBenzMaxim | 21:00c94aeb533e | 1561 | OneWireMaster::CmdResult DS2465::Write_Config(uint8_t config) |
IanBenzMaxim | 21:00c94aeb533e | 1562 | { |
IanBenzMaxim | 21:00c94aeb533e | 1563 | unsigned char read_config; |
IanBenzMaxim | 21:00c94aeb533e | 1564 | |
IanBenzMaxim | 21:00c94aeb533e | 1565 | // Write configuration byte |
IanBenzMaxim | 21:00c94aeb533e | 1566 | // S AD,0 [A] ADDR_WCFG_REG [A] CONIG [A] P |
IanBenzMaxim | 21:00c94aeb533e | 1567 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1568 | // CF configuration byte to write |
IanBenzMaxim | 21:00c94aeb533e | 1569 | |
IanBenzMaxim | 21:00c94aeb533e | 1570 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1571 | |
IanBenzMaxim | 21:00c94aeb533e | 1572 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1573 | { |
IanBenzMaxim | 21:00c94aeb533e | 1574 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1575 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1576 | } |
IanBenzMaxim | 21:00c94aeb533e | 1577 | if (m_I2C_interface.write(ADDR_WCFG_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1578 | { |
IanBenzMaxim | 21:00c94aeb533e | 1579 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1580 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1581 | } |
IanBenzMaxim | 21:00c94aeb533e | 1582 | if (m_I2C_interface.write((unsigned char)(config | (~config << 4))) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1583 | { |
IanBenzMaxim | 21:00c94aeb533e | 1584 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1585 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1586 | } |
IanBenzMaxim | 21:00c94aeb533e | 1587 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1588 | |
IanBenzMaxim | 21:00c94aeb533e | 1589 | // read it back to confirm |
IanBenzMaxim | 21:00c94aeb533e | 1590 | // S AD,0 [A] ADDR_WCFG_REG [A] Sr AD,1 [A] [CF] A\ |
IanBenzMaxim | 21:00c94aeb533e | 1591 | |
IanBenzMaxim | 21:00c94aeb533e | 1592 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1593 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1594 | { |
IanBenzMaxim | 21:00c94aeb533e | 1595 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1596 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1597 | } |
IanBenzMaxim | 21:00c94aeb533e | 1598 | if (m_I2C_interface.write(ADDR_WCFG_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1599 | { |
IanBenzMaxim | 21:00c94aeb533e | 1600 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1601 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1602 | } |
IanBenzMaxim | 21:00c94aeb533e | 1603 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1604 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1605 | { |
IanBenzMaxim | 21:00c94aeb533e | 1606 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1607 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1608 | } |
IanBenzMaxim | 21:00c94aeb533e | 1609 | read_config = m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1610 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1611 | |
IanBenzMaxim | 21:00c94aeb533e | 1612 | |
IanBenzMaxim | 21:00c94aeb533e | 1613 | // check for failure due to incorrect read back |
IanBenzMaxim | 21:00c94aeb533e | 1614 | if (config != read_config) |
IanBenzMaxim | 21:00c94aeb533e | 1615 | { |
IanBenzMaxim | 21:00c94aeb533e | 1616 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1617 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1618 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1619 | |
IanBenzMaxim | 21:00c94aeb533e | 1620 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1621 | } |
IanBenzMaxim | 21:00c94aeb533e | 1622 | |
IanBenzMaxim | 21:00c94aeb533e | 1623 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1624 | } |
IanBenzMaxim | 21:00c94aeb533e | 1625 | |
IanBenzMaxim | 21:00c94aeb533e | 1626 | //-------------------------------------------------------------------------- |
IanBenzMaxim | 21:00c94aeb533e | 1627 | // Reset all of the devices on the 1-Wire Net and return the result. |
IanBenzMaxim | 21:00c94aeb533e | 1628 | // |
IanBenzMaxim | 21:00c94aeb533e | 1629 | // Returns: true(1): presense pulse(s) detected, device(s) reset |
IanBenzMaxim | 21:00c94aeb533e | 1630 | // false(0): no presense pulses detected |
IanBenzMaxim | 21:00c94aeb533e | 1631 | // |
IanBenzMaxim | 21:00c94aeb533e | 1632 | OneWireMaster::CmdResult DS2465::OWReset(void) |
IanBenzMaxim | 21:00c94aeb533e | 1633 | { |
IanBenzMaxim | 21:00c94aeb533e | 1634 | unsigned char status; |
IanBenzMaxim | 21:00c94aeb533e | 1635 | int poll_count = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1636 | |
IanBenzMaxim | 21:00c94aeb533e | 1637 | // 1-Wire reset (Case B) |
IanBenzMaxim | 21:00c94aeb533e | 1638 | // S AD,0 [A] ADDR_CMD_REG [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1639 | // \--------/ |
IanBenzMaxim | 21:00c94aeb533e | 1640 | // Repeat until 1WB bit has changed to 0 |
IanBenzMaxim | 21:00c94aeb533e | 1641 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1642 | |
IanBenzMaxim | 21:00c94aeb533e | 1643 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1644 | |
IanBenzMaxim | 21:00c94aeb533e | 1645 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1646 | { |
IanBenzMaxim | 21:00c94aeb533e | 1647 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1648 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1649 | } |
IanBenzMaxim | 21:00c94aeb533e | 1650 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1651 | { |
IanBenzMaxim | 21:00c94aeb533e | 1652 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1653 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1654 | } |
IanBenzMaxim | 21:00c94aeb533e | 1655 | if (m_I2C_interface.write(CMD_1WRS) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1656 | { |
IanBenzMaxim | 21:00c94aeb533e | 1657 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1658 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1659 | } |
IanBenzMaxim | 21:00c94aeb533e | 1660 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1661 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1662 | { |
IanBenzMaxim | 21:00c94aeb533e | 1663 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1664 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1665 | } |
IanBenzMaxim | 21:00c94aeb533e | 1666 | |
IanBenzMaxim | 21:00c94aeb533e | 1667 | // loop checking 1WB bit for completion of 1-Wire operation |
IanBenzMaxim | 21:00c94aeb533e | 1668 | // abort if poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1669 | status = STATUS_1WB; |
IanBenzMaxim | 21:00c94aeb533e | 1670 | while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT)) |
IanBenzMaxim | 21:00c94aeb533e | 1671 | { |
IanBenzMaxim | 21:00c94aeb533e | 1672 | status = m_I2C_interface.read(m_I2C_interface.ACK); |
IanBenzMaxim | 21:00c94aeb533e | 1673 | } |
IanBenzMaxim | 21:00c94aeb533e | 1674 | |
IanBenzMaxim | 21:00c94aeb533e | 1675 | // one last read with NACK |
IanBenzMaxim | 21:00c94aeb533e | 1676 | m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1677 | |
IanBenzMaxim | 21:00c94aeb533e | 1678 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1679 | |
IanBenzMaxim | 21:00c94aeb533e | 1680 | // check for failure due to poll limit reached |
IanBenzMaxim | 21:00c94aeb533e | 1681 | if (poll_count >= POLL_LIMIT) |
IanBenzMaxim | 21:00c94aeb533e | 1682 | { |
IanBenzMaxim | 21:00c94aeb533e | 1683 | // handle error |
IanBenzMaxim | 21:00c94aeb533e | 1684 | // ... |
IanBenzMaxim | 21:00c94aeb533e | 1685 | //Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1686 | return OneWireMaster::TimeoutError; |
IanBenzMaxim | 21:00c94aeb533e | 1687 | } |
IanBenzMaxim | 21:00c94aeb533e | 1688 | |
IanBenzMaxim | 21:00c94aeb533e | 1689 | // check for short condition |
IanBenzMaxim | 21:00c94aeb533e | 1690 | if (status & STATUS_SD) |
IanBenzMaxim | 21:00c94aeb533e | 1691 | short_detected = true; |
IanBenzMaxim | 21:00c94aeb533e | 1692 | else |
IanBenzMaxim | 21:00c94aeb533e | 1693 | short_detected = false; |
IanBenzMaxim | 21:00c94aeb533e | 1694 | |
IanBenzMaxim | 21:00c94aeb533e | 1695 | |
IanBenzMaxim | 21:00c94aeb533e | 1696 | // check for presence detect |
IanBenzMaxim | 21:00c94aeb533e | 1697 | if (status & STATUS_PPD) |
IanBenzMaxim | 21:00c94aeb533e | 1698 | return OneWireMaster::Success; |
IanBenzMaxim | 21:00c94aeb533e | 1699 | // else |
IanBenzMaxim | 21:00c94aeb533e | 1700 | return OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 1701 | } |
IanBenzMaxim | 21:00c94aeb533e | 1702 | |
IanBenzMaxim | 21:00c94aeb533e | 1703 | OneWireMaster::CmdResult DS2465::Reset(void) |
IanBenzMaxim | 21:00c94aeb533e | 1704 | { |
IanBenzMaxim | 21:00c94aeb533e | 1705 | uint8_t status; |
IanBenzMaxim | 21:00c94aeb533e | 1706 | |
IanBenzMaxim | 21:00c94aeb533e | 1707 | // Device Reset |
IanBenzMaxim | 21:00c94aeb533e | 1708 | // S AD,0 [A] ADDR_CMD_REG [A] 1WMR [A] Sr AD,1 [A] [SS] A\ P |
IanBenzMaxim | 21:00c94aeb533e | 1709 | // [] indicates from slave |
IanBenzMaxim | 21:00c94aeb533e | 1710 | // SS status byte to read to verify state |
IanBenzMaxim | 21:00c94aeb533e | 1711 | |
IanBenzMaxim | 21:00c94aeb533e | 1712 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1713 | |
IanBenzMaxim | 21:00c94aeb533e | 1714 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_WRITE)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1715 | { |
IanBenzMaxim | 21:00c94aeb533e | 1716 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1717 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1718 | } |
IanBenzMaxim | 21:00c94aeb533e | 1719 | |
IanBenzMaxim | 21:00c94aeb533e | 1720 | if (m_I2C_interface.write(ADDR_CMD_REG) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1721 | { |
IanBenzMaxim | 21:00c94aeb533e | 1722 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1723 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1724 | } |
IanBenzMaxim | 21:00c94aeb533e | 1725 | |
IanBenzMaxim | 21:00c94aeb533e | 1726 | if (m_I2C_interface.write(CMD_1WMR) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1727 | { |
IanBenzMaxim | 21:00c94aeb533e | 1728 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1729 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1730 | } |
IanBenzMaxim | 21:00c94aeb533e | 1731 | |
IanBenzMaxim | 21:00c94aeb533e | 1732 | m_I2C_interface.start(); |
IanBenzMaxim | 21:00c94aeb533e | 1733 | |
IanBenzMaxim | 21:00c94aeb533e | 1734 | if (m_I2C_interface.write((unsigned char)(m_I2C_address | I2C_READ)) != I2C_WRITE_OK) |
IanBenzMaxim | 21:00c94aeb533e | 1735 | { |
IanBenzMaxim | 21:00c94aeb533e | 1736 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1737 | return OneWireMaster::CommunicationWriteError; |
IanBenzMaxim | 21:00c94aeb533e | 1738 | } |
IanBenzMaxim | 21:00c94aeb533e | 1739 | |
IanBenzMaxim | 21:00c94aeb533e | 1740 | status = m_I2C_interface.read(m_I2C_interface.NoACK); |
IanBenzMaxim | 21:00c94aeb533e | 1741 | |
IanBenzMaxim | 21:00c94aeb533e | 1742 | m_I2C_interface.stop(); |
IanBenzMaxim | 21:00c94aeb533e | 1743 | |
IanBenzMaxim | 21:00c94aeb533e | 1744 | // do a command to get 1-Wire master reset out of holding state |
IanBenzMaxim | 21:00c94aeb533e | 1745 | OWReset(); |
IanBenzMaxim | 21:00c94aeb533e | 1746 | |
IanBenzMaxim | 21:00c94aeb533e | 1747 | // check for failure due to incorrect read back of status |
IanBenzMaxim | 21:00c94aeb533e | 1748 | return ((status & 0xF7) == 0x10) ? OneWireMaster::Success : OneWireMaster::OperationFailure; |
IanBenzMaxim | 21:00c94aeb533e | 1749 | } |
IanBenzMaxim | 21:00c94aeb533e | 1750 | |
IanBenzMaxim | 21:00c94aeb533e | 1751 | OneWireMaster::CmdResult DS2465::Detect(void) |
IanBenzMaxim | 21:00c94aeb533e | 1752 | { |
IanBenzMaxim | 21:00c94aeb533e | 1753 | OneWireMaster::CmdResult result; |
IanBenzMaxim | 21:00c94aeb533e | 1754 | |
IanBenzMaxim | 21:00c94aeb533e | 1755 | // reset DS2465 |
IanBenzMaxim | 21:00c94aeb533e | 1756 | result = Reset(); |
IanBenzMaxim | 21:00c94aeb533e | 1757 | if (result != OneWireMaster::Success) |
IanBenzMaxim | 21:00c94aeb533e | 1758 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1759 | |
IanBenzMaxim | 21:00c94aeb533e | 1760 | // default configuration |
IanBenzMaxim | 21:00c94aeb533e | 1761 | c1WS = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1762 | cSPU = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1763 | cPDN = 0; |
IanBenzMaxim | 21:00c94aeb533e | 1764 | cAPU = CONFIG_APU; |
IanBenzMaxim | 21:00c94aeb533e | 1765 | |
IanBenzMaxim | 21:00c94aeb533e | 1766 | // write the default configuration setup |
IanBenzMaxim | 21:00c94aeb533e | 1767 | result = Write_Config(c1WS | cSPU | cPDN | cAPU); |
IanBenzMaxim | 21:00c94aeb533e | 1768 | return result; |
IanBenzMaxim | 21:00c94aeb533e | 1769 | } |