📄 owllu.c
字号:
}
//--------------------------------------------------------------------------
// Set the 1-Wire Net communucation speed.
//
// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
// OpenCOM to indicate the port number.
// 'new_speed' - new speed defined as
// MODE_NORMAL 0x00
// MODE_OVERDRIVE 0x01
//
// Returns: current 1-Wire Net speed
//
int owSpeed(int portnum, int new_speed)
{
uchar sendpacket[5];
short sendlen=0;
int rt = FALSE;
#if DEBUG_OW_LLU
printf ("starting owSpeed: %d\n", new_speed);
#endif
// check if change from current mode
if (((new_speed == MODE_OVERDRIVE) &&
(USpeed[portnum] != SPEEDSEL_OD)) ||
((new_speed == MODE_NORMAL) &&
(USpeed[portnum] != SPEEDSEL_FLEX)))
{
if (new_speed == MODE_OVERDRIVE)
{
// if overdrive then switch to 115200 baud
if (DS2480ChangeBaud(portnum,PARMSET_115200) == PARMSET_115200)
{
USpeed[portnum] = SPEEDSEL_OD;
rt = TRUE;
}
}
else if (new_speed == MODE_NORMAL)
{
// else normal so set to 9600 baud
if (DS2480ChangeBaud(portnum,PARMSET_9600) == PARMSET_9600)
{
USpeed[portnum] = SPEEDSEL_FLEX;
rt = TRUE;
}
}
// if baud rate is set correctly then change DS2480 speed
if (rt)
{
// check if correct mode
if (UMode[portnum] != MODSEL_COMMAND)
{
UMode[portnum] = MODSEL_COMMAND;
sendpacket[sendlen++] = MODE_COMMAND;
}
// proceed to set the DS2480 communication speed
sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_SEARCHOFF | USpeed[portnum];
// send the packet
if (!WriteCOM(portnum,sendlen,sendpacket))
{
rt = FALSE;
// lost communication with DS2480 then reset
DS2480Detect(portnum);
}
}
}
#if DEBUG_OW_LLU
printf ("owSpeed: %d\n", rt);
#endif
// return the current speed
return (USpeed[portnum] == SPEEDSEL_OD) ? MODE_OVERDRIVE : MODE_NORMAL;
}
//--------------------------------------------------------------------------
// Set the 1-Wire Net line level. The values for new_level are
// as follows:
//
// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
// OpenCOM to indicate the port number.
// 'new_level' - new level defined as
// MODE_NORMAL 0x00
// MODE_STRONG5 0x02
// MODE_PROGRAM 0x04
// MODE_BREAK 0x08 (not supported)
//
// Returns: current 1-Wire Net level
//
int owLevel(int portnum, int new_level)
{
uchar sendpacket[10],readbuffer[10];
short sendlen=0;
short rt=FALSE;
#if DEBUG_OW_LLU
printf ("owLevel: %d\n", new_level);
#endif
// check if need to change level
if (new_level != ULevel[portnum])
{
// check if just putting back to normal
if (new_level == MODE_NORMAL)
{
// check if correct mode
if (UMode[portnum] != MODSEL_COMMAND)
{
UMode[portnum] = MODSEL_COMMAND;
sendpacket[sendlen++] = MODE_COMMAND;
}
// stop pulse command
sendpacket[sendlen++] = MODE_STOP_PULSE;
// flush the buffers
FlushCOM(portnum);
// send the packet
if (WriteCOM(portnum,sendlen,sendpacket))
{
// read back the 1 byte response
if (ReadCOM(portnum,1,readbuffer) == 1)
{
// check response byte
if ((readbuffer[0] & 0xE0) == 0xE0)
{
rt = TRUE;
ULevel[portnum] = MODE_NORMAL;
}
}
}
}
// set new level
else
{
// check if correct mode
if (UMode[portnum] != MODSEL_COMMAND)
{
UMode[portnum] = MODSEL_COMMAND;
sendpacket[sendlen++] = MODE_COMMAND;
}
// strong 5 volts
if (new_level == MODE_STRONG5)
{
// set the SPUD time value
sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite;
// add the command to begin the pulse
sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_5V;
}
// 12 volts
else if (new_level == MODE_PROGRAM)
{
// check if programming voltage available
if (!ProgramAvailable[portnum])
return MODE_NORMAL;
// set the PPD time value
sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_infinite;
// add the command to begin the pulse
sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_12V;
}
// flush the buffers
FlushCOM(portnum);
// send the packet
if (WriteCOM(portnum,sendlen,sendpacket))
{
// read back the 1 byte response from setting time limit
if (ReadCOM(portnum,1,readbuffer) == 1)
{
// check response byte
if ((readbuffer[0] & 0x81) == 0)
{
ULevel[portnum] = new_level;
rt = TRUE;
}
}
}
}
// if lost communication with DS2480 then reset
if (rt != TRUE)
DS2480Detect(portnum);
}
// return the current level
return ULevel[portnum];
}
//--------------------------------------------------------------------------
// This procedure creates a fixed 480 microseconds 12 volt pulse
// on the 1-Wire Net for programming EPROM iButtons.
//
// 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
// OpenCOM to indicate the port number.
//
// Returns: TRUE successful
// FALSE program voltage not available
//
int owProgramPulse(int portnum)
{
uchar sendpacket[10],readbuffer[10];
short sendlen=0;
// check if programming voltage available
if (!ProgramAvailable[portnum])
return FALSE;
// make sure normal level
owLevel(portnum,MODE_NORMAL);
// check if correct mode
if (UMode[portnum] != MODSEL_COMMAND)
{
UMode[portnum] = MODSEL_COMMAND;
sendpacket[sendlen++] = MODE_COMMAND;
}
// set the SPUD time value
sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_512us;
// pulse command
sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | BITPOL_12V | SPEEDSEL_PULSE;
// flush the buffers
FlushCOM(portnum);
// send the packet
if (WriteCOM(portnum,sendlen,sendpacket))
{
// read back the 2 byte response
if (ReadCOM(portnum,2,readbuffer) == 2)
{
// check response byte
if (((readbuffer[0] | CMD_CONFIG) ==
(CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_512us)) &&
((readbuffer[1] & 0xFC) ==
(0xFC & (CMD_COMM | FUNCTSEL_CHMOD | BITPOL_12V | SPEEDSEL_PULSE))))
return TRUE;
}
}
// an error occured so re-sync with DS2480
DS2480Detect(portnum);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -