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