📄 ownetu.c
字号:
// This function contains two parameters, 'serialnum_buf' is a pointer// to a buffer provided by the caller. 'serialnum_buf' should point to // an array of 8 unsigned chars. The second parameter is a flag called// 'do_read' that is TRUE (1) if the operation is to read and FALSE// (0) if the operation is to set the internal SerialNum buffer from // the data in the provided buffer.//// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.// 'serialnum_buf' - buffer to that contains the serial number to set// when do_read = FALSE (0) and buffer to get the serial// number when do_read = TRUE (1).// 'do_read' - flag to indicate reading (1) or setting (0) the current// serial number.//void owSerialNum(int portnum, uchar *serialnum_buf, int do_read){ int i; // read the internal buffer and place in 'serialnum_buf' if (do_read) { for (i = 0; i < 8; i++) serialnum_buf[i] = SerialNum[portnum][i]; } // set the internal buffer from the data in 'serialnum_buf' else { for (i = 0; i < 8; i++) SerialNum[portnum][i] = serialnum_buf[i]; }}//--------------------------------------------------------------------------// Setup the search algorithm to find a certain family of devices// the next time a search function is called 'owNext'.//// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.// 'search_family' - family code type to set the search algorithm to find// next.// void owFamilySearchSetup(int portnum, int search_family){ int i; // set the search state to find search_family type devices SerialNum[portnum][0] = (uchar)search_family; for (i = 1; i < 8; i++) SerialNum[portnum][i] = 0; LastDiscrepancy[portnum] = 64; LastDevice[portnum] = FALSE; }//--------------------------------------------------------------------------// Set the current search state to skip the current family code.//// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.//void owSkipFamily(int portnum){ // set the Last discrepancy to last family discrepancy LastDiscrepancy[portnum] = LastFamilyDiscrepancy[portnum]; // check for end of list if (LastDiscrepancy[portnum] == 0) LastDevice[portnum] = TRUE;}//--------------------------------------------------------------------------// The 'owAccess' function resets the 1-Wire and sends a MATCH Serial // Number command followed by the current SerialNum code. After this // function is complete the 1-Wire device is ready to accept device-specific// commands. //// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.//// Returns: TRUE (1) : reset indicates present and device is ready// for commands.// FALSE (0): reset does not indicate presence or echos 'writes'// are not correct.//int owAccess(int portnum){ uchar sendpacket[9]; int i; // reset the 1-wire if (owTouchReset(portnum)) { // create a buffer to use with block function // match Serial Number command 0x55 sendpacket[0] = 0x55; // Serial Number for (i = 1; i < 9; i++) sendpacket[i] = SerialNum[portnum][i-1]; // send/recieve the transfer buffer if (owBlock(portnum,FALSE,sendpacket,9)) { // verify that the echo of the writes was correct for (i = 1; i < 9; i++) if (sendpacket[i] != SerialNum[portnum][i-1]) return FALSE; if (sendpacket[0] != 0x55) return FALSE; else return TRUE; } } // reset or match echo failed return FALSE;}//----------------------------------------------------------------------// The function 'owVerify' verifies that the current device// is in contact with the 1-Wire Net. // Using the find alarm command 0xEC will verify that the device// is in contact with the 1-Wire Net and is in an 'alarm' state. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.// 'alarm_only' - TRUE (1) the find alarm command 0xEC // is sent instead of the normal search // command 0xF0. //// Returns: TRUE (1) : when the 1-Wire device was verified// to be on the 1-Wire Net // with alarm_only == FALSE // or verified to be on the 1-Wire Net// AND in an alarm state when // alarm_only == TRUE. // FALSE (0): the 1-Wire device was not on the // 1-Wire Net or if alarm_only// == TRUE, the device may be on the // 1-Wire Net but in a non-alarm state.// int owVerify(int portnum, int alarm_only){ int i,sendlen=0,goodbits=0,cnt=0,s,tst; uchar sendpacket[50]; // construct the search rom if (alarm_only) sendpacket[sendlen++] = 0xEC; // issue the alarming search command else sendpacket[sendlen++] = 0xF0; // issue the search command // set all bits at first for (i = 1; i <= 24; i++) sendpacket[sendlen++] = 0xFF; // now set or clear apropriate bits for search for (i = 0; i < 64; i++) bitacc(WRITE_FUNCTION,bitacc(READ_FUNCTION,0,i,&SerialNum[portnum][0]),(int)((i+1)*3-1),&sendpacket[1]); // send/recieve the transfer buffer if (owBlock(portnum,TRUE,sendpacket,sendlen)) { // check results to see if it was a success for (i = 0; i < 192; i += 3) { tst = (bitacc(READ_FUNCTION,0,i,&sendpacket[1]) << 1) | bitacc(READ_FUNCTION,0,(int)(i+1),&sendpacket[1]); s = bitacc(READ_FUNCTION,0,cnt++,&SerialNum[portnum][0]); if (tst == 0x03) // no device on line { goodbits = 0; // number of good bits set to zero break; // quit } if (((s == 0x01) && (tst == 0x02)) || ((s == 0x00) && (tst == 0x01)) ) // correct bit goodbits++; // count as a good bit } // check too see if there were enough good bits to be successful if (goodbits >= 8) return TRUE; } // block fail or device not present return FALSE;}//----------------------------------------------------------------------// Perform a overdrive MATCH command to select the 1-Wire device with // the address in the ID data register.//// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to// OpenCOM to indicate the port number.//// Returns: TRUE: If the device is present on the 1-Wire Net and// can do overdrive then the device is selected.// FALSE: Device is not present or not capable of overdrive.//// *Note: This function could be converted to send DS2480// commands in one packet. //int owOverdriveAccess(int portnum){ uchar sendpacket[8]; int i, bad_echo = FALSE;#if DEBUG_OW_NETU printf ("owOverdriveAccess\n");#endif // make sure normal level owLevel(portnum,MODE_NORMAL); // force to normal communication speed owSpeed(portnum,MODE_NORMAL); // call the 1-Wire Net reset function if (owTouchReset(portnum)) { // send the match command 0x69 if (owWriteByte(portnum,0x69)) { // switch to overdrive communication speed owSpeed(portnum,MODE_OVERDRIVE); // create a buffer to use with block function // Serial Number for (i = 0; i < 8; i++) sendpacket[i] = SerialNum[portnum][i]; // send/recieve the transfer buffer if (owBlock(portnum,FALSE,sendpacket,8)) { // verify that the echo of the writes was correct for (i = 0; i < 8; i++) if (sendpacket[i] != SerialNum[portnum][i]) bad_echo = TRUE; // if echo ok then success if (!bad_echo) {#if DEBUG_OW_NETU printf ("owOverdriveAccess success\n");#endif return TRUE; } } } } // failure, force back to normal communication speed owSpeed(portnum,MODE_NORMAL); return FALSE;}//--------------------------------------------------------------------------// Bit utility to read and write a bit in the buffer 'buf'.//// 'op' - operation (1) to set and (0) to read// 'state' - set (1) or clear (0) if operation is write (1)// 'loc' - bit number location to read or write// 'buf' - pointer to array of bytes that contains the bit// to read or write//// Returns: 1 if operation is set (1)// 0/1 state of bit number 'loc' if operation is reading //int bitacc(int op, int state, int loc, uchar *buf){ int nbyt,nbit; nbyt = (loc / 8); nbit = loc - (nbyt * 8); if (op == WRITE_FUNCTION) { if (state) buf[nbyt] |= (0x01 << nbit); else buf[nbyt] &= ~(0x01 << nbit); return 1; } else return ((buf[nbyt] >> nbit) & 0x01);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -