⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 owllu.c

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 C
📖 第 1 页 / 共 2 页
字号:
}//--------------------------------------------------------------------------// 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 + -