Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Wed Jun 15 15:00:06 2016 -0500
Revision:
86:2ce08ca58b9e
Parent:
Switches/DS2413/DS2413.cpp@77:529edb329ee0
Child:
94:d2dea35b25ea
Updated to match new directory structure.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 19:6d4c039a2d8e 1 /******************************************************************//**
j3 19:6d4c039a2d8e 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 19:6d4c039a2d8e 3 *
j3 19:6d4c039a2d8e 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 19:6d4c039a2d8e 5 * copy of this software and associated documentation files (the "Software"),
j3 19:6d4c039a2d8e 6 * to deal in the Software without restriction, including without limitation
j3 19:6d4c039a2d8e 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 19:6d4c039a2d8e 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 19:6d4c039a2d8e 9 * Software is furnished to do so, subject to the following conditions:
j3 19:6d4c039a2d8e 10 *
j3 19:6d4c039a2d8e 11 * The above copyright notice and this permission notice shall be included
j3 19:6d4c039a2d8e 12 * in all copies or substantial portions of the Software.
j3 19:6d4c039a2d8e 13 *
j3 19:6d4c039a2d8e 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 19:6d4c039a2d8e 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 19:6d4c039a2d8e 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 19:6d4c039a2d8e 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 19:6d4c039a2d8e 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 19:6d4c039a2d8e 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 19:6d4c039a2d8e 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 19:6d4c039a2d8e 21 *
j3 19:6d4c039a2d8e 22 * Except as contained in this notice, the name of Maxim Integrated
j3 19:6d4c039a2d8e 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 19:6d4c039a2d8e 24 * Products, Inc. Branding Policy.
j3 19:6d4c039a2d8e 25 *
j3 19:6d4c039a2d8e 26 * The mere transfer of this software does not imply any licenses
j3 19:6d4c039a2d8e 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 19:6d4c039a2d8e 28 * trademarks, maskwork rights, or any other form of intellectual
j3 19:6d4c039a2d8e 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 19:6d4c039a2d8e 30 * ownership rights.
j3 19:6d4c039a2d8e 31 **********************************************************************/
j3 19:6d4c039a2d8e 32
IanBenzMaxim 73:2cecc1372acc 33 #include "DS2413.h"
j3 19:6d4c039a2d8e 34
IanBenzMaxim 76:84e6c4994e29 35 using OneWire::DS2413;
IanBenzMaxim 76:84e6c4994e29 36 using OneWire::OneWireMaster;
j3 19:6d4c039a2d8e 37
IanBenzMaxim 75:8b627804927c 38 enum DS2413_CMDS
IanBenzMaxim 75:8b627804927c 39 {
IanBenzMaxim 75:8b627804927c 40 PIO_ACCESS_READ = 0xF5,
IanBenzMaxim 75:8b627804927c 41 PIO_ACCESS_WRITE = 0x5A
IanBenzMaxim 75:8b627804927c 42 };
IanBenzMaxim 75:8b627804927c 43
IanBenzMaxim 75:8b627804927c 44 enum DS2413_PIO
IanBenzMaxim 75:8b627804927c 45 {
IanBenzMaxim 75:8b627804927c 46 PIOA,
IanBenzMaxim 75:8b627804927c 47 PIOB,
IanBenzMaxim 75:8b627804927c 48 PIOAB
IanBenzMaxim 75:8b627804927c 49 };
IanBenzMaxim 75:8b627804927c 50
IanBenzMaxim 77:529edb329ee0 51 DS2413::DS2413(RandomAccessRomIterator &selector) : OneWireSlave(selector)
j3 19:6d4c039a2d8e 52 {
j3 19:6d4c039a2d8e 53 }
j3 19:6d4c039a2d8e 54
IanBenzMaxim 73:2cecc1372acc 55 DS2413::CmdResult DS2413::pio_access_read_chA(uint8_t & val)
j3 19:6d4c039a2d8e 56 {
IanBenzMaxim 74:23be10c32fa3 57 DS2413::CmdResult result = OpFailure;
IanBenzMaxim 74:23be10c32fa3 58
IanBenzMaxim 74:23be10c32fa3 59 result = pio_access_read(val);
IanBenzMaxim 74:23be10c32fa3 60
IanBenzMaxim 74:23be10c32fa3 61 val = (val & 0x01);
IanBenzMaxim 74:23be10c32fa3 62
IanBenzMaxim 74:23be10c32fa3 63 return result;
j3 19:6d4c039a2d8e 64 }
j3 19:6d4c039a2d8e 65
IanBenzMaxim 73:2cecc1372acc 66 DS2413::CmdResult DS2413::pio_access_read_chB(uint8_t & val)
j3 19:6d4c039a2d8e 67 {
IanBenzMaxim 74:23be10c32fa3 68 DS2413::CmdResult result = OpFailure;
IanBenzMaxim 74:23be10c32fa3 69
IanBenzMaxim 74:23be10c32fa3 70 result = pio_access_read(val);
IanBenzMaxim 74:23be10c32fa3 71
IanBenzMaxim 74:23be10c32fa3 72 val = ((val >> 2) & 0x01);
IanBenzMaxim 74:23be10c32fa3 73
IanBenzMaxim 74:23be10c32fa3 74 return result;
j3 19:6d4c039a2d8e 75 }
j3 19:6d4c039a2d8e 76
IanBenzMaxim 73:2cecc1372acc 77 DS2413::CmdResult DS2413::pio_access_write_chA(uint8_t val)
j3 19:6d4c039a2d8e 78 {
IanBenzMaxim 74:23be10c32fa3 79 DS2413::CmdResult result = OpFailure;
IanBenzMaxim 74:23be10c32fa3 80
IanBenzMaxim 74:23be10c32fa3 81 uint8_t local_val = 0;
IanBenzMaxim 74:23be10c32fa3 82
IanBenzMaxim 74:23be10c32fa3 83 //read current state of PIO
IanBenzMaxim 74:23be10c32fa3 84 result = pio_access_read(local_val);
IanBenzMaxim 74:23be10c32fa3 85
IanBenzMaxim 74:23be10c32fa3 86 if (result == DS2413::Success)
IanBenzMaxim 74:23be10c32fa3 87 {
IanBenzMaxim 74:23be10c32fa3 88 //modify
IanBenzMaxim 74:23be10c32fa3 89 //current state of pioB OR
IanBenzMaxim 74:23be10c32fa3 90 //desired state of pioA OR
IanBenzMaxim 74:23be10c32fa3 91 //bits[7:2] should all be 1, per datasheet
IanBenzMaxim 74:23be10c32fa3 92 val = (0xFC | (((local_val >> 1) & 0x02) | (0x01 & val)));
IanBenzMaxim 74:23be10c32fa3 93
IanBenzMaxim 74:23be10c32fa3 94 //write, bit[1:0] new state of pio
IanBenzMaxim 74:23be10c32fa3 95 result = pio_access_write(val);
IanBenzMaxim 74:23be10c32fa3 96 }
IanBenzMaxim 74:23be10c32fa3 97
IanBenzMaxim 74:23be10c32fa3 98 return result;
j3 19:6d4c039a2d8e 99 }
j3 19:6d4c039a2d8e 100
IanBenzMaxim 73:2cecc1372acc 101 DS2413::CmdResult DS2413::pio_access_write_chB(uint8_t val)
j3 19:6d4c039a2d8e 102 {
IanBenzMaxim 74:23be10c32fa3 103 DS2413::CmdResult result = OpFailure;
IanBenzMaxim 74:23be10c32fa3 104
IanBenzMaxim 74:23be10c32fa3 105 uint8_t local_val = 0;
IanBenzMaxim 74:23be10c32fa3 106
IanBenzMaxim 74:23be10c32fa3 107 //read current state of PIO
IanBenzMaxim 74:23be10c32fa3 108 result = pio_access_read(local_val);
IanBenzMaxim 74:23be10c32fa3 109
IanBenzMaxim 74:23be10c32fa3 110 if (result == DS2413::Success)
IanBenzMaxim 74:23be10c32fa3 111 {
IanBenzMaxim 74:23be10c32fa3 112 //modify
IanBenzMaxim 74:23be10c32fa3 113 //current state of pioA OR
IanBenzMaxim 74:23be10c32fa3 114 //desired state of pioB OR
IanBenzMaxim 74:23be10c32fa3 115 //bits[7:2] should all be 1, per datasheet
IanBenzMaxim 74:23be10c32fa3 116 val = (0xFC | ((local_val & 0x01) | (0x02 & (val << 1))));
IanBenzMaxim 74:23be10c32fa3 117
IanBenzMaxim 74:23be10c32fa3 118 //write, bit[1:0] new state of pio
IanBenzMaxim 74:23be10c32fa3 119 result = pio_access_write(val);
IanBenzMaxim 74:23be10c32fa3 120 }
IanBenzMaxim 74:23be10c32fa3 121
IanBenzMaxim 74:23be10c32fa3 122 return result;
j3 19:6d4c039a2d8e 123 }
j3 19:6d4c039a2d8e 124
IanBenzMaxim 73:2cecc1372acc 125 DS2413::CmdResult DS2413::pio_access_write_chAB(uint8_t val)
j3 54:08985bf69691 126 {
IanBenzMaxim 73:2cecc1372acc 127 return pio_access_write((0x03 & val) | 0xFC);
j3 54:08985bf69691 128 }
j3 54:08985bf69691 129
IanBenzMaxim 73:2cecc1372acc 130 DS2413::CmdResult DS2413::pio_access_read(uint8_t & val)
j3 19:6d4c039a2d8e 131 {
IanBenzMaxim 74:23be10c32fa3 132 DS2413::CmdResult result = DS2413::OpFailure;
IanBenzMaxim 74:23be10c32fa3 133
IanBenzMaxim 77:529edb329ee0 134 OneWireMaster::CmdResult ow_result = selectDevice();
IanBenzMaxim 74:23be10c32fa3 135
IanBenzMaxim 74:23be10c32fa3 136 if (ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 137 {
IanBenzMaxim 77:529edb329ee0 138 ow_result = master().OWWriteByte(PIO_ACCESS_READ);
IanBenzMaxim 74:23be10c32fa3 139
IanBenzMaxim 74:23be10c32fa3 140 if (ow_result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 141 {
IanBenzMaxim 77:529edb329ee0 142 ow_result = master().OWReadByte(val);
IanBenzMaxim 74:23be10c32fa3 143
IanBenzMaxim 74:23be10c32fa3 144 if (ow_result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 145 {
IanBenzMaxim 74:23be10c32fa3 146 result = DS2413::Success;
IanBenzMaxim 74:23be10c32fa3 147 }
IanBenzMaxim 74:23be10c32fa3 148 else
IanBenzMaxim 74:23be10c32fa3 149 {
IanBenzMaxim 74:23be10c32fa3 150 result = DS2413::CommsReadError;
IanBenzMaxim 74:23be10c32fa3 151 }
IanBenzMaxim 74:23be10c32fa3 152 }
IanBenzMaxim 74:23be10c32fa3 153 else
IanBenzMaxim 74:23be10c32fa3 154 {
IanBenzMaxim 74:23be10c32fa3 155 result = DS2413::CommsWriteError;
IanBenzMaxim 74:23be10c32fa3 156 }
j3 19:6d4c039a2d8e 157 }
IanBenzMaxim 74:23be10c32fa3 158
IanBenzMaxim 74:23be10c32fa3 159 return result;
j3 19:6d4c039a2d8e 160 }
j3 19:6d4c039a2d8e 161
IanBenzMaxim 73:2cecc1372acc 162 DS2413::CmdResult DS2413::pio_access_write(uint8_t val)
j3 19:6d4c039a2d8e 163 {
IanBenzMaxim 74:23be10c32fa3 164 DS2413::CmdResult result = DS2413::OpFailure;
IanBenzMaxim 74:23be10c32fa3 165
IanBenzMaxim 77:529edb329ee0 166 OneWireMaster::CmdResult ow_result = selectDevice();
IanBenzMaxim 74:23be10c32fa3 167
IanBenzMaxim 74:23be10c32fa3 168 if (ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 169 {
IanBenzMaxim 75:8b627804927c 170 uint8_t send_block[] = { PIO_ACCESS_WRITE, val, ~val };
IanBenzMaxim 74:23be10c32fa3 171
IanBenzMaxim 77:529edb329ee0 172 ow_result = master().OWWriteBlock(send_block, 3);
IanBenzMaxim 74:23be10c32fa3 173 if (ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 174 {
IanBenzMaxim 74:23be10c32fa3 175 uint8_t expected_status = ((0x01 & val) | ((0x01 & val) << 1) |
IanBenzMaxim 74:23be10c32fa3 176 ((0x02 & val) << 1) | ((0x02 & val) << 2));
IanBenzMaxim 74:23be10c32fa3 177
IanBenzMaxim 74:23be10c32fa3 178 uint8_t rcv_block[2];
IanBenzMaxim 77:529edb329ee0 179 ow_result = master().OWReadBlock(rcv_block, 2);
IanBenzMaxim 74:23be10c32fa3 180
IanBenzMaxim 74:23be10c32fa3 181 if (ow_result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 182 {
IanBenzMaxim 74:23be10c32fa3 183 if ((rcv_block[0] == 0xAA) && ((rcv_block[1] & 0x0F) == expected_status))
IanBenzMaxim 74:23be10c32fa3 184 {
IanBenzMaxim 74:23be10c32fa3 185 result = DS2413::Success;
IanBenzMaxim 74:23be10c32fa3 186 }
IanBenzMaxim 74:23be10c32fa3 187 }
IanBenzMaxim 74:23be10c32fa3 188 else
IanBenzMaxim 74:23be10c32fa3 189 {
IanBenzMaxim 74:23be10c32fa3 190 result = DS2413::CommsReadError;
IanBenzMaxim 74:23be10c32fa3 191 }
j3 19:6d4c039a2d8e 192 }
IanBenzMaxim 74:23be10c32fa3 193 else
IanBenzMaxim 74:23be10c32fa3 194 {
IanBenzMaxim 74:23be10c32fa3 195 result = DS2413::CommsWriteError;
IanBenzMaxim 74:23be10c32fa3 196 }
j3 19:6d4c039a2d8e 197 }
IanBenzMaxim 74:23be10c32fa3 198
IanBenzMaxim 74:23be10c32fa3 199 return result;
j3 19:6d4c039a2d8e 200 }