Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Wed Apr 13 20:31:41 2016 +0000
Revision:
54:08985bf69691
Parent:
23:e8e403d61359
Child:
56:be69bd88a3e3
Updated expected status in  DS2413 write pio fx

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
j3 19:6d4c039a2d8e 33
j3 19:6d4c039a2d8e 34 #include "ds2413.h"
j3 19:6d4c039a2d8e 35
j3 19:6d4c039a2d8e 36
j3 19:6d4c039a2d8e 37 //*********************************************************************
j3 22:686273e55cdc 38 Ds2413::Ds2413(OneWireMaster &owm): _owm(owm)
j3 19:6d4c039a2d8e 39 {
j3 19:6d4c039a2d8e 40 }
j3 19:6d4c039a2d8e 41
j3 19:6d4c039a2d8e 42
j3 19:6d4c039a2d8e 43 //*********************************************************************
j3 19:6d4c039a2d8e 44 Ds2413::CmdResult Ds2413::pio_access_read_chA(RomId &romId, uint8_t & val)
j3 19:6d4c039a2d8e 45 {
j3 19:6d4c039a2d8e 46 Ds2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 47
j3 19:6d4c039a2d8e 48 result = pio_access_read(romId, val);
j3 19:6d4c039a2d8e 49
j3 19:6d4c039a2d8e 50 val = (val & 0x01);
j3 19:6d4c039a2d8e 51
j3 19:6d4c039a2d8e 52 return result;
j3 19:6d4c039a2d8e 53 }
j3 19:6d4c039a2d8e 54
j3 19:6d4c039a2d8e 55
j3 19:6d4c039a2d8e 56 //*********************************************************************
j3 19:6d4c039a2d8e 57 Ds2413::CmdResult Ds2413::pio_access_read_chB(RomId &romId, uint8_t & val)
j3 19:6d4c039a2d8e 58 {
j3 19:6d4c039a2d8e 59 Ds2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 60
j3 19:6d4c039a2d8e 61 result = pio_access_read(romId, val);
j3 19:6d4c039a2d8e 62
j3 19:6d4c039a2d8e 63 val = ((val >> 2) & 0x01);
j3 19:6d4c039a2d8e 64
j3 19:6d4c039a2d8e 65 return result;
j3 19:6d4c039a2d8e 66 }
j3 19:6d4c039a2d8e 67
j3 19:6d4c039a2d8e 68
j3 19:6d4c039a2d8e 69 //*********************************************************************
j3 19:6d4c039a2d8e 70 Ds2413::CmdResult Ds2413::pio_access_write_chA(RomId &romId, uint8_t val)
j3 19:6d4c039a2d8e 71 {
j3 19:6d4c039a2d8e 72 Ds2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 73
j3 19:6d4c039a2d8e 74 uint8_t local_val = 0;
j3 19:6d4c039a2d8e 75
j3 19:6d4c039a2d8e 76 //read current state of PIO
j3 19:6d4c039a2d8e 77 result = pio_access_read(romId, local_val);
j3 19:6d4c039a2d8e 78
j3 19:6d4c039a2d8e 79 if(result == Ds2413::Success)
j3 19:6d4c039a2d8e 80 {
j3 19:6d4c039a2d8e 81 //modify
j3 19:6d4c039a2d8e 82 //current state of pioB OR
j3 19:6d4c039a2d8e 83 //desired state of pioA OR
j3 19:6d4c039a2d8e 84 //bits[7:2] should all be 1, per datasheet
j3 54:08985bf69691 85 val = (0xFC | (((local_val >> 1) & 0x02) | (0x01 & val)));
j3 19:6d4c039a2d8e 86
j3 19:6d4c039a2d8e 87 //write, bit[1:0] new state of pio
j3 19:6d4c039a2d8e 88 result = pio_access_write(romId, val);
j3 19:6d4c039a2d8e 89 }
j3 19:6d4c039a2d8e 90
j3 19:6d4c039a2d8e 91 return result;
j3 19:6d4c039a2d8e 92 }
j3 19:6d4c039a2d8e 93
j3 19:6d4c039a2d8e 94
j3 19:6d4c039a2d8e 95 //*********************************************************************
j3 19:6d4c039a2d8e 96 Ds2413::CmdResult Ds2413::pio_access_write_chB(RomId &romId, uint8_t val)
j3 19:6d4c039a2d8e 97 {
j3 19:6d4c039a2d8e 98 Ds2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 99
j3 19:6d4c039a2d8e 100 uint8_t local_val = 0;
j3 19:6d4c039a2d8e 101
j3 19:6d4c039a2d8e 102 //read current state of PIO
j3 19:6d4c039a2d8e 103 result = pio_access_read(romId, local_val);
j3 19:6d4c039a2d8e 104
j3 19:6d4c039a2d8e 105 if(result == Ds2413::Success)
j3 19:6d4c039a2d8e 106 {
j3 19:6d4c039a2d8e 107 //modify
j3 19:6d4c039a2d8e 108 //current state of pioA OR
j3 19:6d4c039a2d8e 109 //desired state of pioB OR
j3 19:6d4c039a2d8e 110 //bits[7:2] should all be 1, per datasheet
j3 19:6d4c039a2d8e 111 val = (0xFC | ((local_val & 0x01) | (0x02 & (val << 1))));
j3 19:6d4c039a2d8e 112
j3 19:6d4c039a2d8e 113 //write, bit[1:0] new state of pio
j3 19:6d4c039a2d8e 114 result = pio_access_write(romId, val);
j3 19:6d4c039a2d8e 115 }
j3 19:6d4c039a2d8e 116
j3 19:6d4c039a2d8e 117 return result;
j3 19:6d4c039a2d8e 118 }
j3 19:6d4c039a2d8e 119
j3 19:6d4c039a2d8e 120
j3 19:6d4c039a2d8e 121 //*********************************************************************
j3 54:08985bf69691 122 Ds2413::CmdResult Ds2413::pio_access_write_chAB(RomId &romId, uint8_t val)
j3 54:08985bf69691 123 {
j3 54:08985bf69691 124 return pio_access_write(romId, ((0x03 & val) | 0xFC));
j3 54:08985bf69691 125 }
j3 54:08985bf69691 126
j3 54:08985bf69691 127
j3 54:08985bf69691 128 //*********************************************************************
j3 19:6d4c039a2d8e 129 Ds2413::CmdResult Ds2413::pio_access_read(RomId &romId, uint8_t & val)
j3 19:6d4c039a2d8e 130 {
j3 19:6d4c039a2d8e 131 Ds2413::CmdResult result = Ds2413::OpFailure;
j3 19:6d4c039a2d8e 132
j3 23:e8e403d61359 133 OneWireMaster::CmdResult ow_result = _owm.OWMatchROM(romId);
j3 19:6d4c039a2d8e 134
j3 23:e8e403d61359 135 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 136 {
j3 19:6d4c039a2d8e 137 ow_result = _owm.OWWriteByte(Ds2413::PIO_ACCESS_READ);
j3 19:6d4c039a2d8e 138
j3 23:e8e403d61359 139 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 140 {
j3 19:6d4c039a2d8e 141 ow_result = _owm.OWReadByte(val);
j3 19:6d4c039a2d8e 142
j3 23:e8e403d61359 143 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 144 {
j3 19:6d4c039a2d8e 145 result = Ds2413::Success;
j3 19:6d4c039a2d8e 146 }
j3 19:6d4c039a2d8e 147 else
j3 19:6d4c039a2d8e 148 {
j3 19:6d4c039a2d8e 149 result = Ds2413::CommsReadError;
j3 19:6d4c039a2d8e 150 }
j3 19:6d4c039a2d8e 151 }
j3 19:6d4c039a2d8e 152 else
j3 19:6d4c039a2d8e 153 {
j3 19:6d4c039a2d8e 154 result = Ds2413::CommsWriteError;
j3 19:6d4c039a2d8e 155 }
j3 19:6d4c039a2d8e 156 }
j3 19:6d4c039a2d8e 157
j3 19:6d4c039a2d8e 158 return result;
j3 19:6d4c039a2d8e 159 }
j3 19:6d4c039a2d8e 160
j3 19:6d4c039a2d8e 161
j3 19:6d4c039a2d8e 162 //*********************************************************************
j3 54:08985bf69691 163 Ds2413::CmdResult Ds2413::pio_access_write(RomId & romId, uint8_t val)
j3 19:6d4c039a2d8e 164 {
j3 54:08985bf69691 165 static uint32_t cnt = 0;
j3 19:6d4c039a2d8e 166 Ds2413::CmdResult result = Ds2413::OpFailure;
j3 19:6d4c039a2d8e 167
j3 23:e8e403d61359 168 OneWireMaster::CmdResult ow_result = _owm.OWMatchROM(romId);
j3 19:6d4c039a2d8e 169
j3 23:e8e403d61359 170 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 171 {
j3 19:6d4c039a2d8e 172 uint8_t send_block[] = {Ds2413::PIO_ACCESS_WRITE, val, ~val};
j3 19:6d4c039a2d8e 173
j3 19:6d4c039a2d8e 174 ow_result = _owm.OWWriteBlock(send_block, 3);
j3 23:e8e403d61359 175 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 176 {
j3 19:6d4c039a2d8e 177 uint8_t expected_status = ((0x01 & val) | ((0x01 & val) << 1) |
j3 19:6d4c039a2d8e 178 ((0x02 & val) << 1) | ((0x02 & val) << 2));
j3 54:08985bf69691 179 //expected_status |= (~expected_status << 4);
j3 19:6d4c039a2d8e 180
j3 19:6d4c039a2d8e 181 uint8_t rcv_block[2];
j3 19:6d4c039a2d8e 182 ow_result = _owm.OWReadBlock(rcv_block, 2);
j3 19:6d4c039a2d8e 183
j3 23:e8e403d61359 184 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 185 {
j3 54:08985bf69691 186 printf("\nEntry %d", ++cnt);
j3 54:08985bf69691 187 printf("\nval = 0x%2x", val);
j3 54:08985bf69691 188 printf("\nexpected status = 0x%2x", expected_status);
j3 54:08985bf69691 189 printf("\nrecv_block 0 = 0x%2x", rcv_block[0]);
j3 54:08985bf69691 190 printf("\nrecv_block 1 = 0x%2x\n", rcv_block[1]);
j3 54:08985bf69691 191 if((rcv_block[0] == 0xAA) && ((rcv_block[1] & 0x0F) == expected_status))
j3 19:6d4c039a2d8e 192 {
j3 54:08985bf69691 193 printf("\nExit %d\n", cnt);
j3 19:6d4c039a2d8e 194 result = Ds2413::Success;
j3 19:6d4c039a2d8e 195 }
j3 19:6d4c039a2d8e 196 }
j3 19:6d4c039a2d8e 197 else
j3 19:6d4c039a2d8e 198 {
j3 19:6d4c039a2d8e 199 result = Ds2413::CommsReadError;
j3 19:6d4c039a2d8e 200 }
j3 19:6d4c039a2d8e 201 }
j3 19:6d4c039a2d8e 202 else
j3 19:6d4c039a2d8e 203 {
j3 19:6d4c039a2d8e 204 result = Ds2413::CommsWriteError;
j3 19:6d4c039a2d8e 205 }
j3 19:6d4c039a2d8e 206 }
j3 19:6d4c039a2d8e 207
j3 19:6d4c039a2d8e 208 return result;
j3 19:6d4c039a2d8e 209 }