OneWire DS18B20,DS2450,MAX31850

Dependents:   MAX31850_HelloWorld

Committer:
fblanc
Date:
Thu Feb 12 14:03:55 2015 +0000
Revision:
0:9acbbb021a43
MAX31850 ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:9acbbb021a43 1 /**
fblanc 0:9acbbb021a43 2 * @file onewire.c
fblanc 0:9acbbb021a43 3 * @brief library 1-Wire(www.maxim-ic.com)
fblanc 0:9acbbb021a43 4 * @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
fblanc 0:9acbbb021a43 5 * @author Frederic BLANC (Published 01/03/2012 www.mbed.org)
fblanc 0:9acbbb021a43 6 */
fblanc 0:9acbbb021a43 7
fblanc 0:9acbbb021a43 8 #include "mbed.h"
fblanc 0:9acbbb021a43 9 #include "onewire.h"
fblanc 0:9acbbb021a43 10
fblanc 0:9acbbb021a43 11 DigitalInOut ow_pin(p21);
fblanc 0:9acbbb021a43 12 DigitalInOut ow_0(p21);
fblanc 0:9acbbb021a43 13 DigitalInOut ow_1(p22);
fblanc 0:9acbbb021a43 14 DigitalInOut ow_2(p23);
fblanc 0:9acbbb021a43 15 DigitalInOut ow_3(p24);
fblanc 0:9acbbb021a43 16 DigitalInOut* t_ow[4]={&ow_0,&ow_1,&ow_2,&ow_3};
fblanc 0:9acbbb021a43 17
fblanc 0:9acbbb021a43 18 //**********************************************************************************************************
fblanc 0:9acbbb021a43 19 //* show_id
fblanc 0:9acbbb021a43 20 //**********************************************************************************************************
fblanc 0:9acbbb021a43 21
fblanc 0:9acbbb021a43 22
fblanc 0:9acbbb021a43 23 /**
fblanc 0:9acbbb021a43 24 * @brief show_id
fblanc 0:9acbbb021a43 25 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 26 * @param [out] text id
fblanc 0:9acbbb021a43 27 * @date 02/12/2013
fblanc 0:9acbbb021a43 28 */
fblanc 0:9acbbb021a43 29 char* ow_show_id( uint8_t id[],char *text) {
fblanc 0:9acbbb021a43 30
fblanc 0:9acbbb021a43 31 char hex[4];
fblanc 0:9acbbb021a43 32 sprintf(text,"");
fblanc 0:9acbbb021a43 33 sprintf(hex,"%2.2X",id[0]);
fblanc 0:9acbbb021a43 34 strcat(text,hex);
fblanc 0:9acbbb021a43 35 for (int i = OW_ROMCODE_SIZE-2; i >=1 ; --i ) {
fblanc 0:9acbbb021a43 36 sprintf(hex,"%2.2X",id[i]);
fblanc 0:9acbbb021a43 37 strcat(text,hex);
fblanc 0:9acbbb021a43 38 }
fblanc 0:9acbbb021a43 39 sprintf(hex,"%2.2X",id[OW_ROMCODE_SIZE-1]);
fblanc 0:9acbbb021a43 40 strcat(text,hex);
fblanc 0:9acbbb021a43 41 return text;
fblanc 0:9acbbb021a43 42
fblanc 0:9acbbb021a43 43 }
fblanc 0:9acbbb021a43 44 //**********************************************************************************************************
fblanc 0:9acbbb021a43 45 //* show_id
fblanc 0:9acbbb021a43 46 //**********************************************************************************************************
fblanc 0:9acbbb021a43 47
fblanc 0:9acbbb021a43 48
fblanc 0:9acbbb021a43 49 /**
fblanc 0:9acbbb021a43 50 * @brief uint64_id
fblanc 0:9acbbb021a43 51 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 52 * @return [out] uint64_t id
fblanc 0:9acbbb021a43 53 * @date 28/03/2011
fblanc 0:9acbbb021a43 54 */
fblanc 0:9acbbb021a43 55 uint64_t uint64_id( uint8_t id[]) {
fblanc 0:9acbbb021a43 56
fblanc 0:9acbbb021a43 57 uint64_t *ptr;
fblanc 0:9acbbb021a43 58
fblanc 0:9acbbb021a43 59 ptr=(uint64_t *) &id[0];
fblanc 0:9acbbb021a43 60
fblanc 0:9acbbb021a43 61 return *ptr;
fblanc 0:9acbbb021a43 62 }
fblanc 0:9acbbb021a43 63 //**********************************************************************************************************
fblanc 0:9acbbb021a43 64 //* search_sensors
fblanc 0:9acbbb021a43 65 //**********************************************************************************************************
fblanc 0:9acbbb021a43 66
fblanc 0:9acbbb021a43 67 /**
fblanc 0:9acbbb021a43 68 * @brief search_sensors
fblanc 0:9acbbb021a43 69 * @param [out] nSensors number of device onewire
fblanc 0:9acbbb021a43 70 * @param [out] gSensorIDs[][] array of id romcode
fblanc 0:9acbbb021a43 71 * @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR
fblanc 0:9acbbb021a43 72 * @date 20/06/2011
fblanc 0:9acbbb021a43 73 */
fblanc 0:9acbbb021a43 74 uint8_t search_sensors(uint8_t *nSensors,uint8_t gSensorIDs[][OW_ROMCODE_SIZE] ) {
fblanc 0:9acbbb021a43 75
fblanc 0:9acbbb021a43 76
fblanc 0:9acbbb021a43 77 uint8_t i;
fblanc 0:9acbbb021a43 78 uint8_t id[OW_ROMCODE_SIZE];
fblanc 0:9acbbb021a43 79 uint8_t diff;
fblanc 0:9acbbb021a43 80 //printf( "Scanning Bus\r\n" );
fblanc 0:9acbbb021a43 81 diff = OW_SEARCH_FIRST;
fblanc 0:9acbbb021a43 82 for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) {
fblanc 0:9acbbb021a43 83 ow_find_sensor( &diff, &id[0] );
fblanc 0:9acbbb021a43 84 if ( diff == OW_PRESENCE_ERR ) {
fblanc 0:9acbbb021a43 85 //printf( "No Sensor found\r\n" );
fblanc 0:9acbbb021a43 86 return diff;
fblanc 0:9acbbb021a43 87 }
fblanc 0:9acbbb021a43 88 if ( diff == OW_DATA_ERR ) {
fblanc 0:9acbbb021a43 89 //printf( "Bus Error\r\n" );
fblanc 0:9acbbb021a43 90 return diff;
fblanc 0:9acbbb021a43 91 }
fblanc 0:9acbbb021a43 92 for (i=0;i<OW_ROMCODE_SIZE;i++)
fblanc 0:9acbbb021a43 93 gSensorIDs[*nSensors][i]=id[i];
fblanc 0:9acbbb021a43 94
fblanc 0:9acbbb021a43 95 }
fblanc 0:9acbbb021a43 96 return OW_OK;
fblanc 0:9acbbb021a43 97 }
fblanc 0:9acbbb021a43 98 /**
fblanc 0:9acbbb021a43 99 * @brief search_sensors
fblanc 0:9acbbb021a43 100 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 101 * @param [out] nSensors number of device onewire
fblanc 0:9acbbb021a43 102 * @param [out] gSensorIDs[][][] array of id romcode
fblanc 0:9acbbb021a43 103 * @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR
fblanc 0:9acbbb021a43 104 * @date 02/09/2011
fblanc 0:9acbbb021a43 105 */
fblanc 0:9acbbb021a43 106 uint8_t search_sensors(uint8_t n,uint8_t *nSensors,uint8_t gSensorIDs[][MAXSENSORS][OW_ROMCODE_SIZE] ) {
fblanc 0:9acbbb021a43 107
fblanc 0:9acbbb021a43 108
fblanc 0:9acbbb021a43 109 uint8_t i;
fblanc 0:9acbbb021a43 110 uint8_t id[OW_ROMCODE_SIZE];
fblanc 0:9acbbb021a43 111 uint8_t diff;
fblanc 0:9acbbb021a43 112 //printf( "Scanning Bus %d\r\n",n );
fblanc 0:9acbbb021a43 113 diff = OW_SEARCH_FIRST;
fblanc 0:9acbbb021a43 114 for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) {
fblanc 0:9acbbb021a43 115 ow_find_sensor(n, &diff, &id[0] );
fblanc 0:9acbbb021a43 116 if ( diff == OW_PRESENCE_ERR ) {
fblanc 0:9acbbb021a43 117 //printf( "No Sensor found\r\n" );
fblanc 0:9acbbb021a43 118 return diff;
fblanc 0:9acbbb021a43 119 }
fblanc 0:9acbbb021a43 120 if ( diff == OW_DATA_ERR ) {
fblanc 0:9acbbb021a43 121 //printf( "Bus Error\r\n" );
fblanc 0:9acbbb021a43 122 return diff;
fblanc 0:9acbbb021a43 123 }
fblanc 0:9acbbb021a43 124 for (i=0;i<OW_ROMCODE_SIZE;i++){
fblanc 0:9acbbb021a43 125 gSensorIDs[n][*nSensors][i]=id[i];
fblanc 0:9acbbb021a43 126 //printf( "id[%d]=%d\r\n" ,i,id[i]);
fblanc 0:9acbbb021a43 127 }
fblanc 0:9acbbb021a43 128
fblanc 0:9acbbb021a43 129 }
fblanc 0:9acbbb021a43 130 return OW_OK;
fblanc 0:9acbbb021a43 131 }
fblanc 0:9acbbb021a43 132 //**********************************************************************************************************
fblanc 0:9acbbb021a43 133 //* find Sensors on 1-Wire-Bus
fblanc 0:9acbbb021a43 134 //**********************************************************************************************************
fblanc 0:9acbbb021a43 135
fblanc 0:9acbbb021a43 136 /**
fblanc 0:9acbbb021a43 137 * @brief find Sensors on 1-Wire-Bus
fblanc 0:9acbbb021a43 138 * @param [in/out] diff is the result of the last rom-search
fblanc 0:9acbbb021a43 139 * @param [out] is the rom-code of the sensor found
fblanc 0:9acbbb021a43 140 * @return OW_OK or OW_ERROR
fblanc 0:9acbbb021a43 141 * @date 20/06/2011
fblanc 0:9acbbb021a43 142 */
fblanc 0:9acbbb021a43 143 uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]) {
fblanc 0:9acbbb021a43 144 for (;;)
fblanc 0:9acbbb021a43 145 {
fblanc 0:9acbbb021a43 146 *diff = ow_rom_search( *diff, &id[0] );
fblanc 0:9acbbb021a43 147 if ( *diff==OW_PRESENCE_ERR)
fblanc 0:9acbbb021a43 148 return OW_ERROR;
fblanc 0:9acbbb021a43 149 if ( *diff==OW_DATA_ERR )
fblanc 0:9acbbb021a43 150 return OW_ERROR;
fblanc 0:9acbbb021a43 151 if ( *diff == OW_LAST_DEVICE )
fblanc 0:9acbbb021a43 152 return OW_OK ;
fblanc 0:9acbbb021a43 153 if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID )
fblanc 0:9acbbb021a43 154 return OW_OK ;
fblanc 0:9acbbb021a43 155 if ( id[0] == DS2450_ID )
fblanc 0:9acbbb021a43 156 return OW_OK ;
fblanc 0:9acbbb021a43 157 if ( id[0] == MAX31850_ID )
fblanc 0:9acbbb021a43 158 return OW_OK ;
fblanc 0:9acbbb021a43 159 }
fblanc 0:9acbbb021a43 160 }
fblanc 0:9acbbb021a43 161
fblanc 0:9acbbb021a43 162 /**
fblanc 0:9acbbb021a43 163 * @brief find Sensors on 1-Wire-Bus
fblanc 0:9acbbb021a43 164 * @param [in] num bus onewire
fblanc 0:9acbbb021a43 165 * @param [in/out] diff is the result of the last rom-search
fblanc 0:9acbbb021a43 166 * @param [out] is the rom-code of the sensor found
fblanc 0:9acbbb021a43 167 * @return OW_OK or OW_ERROR
fblanc 0:9acbbb021a43 168 * @date 30/08/2011
fblanc 0:9acbbb021a43 169 */
fblanc 0:9acbbb021a43 170 uint8_t ow_find_sensor(uint8_t n,uint8_t *diff, uint8_t id[]) {
fblanc 0:9acbbb021a43 171 for (;;)
fblanc 0:9acbbb021a43 172 {
fblanc 0:9acbbb021a43 173 *diff = ow_rom_search(n, *diff, &id[0] );
fblanc 0:9acbbb021a43 174 if ( *diff==OW_PRESENCE_ERR)
fblanc 0:9acbbb021a43 175 return OW_ERROR;
fblanc 0:9acbbb021a43 176 if ( *diff==OW_DATA_ERR )
fblanc 0:9acbbb021a43 177 return OW_ERROR;
fblanc 0:9acbbb021a43 178 if ( *diff == OW_LAST_DEVICE )
fblanc 0:9acbbb021a43 179 return OW_OK ;
fblanc 0:9acbbb021a43 180 if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID )
fblanc 0:9acbbb021a43 181 return OW_OK ;
fblanc 0:9acbbb021a43 182 if ( id[0] == DS2450_ID )
fblanc 0:9acbbb021a43 183 return OW_OK ;
fblanc 0:9acbbb021a43 184 if ( id[0] == MAX31850_ID )
fblanc 0:9acbbb021a43 185 return OW_OK ;
fblanc 0:9acbbb021a43 186 }
fblanc 0:9acbbb021a43 187 }
fblanc 0:9acbbb021a43 188 //**********************************************************************************************************
fblanc 0:9acbbb021a43 189 //* search romcode
fblanc 0:9acbbb021a43 190 //**********************************************************************************************************
fblanc 0:9acbbb021a43 191
fblanc 0:9acbbb021a43 192 /**
fblanc 0:9acbbb021a43 193 * @brief search romcode
fblanc 0:9acbbb021a43 194 * @param [in] uint8_t diff
fblanc 0:9acbbb021a43 195 * @param [out] id romcode
fblanc 0:9acbbb021a43 196 * @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR
fblanc 0:9acbbb021a43 197 * @date 20/06/2011
fblanc 0:9acbbb021a43 198 */
fblanc 0:9acbbb021a43 199 uint8_t ow_rom_search( uint8_t diff, uint8_t id[] ) {
fblanc 0:9acbbb021a43 200 uint8_t i, j, next_diff;
fblanc 0:9acbbb021a43 201 uint8_t b;
fblanc 0:9acbbb021a43 202
fblanc 0:9acbbb021a43 203 if ( ow_reset() )
fblanc 0:9acbbb021a43 204 return OW_PRESENCE_ERR; // error, no device found
fblanc 0:9acbbb021a43 205 ow_byte_wr( OW_SEARCH_ROM ); // ROM search command
fblanc 0:9acbbb021a43 206 next_diff = OW_LAST_DEVICE; // unchanged on last device
fblanc 0:9acbbb021a43 207 i = OW_ROMCODE_SIZE * 8; // 8 bytes
fblanc 0:9acbbb021a43 208 do {
fblanc 0:9acbbb021a43 209 j = 8; // 8 bits
fblanc 0:9acbbb021a43 210 do {
fblanc 0:9acbbb021a43 211 b = ow_bit_io( 1 ); // read bit
fblanc 0:9acbbb021a43 212 if ( ow_bit_io( 1 ) ) { // read complement bit
fblanc 0:9acbbb021a43 213 if ( b ) // 11
fblanc 0:9acbbb021a43 214 return OW_DATA_ERR; // data error
fblanc 0:9acbbb021a43 215 } else {
fblanc 0:9acbbb021a43 216 if ( !b ) { // 00 = 2 devices
fblanc 0:9acbbb021a43 217 if ( diff > i || ((*id & 1) && diff != i) ) {
fblanc 0:9acbbb021a43 218 b = 1; // now 1
fblanc 0:9acbbb021a43 219 next_diff = i; // next pass 0
fblanc 0:9acbbb021a43 220 }
fblanc 0:9acbbb021a43 221 }
fblanc 0:9acbbb021a43 222 }
fblanc 0:9acbbb021a43 223 ow_bit_io( b ); // write bit
fblanc 0:9acbbb021a43 224 *id >>= 1;
fblanc 0:9acbbb021a43 225 if ( b )
fblanc 0:9acbbb021a43 226 *id |= 0x80; // store bit
fblanc 0:9acbbb021a43 227 --i;
fblanc 0:9acbbb021a43 228 } while ( --j );
fblanc 0:9acbbb021a43 229 id++; // next byte
fblanc 0:9acbbb021a43 230 } while ( i );
fblanc 0:9acbbb021a43 231 return next_diff; // to continue search
fblanc 0:9acbbb021a43 232 }
fblanc 0:9acbbb021a43 233 /**
fblanc 0:9acbbb021a43 234 * @brief search romcode
fblanc 0:9acbbb021a43 235 * @param [in]n num bus onewire
fblanc 0:9acbbb021a43 236 * @param [in] uint8_t diff
fblanc 0:9acbbb021a43 237 * @param [out] id romcode
fblanc 0:9acbbb021a43 238 * @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR
fblanc 0:9acbbb021a43 239 * @date 30/08/2011
fblanc 0:9acbbb021a43 240 */
fblanc 0:9acbbb021a43 241 uint8_t ow_rom_search(uint8_t n, uint8_t diff, uint8_t id[] ) {
fblanc 0:9acbbb021a43 242 uint8_t i, j, next_diff;
fblanc 0:9acbbb021a43 243 uint8_t b;
fblanc 0:9acbbb021a43 244 if ( ow_reset(n) )
fblanc 0:9acbbb021a43 245 return OW_PRESENCE_ERR; // error, no device found
fblanc 0:9acbbb021a43 246 ow_byte_wr(n, OW_SEARCH_ROM ); // ROM search command
fblanc 0:9acbbb021a43 247 next_diff = OW_LAST_DEVICE; // unchanged on last device
fblanc 0:9acbbb021a43 248 i = OW_ROMCODE_SIZE * 8; // 8 bytes
fblanc 0:9acbbb021a43 249 do {
fblanc 0:9acbbb021a43 250 j = 8; // 8 bits
fblanc 0:9acbbb021a43 251 do {
fblanc 0:9acbbb021a43 252 b = ow_bit_io(n, 1 ); // read bit
fblanc 0:9acbbb021a43 253 if ( ow_bit_io(n, 1 ) ) { // read complement bit
fblanc 0:9acbbb021a43 254 if ( b ) // 11
fblanc 0:9acbbb021a43 255 {
fblanc 0:9acbbb021a43 256
fblanc 0:9acbbb021a43 257 return OW_DATA_ERR; // data error
fblanc 0:9acbbb021a43 258 }
fblanc 0:9acbbb021a43 259 } else {
fblanc 0:9acbbb021a43 260 if ( !b ) { // 00 = 2 devices
fblanc 0:9acbbb021a43 261 if ( diff > i || ((*id & 1) && diff != i) ) {
fblanc 0:9acbbb021a43 262 b = 1; // now 1
fblanc 0:9acbbb021a43 263 next_diff = i; // next pass 0
fblanc 0:9acbbb021a43 264 }
fblanc 0:9acbbb021a43 265 }
fblanc 0:9acbbb021a43 266 }
fblanc 0:9acbbb021a43 267 ow_bit_io(n, b ); // write bit
fblanc 0:9acbbb021a43 268
fblanc 0:9acbbb021a43 269 *id >>= 1;
fblanc 0:9acbbb021a43 270 if ( b )
fblanc 0:9acbbb021a43 271 *id |= 0x80; // store bit
fblanc 0:9acbbb021a43 272 --i;
fblanc 0:9acbbb021a43 273 } while ( --j );
fblanc 0:9acbbb021a43 274 id++; // next byte
fblanc 0:9acbbb021a43 275
fblanc 0:9acbbb021a43 276 } while ( i );
fblanc 0:9acbbb021a43 277
fblanc 0:9acbbb021a43 278
fblanc 0:9acbbb021a43 279 return next_diff; // to continue search
fblanc 0:9acbbb021a43 280 }
fblanc 0:9acbbb021a43 281
fblanc 0:9acbbb021a43 282
fblanc 0:9acbbb021a43 283 //**********************************************************************************************************
fblanc 0:9acbbb021a43 284 //* test pin onewire bus
fblanc 0:9acbbb021a43 285 //**********************************************************************************************************
fblanc 0:9acbbb021a43 286 /**
fblanc 0:9acbbb021a43 287 * @brief test pin onewire bus
fblanc 0:9acbbb021a43 288 * @return etat pin ow
fblanc 0:9acbbb021a43 289 * @date 20/06/2011
fblanc 0:9acbbb021a43 290 */
fblanc 0:9acbbb021a43 291 uint8_t ow_test_pin (void){
fblanc 0:9acbbb021a43 292 if (ow_pin)
fblanc 0:9acbbb021a43 293 return 1;
fblanc 0:9acbbb021a43 294 return 0;
fblanc 0:9acbbb021a43 295 }
fblanc 0:9acbbb021a43 296
fblanc 0:9acbbb021a43 297 /**
fblanc 0:9acbbb021a43 298 * @brief test pin onewire bus
fblanc 0:9acbbb021a43 299 * @param [in] num bus one wire
fblanc 0:9acbbb021a43 300 * @return etat pin ow
fblanc 0:9acbbb021a43 301 * @date 30/08/2011
fblanc 0:9acbbb021a43 302 */
fblanc 0:9acbbb021a43 303 uint8_t ow_test_pin (uint8_t n){
fblanc 0:9acbbb021a43 304
fblanc 0:9acbbb021a43 305 if (*t_ow[n])
fblanc 0:9acbbb021a43 306 return 1;
fblanc 0:9acbbb021a43 307 return 0;
fblanc 0:9acbbb021a43 308 }
fblanc 0:9acbbb021a43 309
fblanc 0:9acbbb021a43 310 //**********************************************************************************************************
fblanc 0:9acbbb021a43 311 //* onewire reset bus
fblanc 0:9acbbb021a43 312 //**********************************************************************************************************
fblanc 0:9acbbb021a43 313 /**
fblanc 0:9acbbb021a43 314 * @brief onewire reset bus
fblanc 0:9acbbb021a43 315 * @return pin ow or OW_SHORT_CIRCUIT
fblanc 0:9acbbb021a43 316 * @date 20/06/2011
fblanc 0:9acbbb021a43 317 */
fblanc 0:9acbbb021a43 318 uint8_t ow_reset(void) { // reset. Should improve to act as a presence pulse
fblanc 0:9acbbb021a43 319 uint8_t err;
fblanc 0:9acbbb021a43 320
fblanc 0:9acbbb021a43 321 ow_pin.output();
fblanc 0:9acbbb021a43 322 ow_pin = 0; // bring low for 500 us
fblanc 0:9acbbb021a43 323 wait_us(500);
fblanc 0:9acbbb021a43 324 ow_pin.input();
fblanc 0:9acbbb021a43 325 wait_us(60);
fblanc 0:9acbbb021a43 326 err = ow_pin;
fblanc 0:9acbbb021a43 327 wait_us(240);
fblanc 0:9acbbb021a43 328 if ( ow_pin == 0 ) { // short circuit
fblanc 0:9acbbb021a43 329 err = OW_SHORT_CIRCUIT;
fblanc 0:9acbbb021a43 330 }
fblanc 0:9acbbb021a43 331 return err;
fblanc 0:9acbbb021a43 332 }
fblanc 0:9acbbb021a43 333
fblanc 0:9acbbb021a43 334 /**
fblanc 0:9acbbb021a43 335 * @brief onewire reset bus
fblanc 0:9acbbb021a43 336 * @param [in] num bus onewire
fblanc 0:9acbbb021a43 337 * @return pin ow or OW_SHORT_CIRCUIT
fblanc 0:9acbbb021a43 338 * @date 30/08/2011
fblanc 0:9acbbb021a43 339 */
fblanc 0:9acbbb021a43 340 uint8_t ow_reset(uint8_t n) { // reset. Should improve to act as a presence pulse
fblanc 0:9acbbb021a43 341 uint8_t err;
fblanc 0:9acbbb021a43 342
fblanc 0:9acbbb021a43 343 t_ow[n]->output();
fblanc 0:9acbbb021a43 344 *t_ow[n] = 0; // bring low for 500 us
fblanc 0:9acbbb021a43 345 wait_us(500);
fblanc 0:9acbbb021a43 346 t_ow[n]->input();
fblanc 0:9acbbb021a43 347 wait_us(60);
fblanc 0:9acbbb021a43 348 err = *t_ow[n];
fblanc 0:9acbbb021a43 349 wait_us(240);
fblanc 0:9acbbb021a43 350 if ( *t_ow[n] == 0 ) { // short circuit
fblanc 0:9acbbb021a43 351 err = OW_SHORT_CIRCUIT;
fblanc 0:9acbbb021a43 352
fblanc 0:9acbbb021a43 353 }
fblanc 0:9acbbb021a43 354 return err;
fblanc 0:9acbbb021a43 355 }
fblanc 0:9acbbb021a43 356 //**********************************************************************************************************
fblanc 0:9acbbb021a43 357 //* read write onewire
fblanc 0:9acbbb021a43 358 //**********************************************************************************************************
fblanc 0:9acbbb021a43 359 /**
fblanc 0:9acbbb021a43 360 * @brief read write onewire
fblanc 0:9acbbb021a43 361 * @param [in/out] b data
fblanc 0:9acbbb021a43 362 * @return data
fblanc 0:9acbbb021a43 363 * @date 20/06/2011
fblanc 0:9acbbb021a43 364 */
fblanc 0:9acbbb021a43 365 uint8_t ow_bit_io( uint8_t b ) {
fblanc 0:9acbbb021a43 366
fblanc 0:9acbbb021a43 367 ow_pin.output(); // drive bus low
fblanc 0:9acbbb021a43 368 ow_pin = 0;
fblanc 0:9acbbb021a43 369 wait_us(1); // Recovery-Time wuffwuff was 1
fblanc 0:9acbbb021a43 370
fblanc 0:9acbbb021a43 371 if ( b )
fblanc 0:9acbbb021a43 372 ow_pin.input(); // if bit is 1 set bus high (by ext. pull-up)
fblanc 0:9acbbb021a43 373 // delay was 15uS-1 see comment above
fblanc 0:9acbbb021a43 374 wait_us(15-1);
fblanc 0:9acbbb021a43 375 if ( ow_pin == 0 ) b = 0; // sample at end of read-timeslot
fblanc 0:9acbbb021a43 376 wait_us(60-15);
fblanc 0:9acbbb021a43 377 ow_pin.input();
fblanc 0:9acbbb021a43 378 return b;
fblanc 0:9acbbb021a43 379 }
fblanc 0:9acbbb021a43 380 /**
fblanc 0:9acbbb021a43 381 * @brief read write onewire
fblanc 0:9acbbb021a43 382 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 383 * @param [in/out] b data
fblanc 0:9acbbb021a43 384 * @return data
fblanc 0:9acbbb021a43 385 * @date 30/08/2011
fblanc 0:9acbbb021a43 386 */
fblanc 0:9acbbb021a43 387 uint8_t ow_bit_io(uint8_t n, uint8_t b ) {
fblanc 0:9acbbb021a43 388
fblanc 0:9acbbb021a43 389 t_ow[n]->output(); // drive bus low
fblanc 0:9acbbb021a43 390 *t_ow[n] = 0;
fblanc 0:9acbbb021a43 391 wait_us(1); // Recovery-Time wuffwuff was 1
fblanc 0:9acbbb021a43 392
fblanc 0:9acbbb021a43 393 if ( b )
fblanc 0:9acbbb021a43 394 t_ow[n]->input(); // if bit is 1 set bus high (by ext. pull-up)
fblanc 0:9acbbb021a43 395 // delay was 15uS-1 see comment above
fblanc 0:9acbbb021a43 396 wait_us(15-1);
fblanc 0:9acbbb021a43 397 if ( *t_ow[n] == 0 ) b = 0; // sample at end of read-timeslot
fblanc 0:9acbbb021a43 398 wait_us(60-15);
fblanc 0:9acbbb021a43 399 t_ow[n]->input();
fblanc 0:9acbbb021a43 400 // printf("ow_bit_io n=%d b=%X\n",n,b);
fblanc 0:9acbbb021a43 401 return b;
fblanc 0:9acbbb021a43 402 }
fblanc 0:9acbbb021a43 403 //**********************************************************************************************************
fblanc 0:9acbbb021a43 404 //* byte write on onewire
fblanc 0:9acbbb021a43 405 //**********************************************************************************************************
fblanc 0:9acbbb021a43 406 /**
fblanc 0:9acbbb021a43 407 * @brief byte write on onewire
fblanc 0:9acbbb021a43 408 * @param [in] b data
fblanc 0:9acbbb021a43 409 * @return data
fblanc 0:9acbbb021a43 410 * @date 20/06/2011
fblanc 0:9acbbb021a43 411 */
fblanc 0:9acbbb021a43 412 uint8_t ow_byte_wr( uint8_t b ) {
fblanc 0:9acbbb021a43 413 uint8_t i = 8, j;
fblanc 0:9acbbb021a43 414
fblanc 0:9acbbb021a43 415 do {
fblanc 0:9acbbb021a43 416 j = ow_bit_io( b & 1 );
fblanc 0:9acbbb021a43 417 b >>= 1;
fblanc 0:9acbbb021a43 418 if ( j )
fblanc 0:9acbbb021a43 419 b |= 0x80;
fblanc 0:9acbbb021a43 420 } while ( --i );
fblanc 0:9acbbb021a43 421 return b;
fblanc 0:9acbbb021a43 422 }
fblanc 0:9acbbb021a43 423 /**
fblanc 0:9acbbb021a43 424 * @brief byte write on onewire
fblanc 0:9acbbb021a43 425 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 426 * @param [in] b data
fblanc 0:9acbbb021a43 427 * @return data
fblanc 0:9acbbb021a43 428 * @date 30/08/2011
fblanc 0:9acbbb021a43 429 */
fblanc 0:9acbbb021a43 430 uint8_t ow_byte_wr(uint8_t n, uint8_t b ) {
fblanc 0:9acbbb021a43 431 uint8_t i = 8, j;
fblanc 0:9acbbb021a43 432
fblanc 0:9acbbb021a43 433 do {
fblanc 0:9acbbb021a43 434 j = ow_bit_io(n, b & 1 );
fblanc 0:9acbbb021a43 435 b >>= 1;
fblanc 0:9acbbb021a43 436 if ( j )
fblanc 0:9acbbb021a43 437 b |= 0x80;
fblanc 0:9acbbb021a43 438 } while ( --i );
fblanc 0:9acbbb021a43 439 return b;
fblanc 0:9acbbb021a43 440 }
fblanc 0:9acbbb021a43 441 //**********************************************************************************************************
fblanc 0:9acbbb021a43 442 //* byte write on onewire
fblanc 0:9acbbb021a43 443 //**********************************************************************************************************
fblanc 0:9acbbb021a43 444 /**
fblanc 0:9acbbb021a43 445 * @brief byte read on onewire
fblanc 0:9acbbb021a43 446 * @return data
fblanc 0:9acbbb021a43 447 * @date 20/06/2011
fblanc 0:9acbbb021a43 448 */
fblanc 0:9acbbb021a43 449 uint8_t ow_byte_rd( void ) {
fblanc 0:9acbbb021a43 450 // read by sending 0xff (a dontcare?)
fblanc 0:9acbbb021a43 451 return ow_byte_wr( 0xFF );
fblanc 0:9acbbb021a43 452 }
fblanc 0:9acbbb021a43 453
fblanc 0:9acbbb021a43 454 /**
fblanc 0:9acbbb021a43 455 * @brief byte read on onewire
fblanc 0:9acbbb021a43 456 * @param [in] n num onewire
fblanc 0:9acbbb021a43 457 * @return data
fblanc 0:9acbbb021a43 458 * @date 30/08/2011
fblanc 0:9acbbb021a43 459 */
fblanc 0:9acbbb021a43 460 uint8_t ow_byte_rd( uint8_t n) {
fblanc 0:9acbbb021a43 461 // read by sending 0xff (a dontcare?)
fblanc 0:9acbbb021a43 462 return ow_byte_wr(n, 0xFF );
fblanc 0:9acbbb021a43 463 }
fblanc 0:9acbbb021a43 464 //**********************************************************************************************************
fblanc 0:9acbbb021a43 465 //* byte write on onewire
fblanc 0:9acbbb021a43 466 //**********************************************************************************************************
fblanc 0:9acbbb021a43 467 /**
fblanc 0:9acbbb021a43 468 * @brief write command
fblanc 0:9acbbb021a43 469 * @param [in] command
fblanc 0:9acbbb021a43 470 * @param [in] id romcode
fblanc 0:9acbbb021a43 471 * @date 20/06/2011
fblanc 0:9acbbb021a43 472 */
fblanc 0:9acbbb021a43 473 uint8_t ow_command( uint8_t command, uint8_t id[] ) {
fblanc 0:9acbbb021a43 474 uint8_t i;
fblanc 0:9acbbb021a43 475
fblanc 0:9acbbb021a43 476 ow_reset();
fblanc 0:9acbbb021a43 477 if ( id ) {
fblanc 0:9acbbb021a43 478 ow_byte_wr( OW_MATCH_ROM ); // to a single device
fblanc 0:9acbbb021a43 479 i = OW_ROMCODE_SIZE;
fblanc 0:9acbbb021a43 480 do {
fblanc 0:9acbbb021a43 481 ow_byte_wr( *id );
fblanc 0:9acbbb021a43 482 ++id;
fblanc 0:9acbbb021a43 483 } while ( --i );
fblanc 0:9acbbb021a43 484 } else {
fblanc 0:9acbbb021a43 485 ow_byte_wr( OW_SKIP_ROM ); // to all devices
fblanc 0:9acbbb021a43 486 }
fblanc 0:9acbbb021a43 487 ow_byte_wr( command );
fblanc 0:9acbbb021a43 488 return 0;
fblanc 0:9acbbb021a43 489 }
fblanc 0:9acbbb021a43 490 /**
fblanc 0:9acbbb021a43 491 * @brief write command
fblanc 0:9acbbb021a43 492 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 493 * @param [in] command
fblanc 0:9acbbb021a43 494 * @param [in] id romcode
fblanc 0:9acbbb021a43 495 * @date 30/08/2011
fblanc 0:9acbbb021a43 496 */
fblanc 0:9acbbb021a43 497 uint8_t ow_command(uint8_t n, uint8_t command, uint8_t id[] ) {
fblanc 0:9acbbb021a43 498 uint8_t i;
fblanc 0:9acbbb021a43 499
fblanc 0:9acbbb021a43 500 ow_reset(n);
fblanc 0:9acbbb021a43 501 if ( id ) {
fblanc 0:9acbbb021a43 502 ow_byte_wr( n,OW_MATCH_ROM ); // to a single device
fblanc 0:9acbbb021a43 503 i = OW_ROMCODE_SIZE;
fblanc 0:9acbbb021a43 504 do {
fblanc 0:9acbbb021a43 505 ow_byte_wr(n, *id );
fblanc 0:9acbbb021a43 506 ++id;
fblanc 0:9acbbb021a43 507 } while ( --i );
fblanc 0:9acbbb021a43 508 } else {
fblanc 0:9acbbb021a43 509 ow_byte_wr(n, OW_SKIP_ROM ); // to all devices
fblanc 0:9acbbb021a43 510 }
fblanc 0:9acbbb021a43 511 ow_byte_wr(n, command );
fblanc 0:9acbbb021a43 512 return 0;
fblanc 0:9acbbb021a43 513 }
fblanc 0:9acbbb021a43 514 //**********************************************************************************************************
fblanc 0:9acbbb021a43 515 //* ow mode
fblanc 0:9acbbb021a43 516 //**********************************************************************************************************
fblanc 0:9acbbb021a43 517 /**
fblanc 0:9acbbb021a43 518 * @brief parasite enable
fblanc 0:9acbbb021a43 519 * @date 20/06/2011
fblanc 0:9acbbb021a43 520 */
fblanc 0:9acbbb021a43 521 uint8_t ow_parasite_enable(void) {
fblanc 0:9acbbb021a43 522 ow_pin.output();
fblanc 0:9acbbb021a43 523 ow_pin = 1;
fblanc 0:9acbbb021a43 524 return 0;
fblanc 0:9acbbb021a43 525 }
fblanc 0:9acbbb021a43 526 /**
fblanc 0:9acbbb021a43 527 * @brief parasite disable
fblanc 0:9acbbb021a43 528 * @date 20/06/2011
fblanc 0:9acbbb021a43 529 */
fblanc 0:9acbbb021a43 530 uint8_t ow_parasite_disable(void) {
fblanc 0:9acbbb021a43 531
fblanc 0:9acbbb021a43 532 ow_pin.input();
fblanc 0:9acbbb021a43 533 return 0;
fblanc 0:9acbbb021a43 534 }
fblanc 0:9acbbb021a43 535
fblanc 0:9acbbb021a43 536 /**
fblanc 0:9acbbb021a43 537 * @brief parasite enable
fblanc 0:9acbbb021a43 538 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 539 * @date 30/08/2011
fblanc 0:9acbbb021a43 540 */
fblanc 0:9acbbb021a43 541 uint8_t ow_parasite_enable(uint8_t n) {
fblanc 0:9acbbb021a43 542 t_ow[n]->output();
fblanc 0:9acbbb021a43 543 *t_ow[n] = 1;
fblanc 0:9acbbb021a43 544 return 0;
fblanc 0:9acbbb021a43 545 }
fblanc 0:9acbbb021a43 546 /**
fblanc 0:9acbbb021a43 547 * @brief parasite disable
fblanc 0:9acbbb021a43 548 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 549 * @date 30/08/2011
fblanc 0:9acbbb021a43 550 */
fblanc 0:9acbbb021a43 551 uint8_t ow_parasite_disable(uint8_t n) {
fblanc 0:9acbbb021a43 552 t_ow[n]->input();
fblanc 0:9acbbb021a43 553 return 0;
fblanc 0:9acbbb021a43 554 }
fblanc 0:9acbbb021a43 555 /**
fblanc 0:9acbbb021a43 556 * @brief PUL-UP bus OW
fblanc 0:9acbbb021a43 557 * @return OW_OK
fblanc 0:9acbbb021a43 558 * @date 20/06/2011
fblanc 0:9acbbb021a43 559 */
fblanc 0:9acbbb021a43 560 uint8_t ow_PullUp(void)
fblanc 0:9acbbb021a43 561 {
fblanc 0:9acbbb021a43 562 ow_pin.mode(PullUp); //PULL-UP bus OW
fblanc 0:9acbbb021a43 563 return OW_OK;
fblanc 0:9acbbb021a43 564 }
fblanc 0:9acbbb021a43 565 /**
fblanc 0:9acbbb021a43 566 * @brief PUL-UP bus OW
fblanc 0:9acbbb021a43 567 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 568 * @return OW_OK
fblanc 0:9acbbb021a43 569 * @date 30/08/2011
fblanc 0:9acbbb021a43 570 */
fblanc 0:9acbbb021a43 571 uint8_t ow_PullUp(uint8_t n)
fblanc 0:9acbbb021a43 572 {
fblanc 0:9acbbb021a43 573 t_ow[n]->mode(PullUp); //PULL-UP bus OW
fblanc 0:9acbbb021a43 574 return OW_OK;
fblanc 0:9acbbb021a43 575 }