1

Dependents:   final

Committer:
ChesterLin
Date:
Mon Nov 27 06:05:15 2017 +0000
Revision:
0:3e574710804f
1-WIRE LIBRARY

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChesterLin 0:3e574710804f 1 #include "OneWire_Functions.h"
ChesterLin 0:3e574710804f 2
ChesterLin 0:3e574710804f 3 Serial pc2(USBTX,USBRX);
ChesterLin 0:3e574710804f 4
ChesterLin 0:3e574710804f 5 OneWire::OneWire (PinName wire): _pin(wire)
ChesterLin 0:3e574710804f 6 {
ChesterLin 0:3e574710804f 7
ChesterLin 0:3e574710804f 8 //default alram temperture
ChesterLin 0:3e574710804f 9 sca[2]=0x50; //+80 'C
ChesterLin 0:3e574710804f 10 sca[1]=0xec; //-25 'C
ChesterLin 0:3e574710804f 11
ChesterLin 0:3e574710804f 12
ChesterLin 0:3e574710804f 13 //default resolution
ChesterLin 0:3e574710804f 14 sca[0]=Twebitresolution;
ChesterLin 0:3e574710804f 15
ChesterLin 0:3e574710804f 16 reso = Twebitresolution;
ChesterLin 0:3e574710804f 17 }
ChesterLin 0:3e574710804f 18
ChesterLin 0:3e574710804f 19 //initialization 1-wire devices
ChesterLin 0:3e574710804f 20 int OneWire::init()
ChesterLin 0:3e574710804f 21 {
ChesterLin 0:3e574710804f 22 int result; //define a value for read presence pulse
ChesterLin 0:3e574710804f 23
ChesterLin 0:3e574710804f 24 _pin.output(); //set pin as output
ChesterLin 0:3e574710804f 25 _pin = 0; //pull the bus low
ChesterLin 0:3e574710804f 26 wait_us(480); //minimum rest pulse is 480 µs
ChesterLin 0:3e574710804f 27
ChesterLin 0:3e574710804f 28 _pin.input();//set pin as input, bus pull up by pullup resistor
ChesterLin 0:3e574710804f 29 wait_us(70); //wait for slave response
ChesterLin 0:3e574710804f 30 result = _pin.read(); //read presence pulse
ChesterLin 0:3e574710804f 31 wait_us(410);
ChesterLin 0:3e574710804f 32
ChesterLin 0:3e574710804f 33 return result; //return the presence pulse. 0->TURE. 1->FALSE
ChesterLin 0:3e574710804f 34 }
ChesterLin 0:3e574710804f 35
ChesterLin 0:3e574710804f 36 //write a bite
ChesterLin 0:3e574710804f 37 void OneWire::write_bit(uint8_t data)
ChesterLin 0:3e574710804f 38 {
ChesterLin 0:3e574710804f 39 data = data & 0x01; //only transmit LSB
ChesterLin 0:3e574710804f 40
ChesterLin 0:3e574710804f 41 if (data) {
ChesterLin 0:3e574710804f 42 //Write '1'
ChesterLin 0:3e574710804f 43 wait_us(1);
ChesterLin 0:3e574710804f 44 _pin.output(); //set pin as output
ChesterLin 0:3e574710804f 45 _pin = 0; //pull the bus low
ChesterLin 0:3e574710804f 46 wait_us(10); //write '1' need pull up within 15µs
ChesterLin 0:3e574710804f 47 _pin.input();//set pin as input, bus pull up by pullup resistor
ChesterLin 0:3e574710804f 48 wait_us(60); //rest duration time + recovery time
ChesterLin 0:3e574710804f 49
ChesterLin 0:3e574710804f 50 } else {
ChesterLin 0:3e574710804f 51 //Write '0'
ChesterLin 0:3e574710804f 52 wait_us(1);
ChesterLin 0:3e574710804f 53 _pin.output();//set pin as output
ChesterLin 0:3e574710804f 54 _pin = 0; //pull the bus low
ChesterLin 0:3e574710804f 55 wait_us(60); //rest duration time
ChesterLin 0:3e574710804f 56 _pin.input();//set pin as input, bus pull up by pullup resistor
ChesterLin 0:3e574710804f 57 wait_us(10); //recovery time
ChesterLin 0:3e574710804f 58 }
ChesterLin 0:3e574710804f 59 }
ChesterLin 0:3e574710804f 60
ChesterLin 0:3e574710804f 61 //read a bite
ChesterLin 0:3e574710804f 62 int OneWire::read_bit()
ChesterLin 0:3e574710804f 63 {
ChesterLin 0:3e574710804f 64 int result; //define a value for read result
ChesterLin 0:3e574710804f 65
ChesterLin 0:3e574710804f 66 wait_us(1);
ChesterLin 0:3e574710804f 67 _pin.output(); //set pin as output
ChesterLin 0:3e574710804f 68 _pin = 0; //pull the bus low
ChesterLin 0:3e574710804f 69 wait_us(5);
ChesterLin 0:3e574710804f 70
ChesterLin 0:3e574710804f 71 _pin.input();
ChesterLin 0:3e574710804f 72 wait_us(10);
ChesterLin 0:3e574710804f 73 result = _pin; //sample the bus
ChesterLin 0:3e574710804f 74 wait_us(65); //rest duration time + recovery time
ChesterLin 0:3e574710804f 75
ChesterLin 0:3e574710804f 76 return result;
ChesterLin 0:3e574710804f 77 }
ChesterLin 0:3e574710804f 78
ChesterLin 0:3e574710804f 79 //write a byte
ChesterLin 0:3e574710804f 80 void OneWire::write_byte(uint8_t data)
ChesterLin 0:3e574710804f 81 {
ChesterLin 0:3e574710804f 82 int loop;
ChesterLin 0:3e574710804f 83
ChesterLin 0:3e574710804f 84 for(loop = 0; loop < 8; loop++) {
ChesterLin 0:3e574710804f 85
ChesterLin 0:3e574710804f 86 write_bit(data & 0x01);
ChesterLin 0:3e574710804f 87
ChesterLin 0:3e574710804f 88 data = (data >> 1);
ChesterLin 0:3e574710804f 89
ChesterLin 0:3e574710804f 90 }
ChesterLin 0:3e574710804f 91 }
ChesterLin 0:3e574710804f 92
ChesterLin 0:3e574710804f 93 //read a byte
ChesterLin 0:3e574710804f 94 int OneWire::read_byte()
ChesterLin 0:3e574710804f 95 {
ChesterLin 0:3e574710804f 96 int result,loop;
ChesterLin 0:3e574710804f 97
ChesterLin 0:3e574710804f 98 for(loop = 0; loop < 8; loop++) {
ChesterLin 0:3e574710804f 99
ChesterLin 0:3e574710804f 100 result = (result >> 1);
ChesterLin 0:3e574710804f 101
ChesterLin 0:3e574710804f 102 if (read_bit()) {
ChesterLin 0:3e574710804f 103
ChesterLin 0:3e574710804f 104 result |= 0x80;
ChesterLin 0:3e574710804f 105
ChesterLin 0:3e574710804f 106 }
ChesterLin 0:3e574710804f 107 }
ChesterLin 0:3e574710804f 108
ChesterLin 0:3e574710804f 109 return result;
ChesterLin 0:3e574710804f 110 }
ChesterLin 0:3e574710804f 111
ChesterLin 0:3e574710804f 112 //get tempreture from a device
ChesterLin 0:3e574710804f 113 char * OneWire::init_Match_Get_Temp(char addr[8])
ChesterLin 0:3e574710804f 114 {
ChesterLin 0:3e574710804f 115 int loop,i=0;
ChesterLin 0:3e574710804f 116 char sc[2];
ChesterLin 0:3e574710804f 117
ChesterLin 0:3e574710804f 118 init();
ChesterLin 0:3e574710804f 119
ChesterLin 0:3e574710804f 120 write_byte(0x55);
ChesterLin 0:3e574710804f 121
ChesterLin 0:3e574710804f 122 for (loop = 0; loop < 8; loop++) {
ChesterLin 0:3e574710804f 123
ChesterLin 0:3e574710804f 124 write_byte(addr[i]);
ChesterLin 0:3e574710804f 125
ChesterLin 0:3e574710804f 126 i++;
ChesterLin 0:3e574710804f 127
ChesterLin 0:3e574710804f 128 }
ChesterLin 0:3e574710804f 129
ChesterLin 0:3e574710804f 130 write_byte(0xbe);
ChesterLin 0:3e574710804f 131
ChesterLin 0:3e574710804f 132 i=0;
ChesterLin 0:3e574710804f 133
ChesterLin 0:3e574710804f 134 for (loop = 0; loop < 2; loop++) {
ChesterLin 0:3e574710804f 135
ChesterLin 0:3e574710804f 136 sc[i]=read_byte();
ChesterLin 0:3e574710804f 137
ChesterLin 0:3e574710804f 138 i++;
ChesterLin 0:3e574710804f 139
ChesterLin 0:3e574710804f 140 }
ChesterLin 0:3e574710804f 141
ChesterLin 0:3e574710804f 142 return sc;
ChesterLin 0:3e574710804f 143 }
ChesterLin 0:3e574710804f 144
ChesterLin 0:3e574710804f 145 //get scratchpad from a device
ChesterLin 0:3e574710804f 146 //char* OneWire::init_Match_Read_Scratchpad(char addr[8])
ChesterLin 0:3e574710804f 147 //{
ChesterLin 0:3e574710804f 148
ChesterLin 0:3e574710804f 149 //int loop, i = 0;
ChesterLin 0:3e574710804f 150 //char sc[9];
ChesterLin 0:3e574710804f 151
ChesterLin 0:3e574710804f 152 //init();
ChesterLin 0:3e574710804f 153
ChesterLin 0:3e574710804f 154 //write_byte(0x55);
ChesterLin 0:3e574710804f 155
ChesterLin 0:3e574710804f 156 // for(loop = 0; loop<8; loop++) {
ChesterLin 0:3e574710804f 157
ChesterLin 0:3e574710804f 158 //write_byte(addr[i]);
ChesterLin 0:3e574710804f 159 //i++;
ChesterLin 0:3e574710804f 160
ChesterLin 0:3e574710804f 161 //}
ChesterLin 0:3e574710804f 162
ChesterLin 0:3e574710804f 163 //i=0;
ChesterLin 0:3e574710804f 164
ChesterLin 0:3e574710804f 165 //write_byte(0xbe);
ChesterLin 0:3e574710804f 166
ChesterLin 0:3e574710804f 167 //for(loop = 0; loop < 9; loop++) {
ChesterLin 0:3e574710804f 168
ChesterLin 0:3e574710804f 169 //sc[i] = read_byte();
ChesterLin 0:3e574710804f 170
ChesterLin 0:3e574710804f 171 //i++;
ChesterLin 0:3e574710804f 172
ChesterLin 0:3e574710804f 173 //}
ChesterLin 0:3e574710804f 174
ChesterLin 0:3e574710804f 175 //return sc;
ChesterLin 0:3e574710804f 176
ChesterLin 0:3e574710804f 177 //}
ChesterLin 0:3e574710804f 178
ChesterLin 0:3e574710804f 179 //write Th, Tl and configuration register to a device
ChesterLin 0:3e574710804f 180 void OneWire::init_Match_Write_Scratchpad(char addr[8],char Scratchpad[3])
ChesterLin 0:3e574710804f 181 {
ChesterLin 0:3e574710804f 182 int loop,i=0;
ChesterLin 0:3e574710804f 183
ChesterLin 0:3e574710804f 184
ChesterLin 0:3e574710804f 185
ChesterLin 0:3e574710804f 186 init();
ChesterLin 0:3e574710804f 187
ChesterLin 0:3e574710804f 188 write_byte(0x55);
ChesterLin 0:3e574710804f 189
ChesterLin 0:3e574710804f 190 for(loop = 0; loop<8; loop++) {
ChesterLin 0:3e574710804f 191
ChesterLin 0:3e574710804f 192 write_byte(addr[i]);
ChesterLin 0:3e574710804f 193 i++;
ChesterLin 0:3e574710804f 194
ChesterLin 0:3e574710804f 195 }
ChesterLin 0:3e574710804f 196
ChesterLin 0:3e574710804f 197 write_byte(0x4e);
ChesterLin 0:3e574710804f 198
ChesterLin 0:3e574710804f 199 write_byte(Scratchpad[2]);//write Th
ChesterLin 0:3e574710804f 200 write_byte(Scratchpad[1]);//write Tl
ChesterLin 0:3e574710804f 201 write_byte(Scratchpad[0]);//write resolution
ChesterLin 0:3e574710804f 202
ChesterLin 0:3e574710804f 203 }
ChesterLin 0:3e574710804f 204
ChesterLin 0:3e574710804f 205
ChesterLin 0:3e574710804f 206 //all device on the bus convert t
ChesterLin 0:3e574710804f 207 int OneWire::Skip_Convert_T()
ChesterLin 0:3e574710804f 208 {
ChesterLin 0:3e574710804f 209
ChesterLin 0:3e574710804f 210 int relt = init();
ChesterLin 0:3e574710804f 211
ChesterLin 0:3e574710804f 212 if (!relt) {
ChesterLin 0:3e574710804f 213 write_byte(0xcc);
ChesterLin 0:3e574710804f 214
ChesterLin 0:3e574710804f 215 write_byte(0x44);
ChesterLin 0:3e574710804f 216
ChesterLin 0:3e574710804f 217 wait_us(1000);
ChesterLin 0:3e574710804f 218
ChesterLin 0:3e574710804f 219 return TRUE;
ChesterLin 0:3e574710804f 220 } else {
ChesterLin 0:3e574710804f 221 return FALSE;
ChesterLin 0:3e574710804f 222 }
ChesterLin 0:3e574710804f 223
ChesterLin 0:3e574710804f 224
ChesterLin 0:3e574710804f 225 }
ChesterLin 0:3e574710804f 226
ChesterLin 0:3e574710804f 227
ChesterLin 0:3e574710804f 228 //search any alarm on bus, if ture, send email
ChesterLin 0:3e574710804f 229 int OneWire::Read_alarm_Email()
ChesterLin 0:3e574710804f 230 {
ChesterLin 0:3e574710804f 231
ChesterLin 0:3e574710804f 232 Skip_Convert_T(); //all device convert temperature
ChesterLin 0:3e574710804f 233 int rslt = OWSearch_alarm(); //find first device
ChesterLin 0:3e574710804f 234
ChesterLin 0:3e574710804f 235 if (rslt) { //find one device have alarm. send email
ChesterLin 0:3e574710804f 236
ChesterLin 0:3e574710804f 237 pc2.printf("Sending Email...\n\r");
ChesterLin 0:3e574710804f 238 //get time first
ChesterLin 0:3e574710804f 239 ntp.setTime("pool.ntp.org");
ChesterLin 0:3e574710804f 240 time_t ctTime = time(NULL);
ChesterLin 0:3e574710804f 241
ChesterLin 0:3e574710804f 242 //send email
ChesterLin 0:3e574710804f 243 smtp.setFromAddress(FROM_ADDRESS);
ChesterLin 0:3e574710804f 244 smtp.setToAddress(TO_ADDRESS);
ChesterLin 0:3e574710804f 245 char msg[]= "One of 1-wire device is burning.";
ChesterLin 0:3e574710804f 246 smtp.setMessage(SUBJECT,msg);
ChesterLin 0:3e574710804f 247 smtp.sendmail(SERVER, USER, PWD, DOMAIN,PORT,SMTP_AUTH_PLAIN);
ChesterLin 0:3e574710804f 248 return TRUE;
ChesterLin 0:3e574710804f 249 }
ChesterLin 0:3e574710804f 250 return FALSE;
ChesterLin 0:3e574710804f 251 }
ChesterLin 0:3e574710804f 252
ChesterLin 0:3e574710804f 253 //read all devices temperature on the bus
ChesterLin 0:3e574710804f 254 int OneWire::Read_Temp_On_bus()
ChesterLin 0:3e574710804f 255 {
ChesterLin 0:3e574710804f 256 char temp[2];
ChesterLin 0:3e574710804f 257 int i=OneWireTempReg-1;
ChesterLin 0:3e574710804f 258 int rslt = Skip_Convert_T(); //all device convert temperature
ChesterLin 0:3e574710804f 259 if (rslt) {
ChesterLin 0:3e574710804f 260 OWFirst();//find first device
ChesterLin 0:3e574710804f 261 strcpy(temp,init_Match_Get_Temp(ROM_NO)); //read temp from that sensor
ChesterLin 0:3e574710804f 262 alltemp[i]=temp[1];
ChesterLin 0:3e574710804f 263 alltemp[i-1]=temp[0];
ChesterLin 0:3e574710804f 264 rslt = OWNext(); //strat search next 1-wire device
ChesterLin 0:3e574710804f 265 while(rslt) {
ChesterLin 0:3e574710804f 266 i=i-2;
ChesterLin 0:3e574710804f 267 strcpy(temp, init_Match_Get_Temp( ROM_NO)); //read temp from that sensor
ChesterLin 0:3e574710804f 268 alltemp[i]=temp[1];
ChesterLin 0:3e574710804f 269 alltemp[i-1]=temp[0];
ChesterLin 0:3e574710804f 270 rslt = OWNext(); //strat search next 1-wire device
ChesterLin 0:3e574710804f 271 }
ChesterLin 0:3e574710804f 272 return TRUE;
ChesterLin 0:3e574710804f 273 } else {
ChesterLin 0:3e574710804f 274 return FALSE;
ChesterLin 0:3e574710804f 275 }
ChesterLin 0:3e574710804f 276 }
ChesterLin 0:3e574710804f 277
ChesterLin 0:3e574710804f 278 //set resolution to all 1-wire device
ChesterLin 0:3e574710804f 279 void OneWire::Change_Res()
ChesterLin 0:3e574710804f 280 {
ChesterLin 0:3e574710804f 281 int rslt = OWFirst(); //search first device on bus
ChesterLin 0:3e574710804f 282
ChesterLin 0:3e574710804f 283 if (rslt) { //found first device
ChesterLin 0:3e574710804f 284
ChesterLin 0:3e574710804f 285 init_Match_Write_Scratchpad(ROM_NO, sca); //change resolution or alarm temperature
ChesterLin 0:3e574710804f 286
ChesterLin 0:3e574710804f 287 rslt = OWNext(); //find next device
ChesterLin 0:3e574710804f 288
ChesterLin 0:3e574710804f 289 while(rslt) { //found next device
ChesterLin 0:3e574710804f 290
ChesterLin 0:3e574710804f 291 init_Match_Write_Scratchpad(ROM_NO, sca); //change resolution or alarm temperature
ChesterLin 0:3e574710804f 292
ChesterLin 0:3e574710804f 293 rslt = OWNext(); //find next device
ChesterLin 0:3e574710804f 294
ChesterLin 0:3e574710804f 295 }
ChesterLin 0:3e574710804f 296 }
ChesterLin 0:3e574710804f 297 }
ChesterLin 0:3e574710804f 298
ChesterLin 0:3e574710804f 299 //read the address when there is only one slave on the bus
ChesterLin 0:3e574710804f 300 //char* OneWire::init_Read_ROM()
ChesterLin 0:3e574710804f 301 //{
ChesterLin 0:3e574710804f 302 //char addr[8];
ChesterLin 0:3e574710804f 303
ChesterLin 0:3e574710804f 304 //int loop,i;
ChesterLin 0:3e574710804f 305
ChesterLin 0:3e574710804f 306 //i=0;
ChesterLin 0:3e574710804f 307
ChesterLin 0:3e574710804f 308 //init();
ChesterLin 0:3e574710804f 309
ChesterLin 0:3e574710804f 310 //write_byte(0x33);
ChesterLin 0:3e574710804f 311
ChesterLin 0:3e574710804f 312 //for ( loop = 0; loop < 8; loop++) {
ChesterLin 0:3e574710804f 313
ChesterLin 0:3e574710804f 314 //addr[i] = read_byte();
ChesterLin 0:3e574710804f 315
ChesterLin 0:3e574710804f 316 //i++;
ChesterLin 0:3e574710804f 317
ChesterLin 0:3e574710804f 318 //}
ChesterLin 0:3e574710804f 319
ChesterLin 0:3e574710804f 320 //return addr;
ChesterLin 0:3e574710804f 321 //}
ChesterLin 0:3e574710804f 322
ChesterLin 0:3e574710804f 323 //read temperature when there is only one slave on the bus
ChesterLin 0:3e574710804f 324 //char* OneWire::init_Skip_Get_Temp()
ChesterLin 0:3e574710804f 325 //{
ChesterLin 0:3e574710804f 326 //int loop, i;
ChesterLin 0:3e574710804f 327 //char temp[2];
ChesterLin 0:3e574710804f 328
ChesterLin 0:3e574710804f 329 //i = 0;
ChesterLin 0:3e574710804f 330
ChesterLin 0:3e574710804f 331 //init();
ChesterLin 0:3e574710804f 332
ChesterLin 0:3e574710804f 333 //write_byte(0xcc);
ChesterLin 0:3e574710804f 334
ChesterLin 0:3e574710804f 335 //write_byte(0x44);
ChesterLin 0:3e574710804f 336
ChesterLin 0:3e574710804f 337 //wait_us(1000);
ChesterLin 0:3e574710804f 338
ChesterLin 0:3e574710804f 339 //init();
ChesterLin 0:3e574710804f 340
ChesterLin 0:3e574710804f 341 //write_byte(0xcc);
ChesterLin 0:3e574710804f 342
ChesterLin 0:3e574710804f 343 //write_byte(0xbe);
ChesterLin 0:3e574710804f 344
ChesterLin 0:3e574710804f 345 //for(loop = 0; loop < 2;loop++){
ChesterLin 0:3e574710804f 346
ChesterLin 0:3e574710804f 347 //temp[i] = read_byte();
ChesterLin 0:3e574710804f 348
ChesterLin 0:3e574710804f 349 //i++;
ChesterLin 0:3e574710804f 350
ChesterLin 0:3e574710804f 351 //}
ChesterLin 0:3e574710804f 352
ChesterLin 0:3e574710804f 353 //return temp;
ChesterLin 0:3e574710804f 354 //}
ChesterLin 0:3e574710804f 355
ChesterLin 0:3e574710804f 356 //int OneWire::init_Skip_Read_Scratchpad()
ChesterLin 0:3e574710804f 357 //{
ChesterLin 0:3e574710804f 358 //}
ChesterLin 0:3e574710804f 359
ChesterLin 0:3e574710804f 360 //void OneWire::init_Skip_Write_Scratchpad(char Scratchpad[7])
ChesterLin 0:3e574710804f 361 //{
ChesterLin 0:3e574710804f 362 //}
ChesterLin 0:3e574710804f 363
ChesterLin 0:3e574710804f 364 // Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
ChesterLin 0:3e574710804f 365 // search state.
ChesterLin 0:3e574710804f 366 // Return TRUE : device found, ROM number in ROM_NO buffer
ChesterLin 0:3e574710804f 367 // FALSE : device not found, end of search
ChesterLin 0:3e574710804f 368 //
ChesterLin 0:3e574710804f 369 int OneWire::OWSearch()
ChesterLin 0:3e574710804f 370 {
ChesterLin 0:3e574710804f 371 int id_bit_number;
ChesterLin 0:3e574710804f 372 int last_zero, rom_byte_number, search_result;
ChesterLin 0:3e574710804f 373 int id_bit, cmp_id_bit;
ChesterLin 0:3e574710804f 374 unsigned char rom_byte_mask, search_direction;
ChesterLin 0:3e574710804f 375
ChesterLin 0:3e574710804f 376 // initialize for search
ChesterLin 0:3e574710804f 377 id_bit_number = 1;
ChesterLin 0:3e574710804f 378 last_zero = 0;
ChesterLin 0:3e574710804f 379 rom_byte_number = 0;
ChesterLin 0:3e574710804f 380 rom_byte_mask = 1;
ChesterLin 0:3e574710804f 381 search_result = 0;
ChesterLin 0:3e574710804f 382 crc8 = 0;
ChesterLin 0:3e574710804f 383
ChesterLin 0:3e574710804f 384 // if the last call was not the last one
ChesterLin 0:3e574710804f 385 if (!LastDeviceFlag) {
ChesterLin 0:3e574710804f 386 // 1-Wire reset
ChesterLin 0:3e574710804f 387 if (init()) {
ChesterLin 0:3e574710804f 388 // reset the search
ChesterLin 0:3e574710804f 389 LastDiscrepancy = 0;
ChesterLin 0:3e574710804f 390 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 391 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 392 return FALSE;
ChesterLin 0:3e574710804f 393 }
ChesterLin 0:3e574710804f 394
ChesterLin 0:3e574710804f 395 // issue the search command
ChesterLin 0:3e574710804f 396 write_byte(0xF0);
ChesterLin 0:3e574710804f 397
ChesterLin 0:3e574710804f 398 // loop to do the search
ChesterLin 0:3e574710804f 399 do {
ChesterLin 0:3e574710804f 400 // read a bit and its complement
ChesterLin 0:3e574710804f 401 id_bit = read_bit();
ChesterLin 0:3e574710804f 402 cmp_id_bit = read_bit();
ChesterLin 0:3e574710804f 403
ChesterLin 0:3e574710804f 404 // check for no devices on 1-wire
ChesterLin 0:3e574710804f 405 if ((id_bit == 1) && (cmp_id_bit == 1))
ChesterLin 0:3e574710804f 406 break;
ChesterLin 0:3e574710804f 407 else {
ChesterLin 0:3e574710804f 408 // all devices coupled have 0 or 1
ChesterLin 0:3e574710804f 409 if (id_bit != cmp_id_bit)
ChesterLin 0:3e574710804f 410 search_direction = id_bit; // bit write value for search
ChesterLin 0:3e574710804f 411 else {
ChesterLin 0:3e574710804f 412 // if this discrepancy if before the Last Discrepancy
ChesterLin 0:3e574710804f 413 // on a previous next then pick the same as last time
ChesterLin 0:3e574710804f 414 if (id_bit_number < LastDiscrepancy)
ChesterLin 0:3e574710804f 415 search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
ChesterLin 0:3e574710804f 416 else
ChesterLin 0:3e574710804f 417 // if equal to last pick 1, if not then pick 0
ChesterLin 0:3e574710804f 418 search_direction = (id_bit_number == LastDiscrepancy);
ChesterLin 0:3e574710804f 419
ChesterLin 0:3e574710804f 420 // if 0 was picked then record its position in LastZero
ChesterLin 0:3e574710804f 421 if (search_direction == 0) {
ChesterLin 0:3e574710804f 422 last_zero = id_bit_number;
ChesterLin 0:3e574710804f 423
ChesterLin 0:3e574710804f 424 // check for Last discrepancy in family
ChesterLin 0:3e574710804f 425 if (last_zero < 9)
ChesterLin 0:3e574710804f 426 LastFamilyDiscrepancy = last_zero;
ChesterLin 0:3e574710804f 427 }
ChesterLin 0:3e574710804f 428 }
ChesterLin 0:3e574710804f 429
ChesterLin 0:3e574710804f 430 // set or clear the bit in the ROM byte rom_byte_number
ChesterLin 0:3e574710804f 431 // with mask rom_byte_mask
ChesterLin 0:3e574710804f 432 if (search_direction == 1)
ChesterLin 0:3e574710804f 433 ROM_NO[rom_byte_number] |= rom_byte_mask;
ChesterLin 0:3e574710804f 434 else
ChesterLin 0:3e574710804f 435 ROM_NO[rom_byte_number] &= ~rom_byte_mask;
ChesterLin 0:3e574710804f 436
ChesterLin 0:3e574710804f 437 // serial number search direction write bit
ChesterLin 0:3e574710804f 438 write_bit(search_direction);
ChesterLin 0:3e574710804f 439
ChesterLin 0:3e574710804f 440 // increment the byte counter id_bit_number
ChesterLin 0:3e574710804f 441 // and shift the mask rom_byte_mask
ChesterLin 0:3e574710804f 442 id_bit_number++;
ChesterLin 0:3e574710804f 443 rom_byte_mask <<= 1;
ChesterLin 0:3e574710804f 444
ChesterLin 0:3e574710804f 445 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
ChesterLin 0:3e574710804f 446 if (rom_byte_mask == 0) {
ChesterLin 0:3e574710804f 447 docrc8(ROM_NO[rom_byte_number]); // accumulate the CRC
ChesterLin 0:3e574710804f 448 rom_byte_number++;
ChesterLin 0:3e574710804f 449 rom_byte_mask = 1;
ChesterLin 0:3e574710804f 450 }
ChesterLin 0:3e574710804f 451 }
ChesterLin 0:3e574710804f 452 } while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
ChesterLin 0:3e574710804f 453
ChesterLin 0:3e574710804f 454 // if the search was successful then
ChesterLin 0:3e574710804f 455 if (!((id_bit_number < 65) || (crc8 != 0))) {
ChesterLin 0:3e574710804f 456 // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
ChesterLin 0:3e574710804f 457 LastDiscrepancy = last_zero;
ChesterLin 0:3e574710804f 458
ChesterLin 0:3e574710804f 459 // check for last device
ChesterLin 0:3e574710804f 460 if (LastDiscrepancy == 0)
ChesterLin 0:3e574710804f 461 LastDeviceFlag = TRUE;
ChesterLin 0:3e574710804f 462
ChesterLin 0:3e574710804f 463 search_result = TRUE;
ChesterLin 0:3e574710804f 464 }
ChesterLin 0:3e574710804f 465 }
ChesterLin 0:3e574710804f 466
ChesterLin 0:3e574710804f 467 // if no device found then reset counters so next 'search' will be like a first
ChesterLin 0:3e574710804f 468 if (!search_result || !ROM_NO[0]) {
ChesterLin 0:3e574710804f 469 LastDiscrepancy = 0;
ChesterLin 0:3e574710804f 470 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 471 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 472 search_result = FALSE;
ChesterLin 0:3e574710804f 473 }
ChesterLin 0:3e574710804f 474
ChesterLin 0:3e574710804f 475 return search_result;
ChesterLin 0:3e574710804f 476 }
ChesterLin 0:3e574710804f 477
ChesterLin 0:3e574710804f 478
ChesterLin 0:3e574710804f 479 // Perform the 1-Wire Search alarm Algorithm on the 1-Wire bus using the existing
ChesterLin 0:3e574710804f 480 // search state.
ChesterLin 0:3e574710804f 481 // Return TRUE : device found, ROM number in ROM_NO buffer
ChesterLin 0:3e574710804f 482 // FALSE : device not found, end of search
ChesterLin 0:3e574710804f 483 //
ChesterLin 0:3e574710804f 484 int OneWire::OWSearch_alarm()
ChesterLin 0:3e574710804f 485 {
ChesterLin 0:3e574710804f 486 int id_bit_number;
ChesterLin 0:3e574710804f 487 int last_zero, rom_byte_number, search_result;
ChesterLin 0:3e574710804f 488 int id_bit, cmp_id_bit;
ChesterLin 0:3e574710804f 489 unsigned char rom_byte_mask, search_direction;
ChesterLin 0:3e574710804f 490
ChesterLin 0:3e574710804f 491 // initialize for search
ChesterLin 0:3e574710804f 492 id_bit_number = 1;
ChesterLin 0:3e574710804f 493 last_zero = 0;
ChesterLin 0:3e574710804f 494 rom_byte_number = 0;
ChesterLin 0:3e574710804f 495 rom_byte_mask = 1;
ChesterLin 0:3e574710804f 496 search_result = 0;
ChesterLin 0:3e574710804f 497 crc8 = 0;
ChesterLin 0:3e574710804f 498
ChesterLin 0:3e574710804f 499 // if the last call was not the last one
ChesterLin 0:3e574710804f 500 if (!LastDeviceFlag) {
ChesterLin 0:3e574710804f 501 // 1-Wire reset
ChesterLin 0:3e574710804f 502 if (init()) {
ChesterLin 0:3e574710804f 503 // reset the search
ChesterLin 0:3e574710804f 504 LastDiscrepancy = 0;
ChesterLin 0:3e574710804f 505 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 506 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 507 return FALSE;
ChesterLin 0:3e574710804f 508 }
ChesterLin 0:3e574710804f 509
ChesterLin 0:3e574710804f 510 // issue the search alarm command
ChesterLin 0:3e574710804f 511 write_byte(0xEC);
ChesterLin 0:3e574710804f 512
ChesterLin 0:3e574710804f 513 // loop to do the search
ChesterLin 0:3e574710804f 514 do {
ChesterLin 0:3e574710804f 515 // read a bit and its complement
ChesterLin 0:3e574710804f 516 id_bit = read_bit();
ChesterLin 0:3e574710804f 517 cmp_id_bit = read_bit();
ChesterLin 0:3e574710804f 518
ChesterLin 0:3e574710804f 519 // check for no devices on 1-wire
ChesterLin 0:3e574710804f 520 if ((id_bit == 1) && (cmp_id_bit == 1))
ChesterLin 0:3e574710804f 521 break;
ChesterLin 0:3e574710804f 522 else {
ChesterLin 0:3e574710804f 523 // all devices coupled have 0 or 1
ChesterLin 0:3e574710804f 524 if (id_bit != cmp_id_bit)
ChesterLin 0:3e574710804f 525 search_direction = id_bit; // bit write value for search
ChesterLin 0:3e574710804f 526 else {
ChesterLin 0:3e574710804f 527 // if this discrepancy if before the Last Discrepancy
ChesterLin 0:3e574710804f 528 // on a previous next then pick the same as last time
ChesterLin 0:3e574710804f 529 if (id_bit_number < LastDiscrepancy)
ChesterLin 0:3e574710804f 530 search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
ChesterLin 0:3e574710804f 531 else
ChesterLin 0:3e574710804f 532 // if equal to last pick 1, if not then pick 0
ChesterLin 0:3e574710804f 533 search_direction = (id_bit_number == LastDiscrepancy);
ChesterLin 0:3e574710804f 534
ChesterLin 0:3e574710804f 535 // if 0 was picked then record its position in LastZero
ChesterLin 0:3e574710804f 536 if (search_direction == 0) {
ChesterLin 0:3e574710804f 537 last_zero = id_bit_number;
ChesterLin 0:3e574710804f 538
ChesterLin 0:3e574710804f 539 // check for Last discrepancy in family
ChesterLin 0:3e574710804f 540 if (last_zero < 9)
ChesterLin 0:3e574710804f 541 LastFamilyDiscrepancy = last_zero;
ChesterLin 0:3e574710804f 542 }
ChesterLin 0:3e574710804f 543 }
ChesterLin 0:3e574710804f 544
ChesterLin 0:3e574710804f 545 // set or clear the bit in the ROM byte rom_byte_number
ChesterLin 0:3e574710804f 546 // with mask rom_byte_mask
ChesterLin 0:3e574710804f 547 if (search_direction == 1)
ChesterLin 0:3e574710804f 548 ROM_NO[rom_byte_number] |= rom_byte_mask;
ChesterLin 0:3e574710804f 549 else
ChesterLin 0:3e574710804f 550 ROM_NO[rom_byte_number] &= ~rom_byte_mask;
ChesterLin 0:3e574710804f 551
ChesterLin 0:3e574710804f 552 // serial number search direction write bit
ChesterLin 0:3e574710804f 553 write_bit(search_direction);
ChesterLin 0:3e574710804f 554
ChesterLin 0:3e574710804f 555 // increment the byte counter id_bit_number
ChesterLin 0:3e574710804f 556 // and shift the mask rom_byte_mask
ChesterLin 0:3e574710804f 557 id_bit_number++;
ChesterLin 0:3e574710804f 558 rom_byte_mask <<= 1;
ChesterLin 0:3e574710804f 559
ChesterLin 0:3e574710804f 560 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
ChesterLin 0:3e574710804f 561 if (rom_byte_mask == 0) {
ChesterLin 0:3e574710804f 562 docrc8(ROM_NO[rom_byte_number]); // accumulate the CRC
ChesterLin 0:3e574710804f 563 rom_byte_number++;
ChesterLin 0:3e574710804f 564 rom_byte_mask = 1;
ChesterLin 0:3e574710804f 565 }
ChesterLin 0:3e574710804f 566 }
ChesterLin 0:3e574710804f 567 } while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
ChesterLin 0:3e574710804f 568
ChesterLin 0:3e574710804f 569 // if the search was successful then
ChesterLin 0:3e574710804f 570 if (!((id_bit_number < 65) || (crc8 != 0))) {
ChesterLin 0:3e574710804f 571 // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
ChesterLin 0:3e574710804f 572 LastDiscrepancy = last_zero;
ChesterLin 0:3e574710804f 573
ChesterLin 0:3e574710804f 574 // check for last device
ChesterLin 0:3e574710804f 575 if (LastDiscrepancy == 0)
ChesterLin 0:3e574710804f 576 LastDeviceFlag = TRUE;
ChesterLin 0:3e574710804f 577
ChesterLin 0:3e574710804f 578 search_result = TRUE;
ChesterLin 0:3e574710804f 579 }
ChesterLin 0:3e574710804f 580 }
ChesterLin 0:3e574710804f 581
ChesterLin 0:3e574710804f 582 // if no device found then reset counters so next 'search' will be like a first
ChesterLin 0:3e574710804f 583 if (!search_result || !ROM_NO[0]) {
ChesterLin 0:3e574710804f 584 LastDiscrepancy = 0;
ChesterLin 0:3e574710804f 585 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 586 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 587 search_result = FALSE;
ChesterLin 0:3e574710804f 588 }
ChesterLin 0:3e574710804f 589
ChesterLin 0:3e574710804f 590 return search_result;
ChesterLin 0:3e574710804f 591 }
ChesterLin 0:3e574710804f 592
ChesterLin 0:3e574710804f 593
ChesterLin 0:3e574710804f 594 //--------------------------------------------------------------------------
ChesterLin 0:3e574710804f 595 // Verify the device with the ROM number in ROM_NO buffer is present.
ChesterLin 0:3e574710804f 596 // Return TRUE : device verified present
ChesterLin 0:3e574710804f 597 // FALSE : device not present
ChesterLin 0:3e574710804f 598 //
ChesterLin 0:3e574710804f 599 int OneWire::OWVerify()
ChesterLin 0:3e574710804f 600 {
ChesterLin 0:3e574710804f 601 unsigned char rom_backup[8];
ChesterLin 0:3e574710804f 602 int i,rslt,ld_backup,ldf_backup,lfd_backup;
ChesterLin 0:3e574710804f 603
ChesterLin 0:3e574710804f 604 // keep a backup copy of the current state
ChesterLin 0:3e574710804f 605 for (i = 0; i < 8; i++)
ChesterLin 0:3e574710804f 606 rom_backup[i] = ROM_NO[i];
ChesterLin 0:3e574710804f 607 ld_backup = LastDiscrepancy;
ChesterLin 0:3e574710804f 608 ldf_backup = LastDeviceFlag;
ChesterLin 0:3e574710804f 609 lfd_backup = LastFamilyDiscrepancy;
ChesterLin 0:3e574710804f 610
ChesterLin 0:3e574710804f 611 // set search to find the same device
ChesterLin 0:3e574710804f 612 LastDiscrepancy = 64;
ChesterLin 0:3e574710804f 613 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 614
ChesterLin 0:3e574710804f 615 if (OWSearch()) {
ChesterLin 0:3e574710804f 616 // check if same device found
ChesterLin 0:3e574710804f 617 rslt = TRUE;
ChesterLin 0:3e574710804f 618 for (i = 0; i < 8; i++) {
ChesterLin 0:3e574710804f 619 if (rom_backup[i] != ROM_NO[i]) {
ChesterLin 0:3e574710804f 620 rslt = FALSE;
ChesterLin 0:3e574710804f 621 break;
ChesterLin 0:3e574710804f 622 }
ChesterLin 0:3e574710804f 623 }
ChesterLin 0:3e574710804f 624 } else
ChesterLin 0:3e574710804f 625 rslt = FALSE;
ChesterLin 0:3e574710804f 626
ChesterLin 0:3e574710804f 627 // restore the search state
ChesterLin 0:3e574710804f 628 for (i = 0; i < 8; i++)
ChesterLin 0:3e574710804f 629 ROM_NO[i] = rom_backup[i];
ChesterLin 0:3e574710804f 630 LastDiscrepancy = ld_backup;
ChesterLin 0:3e574710804f 631 LastDeviceFlag = ldf_backup;
ChesterLin 0:3e574710804f 632 LastFamilyDiscrepancy = lfd_backup;
ChesterLin 0:3e574710804f 633
ChesterLin 0:3e574710804f 634 // return the result of the verify
ChesterLin 0:3e574710804f 635 return rslt;
ChesterLin 0:3e574710804f 636 }
ChesterLin 0:3e574710804f 637
ChesterLin 0:3e574710804f 638 // Setup the search to find the device type 'family_code' on the next call
ChesterLin 0:3e574710804f 639 // to OWNext() if it is present.
ChesterLin 0:3e574710804f 640 //
ChesterLin 0:3e574710804f 641 void OneWire::OWTargetSetup(unsigned char family_code)
ChesterLin 0:3e574710804f 642 {
ChesterLin 0:3e574710804f 643 int i;
ChesterLin 0:3e574710804f 644
ChesterLin 0:3e574710804f 645 // set the search state to find SearchFamily type devices
ChesterLin 0:3e574710804f 646 ROM_NO[0] = family_code;
ChesterLin 0:3e574710804f 647 for (i = 1; i < 8; i++)
ChesterLin 0:3e574710804f 648 ROM_NO[i] = 0;
ChesterLin 0:3e574710804f 649 LastDiscrepancy = 64;
ChesterLin 0:3e574710804f 650 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 651 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 652 }
ChesterLin 0:3e574710804f 653
ChesterLin 0:3e574710804f 654 // Setup the search to skip the current device type on the next call
ChesterLin 0:3e574710804f 655 // to OWNext().
ChesterLin 0:3e574710804f 656 //
ChesterLin 0:3e574710804f 657 void OneWire::OWFamilySkipSetup()
ChesterLin 0:3e574710804f 658 {
ChesterLin 0:3e574710804f 659 // set the Last discrepancy to last family discrepancy
ChesterLin 0:3e574710804f 660 LastDiscrepancy = LastFamilyDiscrepancy;
ChesterLin 0:3e574710804f 661 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 662
ChesterLin 0:3e574710804f 663 // check for end of list
ChesterLin 0:3e574710804f 664 if (LastDiscrepancy == 0)
ChesterLin 0:3e574710804f 665 LastDeviceFlag = TRUE;
ChesterLin 0:3e574710804f 666 }
ChesterLin 0:3e574710804f 667
ChesterLin 0:3e574710804f 668 // Find the 'first' devices on the 1-Wire bus
ChesterLin 0:3e574710804f 669 // Return TRUE : device found, ROM number in ROM_NO buffer
ChesterLin 0:3e574710804f 670 // FALSE : no device present
ChesterLin 0:3e574710804f 671 //
ChesterLin 0:3e574710804f 672 int OneWire::OWFirst()
ChesterLin 0:3e574710804f 673 {
ChesterLin 0:3e574710804f 674 // reset the search state
ChesterLin 0:3e574710804f 675 LastDiscrepancy = 0;
ChesterLin 0:3e574710804f 676 LastDeviceFlag = FALSE;
ChesterLin 0:3e574710804f 677 LastFamilyDiscrepancy = 0;
ChesterLin 0:3e574710804f 678
ChesterLin 0:3e574710804f 679 return OWSearch();
ChesterLin 0:3e574710804f 680 }
ChesterLin 0:3e574710804f 681
ChesterLin 0:3e574710804f 682 // Find the 'next' devices on the 1-Wire bus
ChesterLin 0:3e574710804f 683 // Return TRUE : device found, ROM number in ROM_NO buffer
ChesterLin 0:3e574710804f 684 // FALSE : device not found, end of search
ChesterLin 0:3e574710804f 685 //
ChesterLin 0:3e574710804f 686 int OneWire::OWNext()
ChesterLin 0:3e574710804f 687 {
ChesterLin 0:3e574710804f 688 // leave the search state alone
ChesterLin 0:3e574710804f 689 return OWSearch();
ChesterLin 0:3e574710804f 690 }
ChesterLin 0:3e574710804f 691
ChesterLin 0:3e574710804f 692 // TEST BUILD
ChesterLin 0:3e574710804f 693 const unsigned char dscrc_table[256] = {
ChesterLin 0:3e574710804f 694 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
ChesterLin 0:3e574710804f 695 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
ChesterLin 0:3e574710804f 696 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
ChesterLin 0:3e574710804f 697 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
ChesterLin 0:3e574710804f 698 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
ChesterLin 0:3e574710804f 699 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
ChesterLin 0:3e574710804f 700 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
ChesterLin 0:3e574710804f 701 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
ChesterLin 0:3e574710804f 702 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
ChesterLin 0:3e574710804f 703 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
ChesterLin 0:3e574710804f 704 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
ChesterLin 0:3e574710804f 705 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
ChesterLin 0:3e574710804f 706 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
ChesterLin 0:3e574710804f 707 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
ChesterLin 0:3e574710804f 708 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
ChesterLin 0:3e574710804f 709 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
ChesterLin 0:3e574710804f 710 };
ChesterLin 0:3e574710804f 711
ChesterLin 0:3e574710804f 712 //--------------------------------------------------------------------------
ChesterLin 0:3e574710804f 713 // Calculate the CRC8 of the byte value provided with the current
ChesterLin 0:3e574710804f 714 // global 'crc8' value.
ChesterLin 0:3e574710804f 715 // Returns current global crc8 value
ChesterLin 0:3e574710804f 716 //
ChesterLin 0:3e574710804f 717 unsigned char OneWire::docrc8(unsigned char value)
ChesterLin 0:3e574710804f 718 {
ChesterLin 0:3e574710804f 719 // See Application Note 27
ChesterLin 0:3e574710804f 720
ChesterLin 0:3e574710804f 721 // TEST BUILD
ChesterLin 0:3e574710804f 722 crc8 = dscrc_table[crc8 ^ value];
ChesterLin 0:3e574710804f 723 return crc8;
ChesterLin 0:3e574710804f 724 }