Simple cpp wrapper of a ds18b20, onewire 'c' library. Supports multiple sensors.

Dependencies:   mbed

Dependents:   LPC11U68_DS18B20Sensor

Fork of DS18B20Sensor by Steve Spence

Committer:
Bongjun
Date:
Fri Jul 04 00:08:44 2014 +0000
Revision:
5:0bcc4e42fec0
Parent:
0:1449f126b241
added comments

Who changed what in which revision?

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