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

📄 onewirei.c

📁 Wind sensor for control speed air flow.
💻 C
字号:
/********************************************************************
  OneWire module
********************************************************************/
#include <iom8.h>
#include <ioavr.h>
#include <inavr.h>
#include <string.h>
#include "onewirei.h"

//=============== OWI init =========================================
void OWI_Init(unsigned char pins)
{ OWI_RELEASE_BUS(pins);
  __delay_cycles(OWI_DELAY_H_STD_MODE);
}
//================== Write 1 ======================================
void OWI_WriteBit1(unsigned char pins)
{ unsigned char intState;  
  intState = __save_interrupt();
  __disable_interrupt();
  OWI_PULL_BUS_LOW(pins);
  __delay_cycles(OWI_DELAY_A_STD_MODE);
  OWI_RELEASE_BUS(pins);
  __delay_cycles(OWI_DELAY_B_STD_MODE);
  __restore_interrupt(intState);
}
//================== Write 0 ======================================
void OWI_WriteBit0(unsigned char pins)
{ unsigned char intState;
  intState = __save_interrupt();
  __disable_interrupt();
  OWI_PULL_BUS_LOW(pins);
  __delay_cycles(OWI_DELAY_C_STD_MODE);
  OWI_RELEASE_BUS(pins);
  __delay_cycles(OWI_DELAY_D_STD_MODE);
  __restore_interrupt(intState);
}
//================== Read bit ====================================
unsigned char OWI_ReadBit(unsigned char pins)
{ unsigned char intState;
  unsigned char bitsRead;
  intState = __save_interrupt();
  __disable_interrupt();
  OWI_PULL_BUS_LOW(pins);
  __delay_cycles(OWI_DELAY_A_STD_MODE);
  OWI_RELEASE_BUS(pins);
  __delay_cycles(OWI_DELAY_E_STD_MODE);
  bitsRead = OWI_PIN & pins;
  __delay_cycles(OWI_DELAY_F_STD_MODE);
  __restore_interrupt(intState);
  return bitsRead;
}
//================== Detect device ===============================
unsigned char OWI_DetectPresence(unsigned char pins)
{ unsigned char intState;
  unsigned char presenceDetected;
  intState = __save_interrupt();
  __disable_interrupt();
  OWI_PULL_BUS_LOW(pins);
  __delay_cycles(OWI_DELAY_H_STD_MODE);
  OWI_RELEASE_BUS(pins);
  __delay_cycles(OWI_DELAY_I_STD_MODE);
  presenceDetected = ((~OWI_PIN) & pins);
  __delay_cycles(OWI_DELAY_J_STD_MODE);
  __restore_interrupt(intState);
  return presenceDetected;
}
//================== Send byte ==================================
void OWI_SendByte(unsigned char data, unsigned char pins)
{ unsigned char temp;
  unsigned char i;
  for (i = 0; i < 8; i++)
  { temp = data & 0x01;
    if (temp)
    { OWI_WriteBit1(pins);
    }
    else
    { OWI_WriteBit0(pins);
    }
    data >>= 1;
  }
}
//================== Read byte ==================================
unsigned char OWI_ReceiveByte(unsigned char pin)
{ unsigned char data;
  unsigned char i;
  data = 0x00;
  for (i = 0; i < 8; i++)
  { data >>= 1;
    if (OWI_ReadBit(pin)) data |= 0x80;
  }
  return data;
}
//================= Skip ROM ===================================
void OWI_SkipRom(unsigned char pins)
{ OWI_SendByte(OWI_ROM_SKIP, pins);
}
//================= Read ROM ==================================
void OWI_ReadRom(unsigned char * romValue, unsigned char pin)
{ unsigned char bytesLeft = 8;
  OWI_SendByte(OWI_ROM_READ, pin);
  while (bytesLeft > 0)
  { *romValue++ = OWI_ReceiveByte(pin);
     bytesLeft--;
  }
}
//==================== Match ROM ==============================
void OWI_MatchRom(unsigned char * romValue, unsigned char pins)
{ unsigned char bytesLeft = 8;   
  OWI_SendByte(OWI_ROM_MATCH, pins);
  while (bytesLeft > 0)
  { OWI_SendByte(*romValue++, pins);
    bytesLeft--;
  }
}
//==================== Search device =========================
unsigned char OWI_SearchRom(unsigned char * bitPattern, unsigned char lastDeviation, unsigned char pin)
{ unsigned char currentBit = 1;
  unsigned char newDeviation = 0;
  unsigned char bitMask = 0x01;
  unsigned char bitA;
  unsigned char bitB;
  OWI_SendByte(OWI_ROM_SEARCH, pin);
  while (currentBit <= 64)
  { bitA = OWI_ReadBit(pin);
    bitB = OWI_ReadBit(pin);
    if (bitA && bitB)
    { newDeviation = OWI_ROM_SEARCH_FAILED;
      return;
    }
    else 
    { if(bitA ^ bitB)
      { if (bitA) (*bitPattern) |= bitMask;
        else (*bitPattern) &= ~bitMask;
      }
      else // Both bits 0
      { if (currentBit == lastDeviation) (*bitPattern) |= bitMask;
        else 
        { if (currentBit > lastDeviation)
          { (*bitPattern) &= ~bitMask;
             newDeviation = currentBit;
          }
          else if (!(*bitPattern & bitMask)) newDeviation = currentBit;         
        }
      }
    }
    if ((*bitPattern) & bitMask) OWI_WriteBit1(pin);
    else OWI_WriteBit0(pin);
    currentBit++;
    bitMask <<= 1;
    if (!bitMask)
    { bitMask = 0x01;
      bitPattern++;
    }
  }
  return newDeviation;
}
//CRC8
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{ unsigned char bitsLeft;
  unsigned char temp;
  for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
  { temp = ((seed ^ inData) & 0x01);
    if (temp == 0) seed >>= 1;
    else
    { seed ^= 0x18;
      seed >>= 1;
      seed |= 0x80;
    }
    inData >>= 1;
  }
  return seed;    
}
//CRC16
unsigned int OWI_ComputeCRC16(unsigned char inData, unsigned int seed)
{ unsigned char bitsLeft;
  unsigned char temp;
  for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
  { temp = ((seed ^ inData) & 0x01);
    if (temp == 0) seed >>= 1;
    else
    { seed ^= 0x4002;
      seed >>= 1;
      seed |= 0x8000;
    }
    inData >>= 1;
  }
  return seed;    
}
//ROM CRC
unsigned char OWI_CheckRomCRC(unsigned char * romValue)
{ unsigned char i;
  unsigned char crc8 = 0;
  for (i = 0; i < 7; i++)
  { crc8 = OWI_ComputeCRC8(*romValue, crc8);
    romValue++;
  }
  if (crc8 == (*romValue)) return OWI_CRC_OK;
  return OWI_CRC_ERROR;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -