📄 ow_comm.lst
字号:
259 1 {
260 2 // 1-Wire reset
261 2 if (!ow_reset())
262 2 {
263 3 // reset the search
264 3 LastDiscrepancy = 0;
265 3 LastDeviceFlag = FALSE;
266 3 LastFamilyDiscrepancy = 0;
267 3 return FALSE;
268 3 }
269 2
270 2 // issue the search command
271 2 ow_byte_wr(0xF0);
272 2
273 2 // loop to do the search
274 2 do
275 2 {
276 3 // read a UCHAR and its complement
277 3 id_bit = ow_bit_rd();
278 3 cmp_id_bit = ow_bit_rd();
279 3
280 3 // check for no devices on 1-wire
281 3 if ((id_bit == 1) && (cmp_id_bit == 1))
282 3 break;
283 3 else
284 3 {
285 4 // all devices coupled have 0 or 1
286 4 if (id_bit != cmp_id_bit)
287 4 search_direction = id_bit; // UCHAR write value for search
288 4 else
289 4 {
290 5 // if this discrepancy if before the Last Discrepancy
291 5 // on a previous next then pick the same as last time
292 5 if (id_bit_number < LastDiscrepancy)
293 5 search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
294 5 else
295 5 // if equal to last pick 1, if not then pick 0
296 5 search_direction = (id_bit_number == LastDiscrepancy);
297 5
298 5 // if 0 was picked then record its position in LastZero
299 5 if (search_direction == 0)
300 5 {
301 6 last_zero = id_bit_number;
302 6
303 6 // check for Last discrepancy in family
C51 COMPILER V8.02 OW_COMM 09/17/2008 10:45:02 PAGE 6
304 6 if (last_zero < 9)
305 6 LastFamilyDiscrepancy = last_zero;
306 6 }
307 5 }
308 4
309 4 // set or clear the UCHAR in the ROM byte rom_byte_number
310 4 // with mask rom_byte_mask
311 4 if (search_direction == 1)
312 4 ROM_NO[rom_byte_number] |= rom_byte_mask;
313 4 else
314 4 ROM_NO[rom_byte_number] &= ~rom_byte_mask;
315 4
316 4 // serial number search direction write UCHAR
317 4 ow_bit_wr(search_direction);
318 4
319 4 // increment the byte counter id_bit_number
320 4 // and shift the mask rom_byte_mask
321 4 id_bit_number++;
322 4 rom_byte_mask <<= 1;
323 4
324 4 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
325 4 if (rom_byte_mask == 0)
326 4 {
327 5 docrc8(ROM_NO[rom_byte_number]); // accumulate the CRC
328 5 rom_byte_number++;
329 5 rom_byte_mask = 1;
330 5 }
331 4 }
332 3 }
333 2 while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
334 2
335 2 // if the search was successful then
336 2 if (!((id_bit_number < 65) || (crc8 != 0)))
337 2 {
338 3 // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
339 3 LastDiscrepancy = last_zero;
340 3
341 3 // check for last device
342 3 if (LastDiscrepancy == 0)
343 3 LastDeviceFlag = TRUE;
344 3
345 3 search_result = TRUE;
346 3 }
347 2 }
348 1
349 1 // if no device found then reset counters so next 'search' will be like a first
350 1 if (!search_result || !ROM_NO[0])
351 1 {
352 2 LastDiscrepancy = 0;
353 2 LastDeviceFlag = FALSE;
354 2 LastFamilyDiscrepancy = 0;
355 2 search_result = FALSE;
356 2 }
357 1
358 1 return search_result;
359 1 }
360
361
362
363 //--------------------------------------------------------------------------
364 // Calculate the CRC8 of the byte value provided with the current
365 // global 'crc8' value.
C51 COMPILER V8.02 OW_COMM 09/17/2008 10:45:02 PAGE 7
366 // Returns current global crc8 value
367 //
368 UCHAR docrc8(UCHAR value)
369 {
370 1 // See Application Note 27
371 1
372 1 // TEST BUILD
373 1 crc8 = dscrc_table[crc8 ^ value];
374 1 return crc8;
375 1 }
376
377 /************************************************************
378 -----1-wire总线主机获取总线上所有器件地址的程序-----
379 说明: 根据搜索算法查找所有器件的64位地址并存储于指定位置
380 并根据器件地址的家族号判断,总线上为何种设备
381 出口参数:
382 如果存在DS2762,HasDs2762 = 1
383 如果存在DS2415,HasDs2415 = 1
384 //void find_ow_dev(void)
385 *************************************************************/
386
387 UCHAR find_ow_dev(void)
388 {
389 1 UCHAR rslt,j;//,cnt;
390 1 SCHAR i; // i一定要为有符号数,否则会出错
391 1 for(j = 0; j < 2; j++)
392 1 {
393 2 if(j == 0)
394 2 rslt = ow_first();
395 2 else
396 2 rslt = ow_next();
397 2 if(rslt == 1) //
398 2 {
399 3 for (i = 7; i >= 0; i--)
400 3 g_romaddr[j].romaddr[i] = ROM_NO[i]; // 存储64bit地址
401 3 if(ROM_NO[0] == DS2762_FC) // 判断是何器件
402 3 HasDs2762 = 1;
403 3 else if(ROM_NO[0] == DS2415_FC)
404 3 HasDs2415 = 1;
405 3 }
406 2 else
407 2 break;
408 2 }
409 1 return j; // 返回数量
410 1 }
411
412 /************************************************************
413 -----1-wire总线主机查询DS2762寄存器的程序-----
414 说明: 写读取命令69H,0CH,读取电池输出电压
415 写读取命令69H,0EH,读取电池电流
416 //void read_ds2762(void)
417 *************************************************************/
418
419 void read_ds2762(void)
420 {
421 1 UCHAR i;
422 1 ow_reset(); // 一个完整的总线动作之前都要复位总线
423 1 ow_byte_wr(0x55); // 发送NET ADDRESS COMMAND(MATCHE NETWORK ADDRESS)
424 1 for(i = 0; i < 8; i++) // 发送前面搜索到的地址
425 1 {
426 2 if(g_romaddr[0].st_romaddr.familycode == DS2762_FC)
427 2 ow_byte_wr(g_romaddr[0].romaddr[i]);
C51 COMPILER V8.02 OW_COMM 09/17/2008 10:45:02 PAGE 8
428 2 else
429 2 ow_byte_wr(g_romaddr[1].romaddr[i]);
430 2 }
431 1 ow_byte_wr(0x69);
432 1 ow_byte_wr(0x0c);
433 1 for(i = 0; i < 2; i++)
434 1 {
435 2 BatVol[i] = ow_byte_rd();
436 2 }
437 1 for(i =0; i < 2; i++)
438 1 {
439 2 BatCur[i] = ow_byte_rd();
440 2 }
441 1 ow_reset(); // 读完后要复位总线
442 1 }
443
444 /************************************************************
445 -----1-wire总线主机查询DS2415寄存器的程序-----
446 说明: 写读取命令66H,读取RTC CLOCK
447 写设置命令69H,0EH,读取电池电流
448 //void read_ds2415(void)
449 *************************************************************/
450
451 void read_ds2415(void)
452 {
453 1 UCHAR i;
454 1 ow_reset(); // 一个完整的总线动作之前都要复位总线
455 1 ow_byte_wr(0x55); // 发送NET ADDRESS COMMAND(MATCHE NETWORK ADDRESS)
456 1 for(i = 0; i <8; i++) // 发送前面搜索到的地址
457 1 {
458 2 if(g_romaddr[0].st_romaddr.familycode == DS2415_FC)
459 2 ow_byte_wr(g_romaddr[0].romaddr[i]);
460 2 else
461 2 ow_byte_wr(g_romaddr[1].romaddr[i]);
462 2 }
463 1 ow_byte_wr(0x66);
464 1 ow_byte_rd(); //
465 1 for(i = 0; i < 4; i++) // 接收4字节clock
466 1 {
467 2 RtcClk[i] = ow_byte_rd();
468 2 }
469 1 ow_reset(); // 读完后一定要复位,否则会一直读
470 1 }
471
472 /************************************************************
473 -----ONE WIRE 通信任务-----
474 功能: 主程序调用该任务,与ow器件通信
475 参数: 行列号(ex。0x31 表示第3行第1列)
476 //说明:
477 //void task_owcomm(void)
478 *************************************************************/
479
480 void task_owcomm(void)
481 {
482 1 if(gOwdevNum != 0) // 如果存在OW设备则读取数值
483 1 {
484 2 if(HasDs2762 == 1)
485 2 {
486 3 read_ds2762();
487 3 }
488 2 if(HasDs2415 == 1)
489 2 {
C51 COMPILER V8.02 OW_COMM 09/17/2008 10:45:02 PAGE 9
490 3 read_ds2415();
491 3 }
492 2 }
493 1 }
494 // debug function
495 //#ifdef OW_DEBUG
496 //void ow_test(void)
497 //{
498 // UCHAR i;
499 // if(ow_reset())
500 // {
501 // ow_byte_wr(0x33); // issue READ ROM command
502 // DQ = 1;
503 // delay_us(3);
504 // for(i = 0; i < 8; i++)
505 // {
506 // g_testaddr.romaddr[i] = ow_byte_rd();
507 // }
508 // }
509 //}
510 //#endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 897 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = 41 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 13
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -