One Wire Example striped to find sensors only builds using MBED 2 Library

Dependencies:   mbed

Committer:
Roietronics
Date:
Mon Jun 05 21:11:32 2017 +0000
Revision:
0:486c7ab9114b
Initial commit of one wire example for MBED 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Roietronics 0:486c7ab9114b 1 /**
Roietronics 0:486c7ab9114b 2 * @file onewire.c
Roietronics 0:486c7ab9114b 3 * @brief library 1-Wire(www.maxim-ic.com)
Roietronics 0:486c7ab9114b 4 * @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
Roietronics 0:486c7ab9114b 5 * @author Frederic BLANC
Roietronics 0:486c7ab9114b 6 */
Roietronics 0:486c7ab9114b 7 #include "mbed.h"
Roietronics 0:486c7ab9114b 8 #include "onewire.h"
Roietronics 0:486c7ab9114b 9 #include "DS2450.h"
Roietronics 0:486c7ab9114b 10 #include "DS18X20.h"
Roietronics 0:486c7ab9114b 11 #include "crc8.h"
Roietronics 0:486c7ab9114b 12
Roietronics 0:486c7ab9114b 13 DigitalInOut ow_pin(ONEWIRE_PIN);
Roietronics 0:486c7ab9114b 14
Roietronics 0:486c7ab9114b 15 /**
Roietronics 0:486c7ab9114b 16 * @brief PUL-UP bus OW
Roietronics 0:486c7ab9114b 17 * @return OW_OK
Roietronics 0:486c7ab9114b 18 * @date 20/06/2011
Roietronics 0:486c7ab9114b 19 */
Roietronics 0:486c7ab9114b 20 uint8_t ow_PullUp(void)
Roietronics 0:486c7ab9114b 21 {
Roietronics 0:486c7ab9114b 22 ow_pin.mode(PullUp); //PULL-UP bus OW
Roietronics 0:486c7ab9114b 23 return OW_OK;
Roietronics 0:486c7ab9114b 24 }
Roietronics 0:486c7ab9114b 25 /**
Roietronics 0:486c7ab9114b 26 * @brief search_sensors
Roietronics 0:486c7ab9114b 27 * @param [out] nSensors number of device onewire
Roietronics 0:486c7ab9114b 28 * @param [out] gSensorIDs[][] array of id romcode
Roietronics 0:486c7ab9114b 29 * @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR
Roietronics 0:486c7ab9114b 30 * @date 20/06/2011
Roietronics 0:486c7ab9114b 31 */
Roietronics 0:486c7ab9114b 32 uint8_t search_sensors(uint8_t *nSensors,uint8_t *gSensorIDs ) {
Roietronics 0:486c7ab9114b 33 uint8_t i;
Roietronics 0:486c7ab9114b 34 uint8_t id[OW_ROMCODE_SIZE];
Roietronics 0:486c7ab9114b 35 uint8_t diff;
Roietronics 0:486c7ab9114b 36 printf( "Scanning Bus\n" );
Roietronics 0:486c7ab9114b 37 diff = OW_SEARCH_FIRST;
Roietronics 0:486c7ab9114b 38 for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) {
Roietronics 0:486c7ab9114b 39 ow_find_sensor( &diff, &id[0] );
Roietronics 0:486c7ab9114b 40 if ( diff == OW_PRESENCE_ERR ) {
Roietronics 0:486c7ab9114b 41 printf( "No Sensor found\n" );
Roietronics 0:486c7ab9114b 42 return diff;
Roietronics 0:486c7ab9114b 43 }
Roietronics 0:486c7ab9114b 44 if ( diff == OW_DATA_ERR ) {
Roietronics 0:486c7ab9114b 45 printf( "Bus Error\n" );
Roietronics 0:486c7ab9114b 46 return diff;
Roietronics 0:486c7ab9114b 47 }
Roietronics 0:486c7ab9114b 48 for (i=0;i<OW_ROMCODE_SIZE;i++)
Roietronics 0:486c7ab9114b 49 gSensorIDs[(*nSensors)*OW_ROMCODE_SIZE+i]=id[i];
Roietronics 0:486c7ab9114b 50
Roietronics 0:486c7ab9114b 51 }
Roietronics 0:486c7ab9114b 52 return OW_OK;
Roietronics 0:486c7ab9114b 53 }
Roietronics 0:486c7ab9114b 54 /**
Roietronics 0:486c7ab9114b 55 * @brief show_id
Roietronics 0:486c7ab9114b 56 * @param [in] id[] = rom_code
Roietronics 0:486c7ab9114b 57 * @param [in] n number of id[n]
Roietronics 0:486c7ab9114b 58 * @param [out] text id
Roietronics 0:486c7ab9114b 59 * @return OW_OK or OW_ERROR_CRC
Roietronics 0:486c7ab9114b 60 * @date 20/06/2011
Roietronics 0:486c7ab9114b 61 */
Roietronics 0:486c7ab9114b 62 uint8_t ow_show_id( uint8_t id[], size_t n ,char *text) {
Roietronics 0:486c7ab9114b 63 size_t i;
Roietronics 0:486c7ab9114b 64 char hex[4];
Roietronics 0:486c7ab9114b 65 sprintf(text,"");
Roietronics 0:486c7ab9114b 66
Roietronics 0:486c7ab9114b 67 for ( i = 0; i < n; i++ ) {
Roietronics 0:486c7ab9114b 68 if ( i == 0 ) strcat(text, " FC: " );
Roietronics 0:486c7ab9114b 69 else if ( i == n-1 ) strcat(text, "CRC: " );
Roietronics 0:486c7ab9114b 70 if ( i == 1 ) strcat(text, " SN: " );
Roietronics 0:486c7ab9114b 71 sprintf(hex,"%2.2X ",id[i]);
Roietronics 0:486c7ab9114b 72 strcat(text,hex);
Roietronics 0:486c7ab9114b 73 if ( i == 0 ) {
Roietronics 0:486c7ab9114b 74 if ( id[0] == DS18S20_ID ) strcat(text,"(18S)");
Roietronics 0:486c7ab9114b 75 else if ( id[0] == DS18B20_ID ) strcat(text,"(18B)");
Roietronics 0:486c7ab9114b 76 else if ( id[0] == DS2450_ID ) strcat(text,"(ADC)");
Roietronics 0:486c7ab9114b 77 else strcat(text,"( ? )");
Roietronics 0:486c7ab9114b 78 }
Roietronics 0:486c7ab9114b 79 }
Roietronics 0:486c7ab9114b 80 if ( crc8( id, OW_ROMCODE_SIZE) )
Roietronics 0:486c7ab9114b 81 return OW_ERROR_CRC;
Roietronics 0:486c7ab9114b 82 return OW_OK;
Roietronics 0:486c7ab9114b 83 }
Roietronics 0:486c7ab9114b 84
Roietronics 0:486c7ab9114b 85 /**
Roietronics 0:486c7ab9114b 86 * @brief test pin onewire bus
Roietronics 0:486c7ab9114b 87 * @return etat pin ow
Roietronics 0:486c7ab9114b 88 * @date 20/06/2011
Roietronics 0:486c7ab9114b 89 */
Roietronics 0:486c7ab9114b 90 uint8_t ow_test_pin (void){
Roietronics 0:486c7ab9114b 91 if (ow_pin)
Roietronics 0:486c7ab9114b 92 return 1;
Roietronics 0:486c7ab9114b 93 return 0;
Roietronics 0:486c7ab9114b 94 }
Roietronics 0:486c7ab9114b 95 /**
Roietronics 0:486c7ab9114b 96 * @brief onewire reset bus
Roietronics 0:486c7ab9114b 97 * @return pin ow or OW_SHORT_CIRCUIT
Roietronics 0:486c7ab9114b 98 * @date 20/06/2011
Roietronics 0:486c7ab9114b 99 */
Roietronics 0:486c7ab9114b 100 uint8_t ow_reset(void) { // reset. Should improve to act as a presence pulse
Roietronics 0:486c7ab9114b 101 uint8_t err;
Roietronics 0:486c7ab9114b 102
Roietronics 0:486c7ab9114b 103 ow_pin.output();
Roietronics 0:486c7ab9114b 104 ow_pin = 0; // bring low for 500 us
Roietronics 0:486c7ab9114b 105 wait_us(500);
Roietronics 0:486c7ab9114b 106 ow_pin.input();
Roietronics 0:486c7ab9114b 107 wait_us(60);
Roietronics 0:486c7ab9114b 108 err = ow_pin;
Roietronics 0:486c7ab9114b 109 wait_us(240);
Roietronics 0:486c7ab9114b 110 if ( ow_pin == 0 ) { // short circuit
Roietronics 0:486c7ab9114b 111 err = OW_SHORT_CIRCUIT;
Roietronics 0:486c7ab9114b 112 }
Roietronics 0:486c7ab9114b 113 return err;
Roietronics 0:486c7ab9114b 114 }
Roietronics 0:486c7ab9114b 115
Roietronics 0:486c7ab9114b 116 /**
Roietronics 0:486c7ab9114b 117 * @brief read write onewire
Roietronics 0:486c7ab9114b 118 * @param [in/out] b data
Roietronics 0:486c7ab9114b 119 * @return data
Roietronics 0:486c7ab9114b 120 * @date 20/06/2011
Roietronics 0:486c7ab9114b 121 */
Roietronics 0:486c7ab9114b 122 uint8_t ow_bit_io( uint8_t b ) {
Roietronics 0:486c7ab9114b 123
Roietronics 0:486c7ab9114b 124 ow_pin.output(); // drive bus low
Roietronics 0:486c7ab9114b 125 ow_pin = 0;
Roietronics 0:486c7ab9114b 126 wait_us(1); // Recovery-Time wuffwuff was 1
Roietronics 0:486c7ab9114b 127
Roietronics 0:486c7ab9114b 128 if ( b )
Roietronics 0:486c7ab9114b 129 ow_pin.input(); // if bit is 1 set bus high (by ext. pull-up)
Roietronics 0:486c7ab9114b 130 // delay was 15uS-1 see comment above
Roietronics 0:486c7ab9114b 131 wait_us(15-1);
Roietronics 0:486c7ab9114b 132 if ( ow_pin == 0 ) b = 0; // sample at end of read-timeslot
Roietronics 0:486c7ab9114b 133 wait_us(60-15);
Roietronics 0:486c7ab9114b 134 ow_pin.input();
Roietronics 0:486c7ab9114b 135 return b;
Roietronics 0:486c7ab9114b 136 }
Roietronics 0:486c7ab9114b 137
Roietronics 0:486c7ab9114b 138 /**
Roietronics 0:486c7ab9114b 139 * @brief byte write on onewire
Roietronics 0:486c7ab9114b 140 * @param [in] b data
Roietronics 0:486c7ab9114b 141 * @return data
Roietronics 0:486c7ab9114b 142 * @date 20/06/2011
Roietronics 0:486c7ab9114b 143 */
Roietronics 0:486c7ab9114b 144 uint8_t ow_byte_wr( uint8_t b ) {
Roietronics 0:486c7ab9114b 145 uint8_t i = 8, j;
Roietronics 0:486c7ab9114b 146
Roietronics 0:486c7ab9114b 147 do {
Roietronics 0:486c7ab9114b 148 j = ow_bit_io( b & 1 );
Roietronics 0:486c7ab9114b 149 b >>= 1;
Roietronics 0:486c7ab9114b 150 if ( j )
Roietronics 0:486c7ab9114b 151 b |= 0x80;
Roietronics 0:486c7ab9114b 152 } while ( --i );
Roietronics 0:486c7ab9114b 153 return b;
Roietronics 0:486c7ab9114b 154 }
Roietronics 0:486c7ab9114b 155
Roietronics 0:486c7ab9114b 156 /**
Roietronics 0:486c7ab9114b 157 * @brief byte read on onewire
Roietronics 0:486c7ab9114b 158 * @param [in] uint8_t b
Roietronics 0:486c7ab9114b 159 * @return
Roietronics 0:486c7ab9114b 160 * @date 20/06/2011
Roietronics 0:486c7ab9114b 161 */
Roietronics 0:486c7ab9114b 162 uint8_t ow_byte_rd( void ) {
Roietronics 0:486c7ab9114b 163 // read by sending 0xff (a dontcare?)
Roietronics 0:486c7ab9114b 164 return ow_byte_wr( 0xFF );
Roietronics 0:486c7ab9114b 165 }
Roietronics 0:486c7ab9114b 166
Roietronics 0:486c7ab9114b 167
Roietronics 0:486c7ab9114b 168 /**
Roietronics 0:486c7ab9114b 169 * @brief search romcode
Roietronics 0:486c7ab9114b 170 * @param [in] uint8_t diff
Roietronics 0:486c7ab9114b 171 * @param [out] id romcode
Roietronics 0:486c7ab9114b 172 * @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR
Roietronics 0:486c7ab9114b 173 * @date 20/06/2011
Roietronics 0:486c7ab9114b 174 */
Roietronics 0:486c7ab9114b 175 uint8_t ow_rom_search( uint8_t diff, uint8_t id[] ) {
Roietronics 0:486c7ab9114b 176 uint8_t i, j, next_diff;
Roietronics 0:486c7ab9114b 177 uint8_t b;
Roietronics 0:486c7ab9114b 178
Roietronics 0:486c7ab9114b 179 if ( ow_reset() )
Roietronics 0:486c7ab9114b 180 return OW_PRESENCE_ERR; // error, no device found
Roietronics 0:486c7ab9114b 181 ow_byte_wr( OW_SEARCH_ROM ); // ROM search command
Roietronics 0:486c7ab9114b 182 next_diff = OW_LAST_DEVICE; // unchanged on last device
Roietronics 0:486c7ab9114b 183 i = OW_ROMCODE_SIZE * 8; // 8 bytes
Roietronics 0:486c7ab9114b 184 do {
Roietronics 0:486c7ab9114b 185 j = 8; // 8 bits
Roietronics 0:486c7ab9114b 186 do {
Roietronics 0:486c7ab9114b 187 b = ow_bit_io( 1 ); // read bit
Roietronics 0:486c7ab9114b 188 if ( ow_bit_io( 1 ) ) { // read complement bit
Roietronics 0:486c7ab9114b 189 if ( b ) // 11
Roietronics 0:486c7ab9114b 190 return OW_DATA_ERR; // data error
Roietronics 0:486c7ab9114b 191 } else {
Roietronics 0:486c7ab9114b 192 if ( !b ) { // 00 = 2 devices
Roietronics 0:486c7ab9114b 193 if ( diff > i || ((*id & 1) && diff != i) ) {
Roietronics 0:486c7ab9114b 194 b = 1; // now 1
Roietronics 0:486c7ab9114b 195 next_diff = i; // next pass 0
Roietronics 0:486c7ab9114b 196 }
Roietronics 0:486c7ab9114b 197 }
Roietronics 0:486c7ab9114b 198 }
Roietronics 0:486c7ab9114b 199 ow_bit_io( b ); // write bit
Roietronics 0:486c7ab9114b 200 *id >>= 1;
Roietronics 0:486c7ab9114b 201 if ( b )
Roietronics 0:486c7ab9114b 202 *id |= 0x80; // store bit
Roietronics 0:486c7ab9114b 203 --i;
Roietronics 0:486c7ab9114b 204 } while ( --j );
Roietronics 0:486c7ab9114b 205 id++; // next byte
Roietronics 0:486c7ab9114b 206 } while ( i );
Roietronics 0:486c7ab9114b 207 return next_diff; // to continue search
Roietronics 0:486c7ab9114b 208 }
Roietronics 0:486c7ab9114b 209
Roietronics 0:486c7ab9114b 210 /**
Roietronics 0:486c7ab9114b 211 * @brief write command
Roietronics 0:486c7ab9114b 212 * @param [in] command
Roietronics 0:486c7ab9114b 213 * @param [in] id romcode
Roietronics 0:486c7ab9114b 214 * @date 20/06/2011
Roietronics 0:486c7ab9114b 215 */
Roietronics 0:486c7ab9114b 216 uint8_t ow_command( uint8_t command, uint8_t id[] ) {
Roietronics 0:486c7ab9114b 217 uint8_t i;
Roietronics 0:486c7ab9114b 218
Roietronics 0:486c7ab9114b 219 ow_reset();
Roietronics 0:486c7ab9114b 220 if ( id ) {
Roietronics 0:486c7ab9114b 221 ow_byte_wr( OW_MATCH_ROM ); // to a single device
Roietronics 0:486c7ab9114b 222 i = OW_ROMCODE_SIZE;
Roietronics 0:486c7ab9114b 223 do {
Roietronics 0:486c7ab9114b 224 ow_byte_wr( *id );
Roietronics 0:486c7ab9114b 225 ++id;
Roietronics 0:486c7ab9114b 226 } while ( --i );
Roietronics 0:486c7ab9114b 227 } else {
Roietronics 0:486c7ab9114b 228 ow_byte_wr( OW_SKIP_ROM ); // to all devices
Roietronics 0:486c7ab9114b 229 }
Roietronics 0:486c7ab9114b 230 ow_byte_wr( command );
Roietronics 0:486c7ab9114b 231 return 0;
Roietronics 0:486c7ab9114b 232 }
Roietronics 0:486c7ab9114b 233 /**
Roietronics 0:486c7ab9114b 234 * @brief parasite enable
Roietronics 0:486c7ab9114b 235 * @date 20/06/2011
Roietronics 0:486c7ab9114b 236 */
Roietronics 0:486c7ab9114b 237 uint8_t ow_parasite_enable(void) {
Roietronics 0:486c7ab9114b 238 ow_pin.output();
Roietronics 0:486c7ab9114b 239 ow_pin = 1;
Roietronics 0:486c7ab9114b 240 return 0;
Roietronics 0:486c7ab9114b 241 }
Roietronics 0:486c7ab9114b 242 /**
Roietronics 0:486c7ab9114b 243 * @brief parasite disable
Roietronics 0:486c7ab9114b 244 * @date 20/06/2011
Roietronics 0:486c7ab9114b 245 */
Roietronics 0:486c7ab9114b 246 uint8_t ow_parasite_disable(void) {
Roietronics 0:486c7ab9114b 247
Roietronics 0:486c7ab9114b 248 ow_pin.input();
Roietronics 0:486c7ab9114b 249 return 0;
Roietronics 0:486c7ab9114b 250 }
Roietronics 0:486c7ab9114b 251
Roietronics 0:486c7ab9114b 252
Roietronics 0:486c7ab9114b 253 /**
Roietronics 0:486c7ab9114b 254 * @brief find Sensors on 1-Wire-Bus
Roietronics 0:486c7ab9114b 255 * @param [in/out] diff is the result of the last rom-search
Roietronics 0:486c7ab9114b 256 * @param [out] is the rom-code of the sensor found
Roietronics 0:486c7ab9114b 257 * @return OW_OK or OW_ERROR
Roietronics 0:486c7ab9114b 258 */
Roietronics 0:486c7ab9114b 259 uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]) {
Roietronics 0:486c7ab9114b 260 for (;;)
Roietronics 0:486c7ab9114b 261 {
Roietronics 0:486c7ab9114b 262 *diff = ow_rom_search( *diff, &id[0] );
Roietronics 0:486c7ab9114b 263 if ( *diff==OW_PRESENCE_ERR)
Roietronics 0:486c7ab9114b 264 return OW_ERROR;
Roietronics 0:486c7ab9114b 265 if ( *diff==OW_DATA_ERR )
Roietronics 0:486c7ab9114b 266 return OW_ERROR;
Roietronics 0:486c7ab9114b 267 if ( *diff == OW_LAST_DEVICE )
Roietronics 0:486c7ab9114b 268 return OW_OK ;
Roietronics 0:486c7ab9114b 269 if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID )
Roietronics 0:486c7ab9114b 270 return OW_OK ;
Roietronics 0:486c7ab9114b 271 if ( id[0] == DS2450_ID )
Roietronics 0:486c7ab9114b 272 return OW_OK ;
Roietronics 0:486c7ab9114b 273 }
Roietronics 0:486c7ab9114b 274 }
Roietronics 0:486c7ab9114b 275
Roietronics 0:486c7ab9114b 276 /**
Roietronics 0:486c7ab9114b 277 * @brief output byte d (least sig bit first)
Roietronics 0:486c7ab9114b 278 * @param [in] d output byte (least sig bit first)
Roietronics 0:486c7ab9114b 279 * @return OW_OK
Roietronics 0:486c7ab9114b 280 */
Roietronics 0:486c7ab9114b 281 uint8_t OneWireOutByte(uint8_t d) { // output byte d (least sig bit first).
Roietronics 0:486c7ab9114b 282 for (int n=8; n!=0; n--) {
Roietronics 0:486c7ab9114b 283 if ((d & 0x01) == 1) { // test least sig bit
Roietronics 0:486c7ab9114b 284 ow_pin.output();
Roietronics 0:486c7ab9114b 285 ow_pin = 0;
Roietronics 0:486c7ab9114b 286 wait_us(5);
Roietronics 0:486c7ab9114b 287 ow_pin.input();
Roietronics 0:486c7ab9114b 288 wait_us(80);
Roietronics 0:486c7ab9114b 289 } else {
Roietronics 0:486c7ab9114b 290 ow_pin.output();
Roietronics 0:486c7ab9114b 291 ow_pin = 0;
Roietronics 0:486c7ab9114b 292 wait_us(80);
Roietronics 0:486c7ab9114b 293 ow_pin.input();
Roietronics 0:486c7ab9114b 294 }
Roietronics 0:486c7ab9114b 295 d=d>>1; // now the next bit is in the least sig bit position.
Roietronics 0:486c7ab9114b 296 }
Roietronics 0:486c7ab9114b 297 return OW_OK;
Roietronics 0:486c7ab9114b 298 }
Roietronics 0:486c7ab9114b 299 /**
Roietronics 0:486c7ab9114b 300 * @brief read byte, least sig byte first
Roietronics 0:486c7ab9114b 301 * @return byte, least sig byte first
Roietronics 0:486c7ab9114b 302 */
Roietronics 0:486c7ab9114b 303 uint8_t OneWireInByte(void) { // read byte, least sig byte first
Roietronics 0:486c7ab9114b 304 uint8_t d = 0, b;
Roietronics 0:486c7ab9114b 305 for (int n=0; n<8; n++) {
Roietronics 0:486c7ab9114b 306 ow_pin.output();
Roietronics 0:486c7ab9114b 307 ow_pin = 0;
Roietronics 0:486c7ab9114b 308 wait_us(5);
Roietronics 0:486c7ab9114b 309 ow_pin.input();
Roietronics 0:486c7ab9114b 310 wait_us(5);
Roietronics 0:486c7ab9114b 311 b =ow_pin;
Roietronics 0:486c7ab9114b 312 wait_us(50);
Roietronics 0:486c7ab9114b 313 d = (d >> 1) | (b << 7); // shift d to right and insert b in most sig bit position
Roietronics 0:486c7ab9114b 314 }
Roietronics 0:486c7ab9114b 315 return d;
Roietronics 0:486c7ab9114b 316 }
Roietronics 0:486c7ab9114b 317
Roietronics 0:486c7ab9114b 318