📄 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 + -