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