1
OneWire_Functions.cpp@0:3e574710804f, 2017-11-27 (annotated)
- Committer:
- ChesterLin
- Date:
- Mon Nov 27 06:05:15 2017 +0000
- Revision:
- 0:3e574710804f
1-WIRE LIBRARY
Who changed what in which revision?
User | Revision | Line number | New 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 | } |