📄 onewire.c
字号:
#include "hal.h"
#define OW_US_RESET_LOW 480 // a
#define OW_US_RESET_WAIT 15
#define OW_US_RESET_HOLD 150
#define OW_US_W1_LOW 5 // b
#define OW_US_W1_HIGH 59
#define OW_US_W0_LOW 60 // c
#define OW_US_W0_HIGH 8
#define OW_US_R0_HOLD 50
//---------------------------------------
#define OW_US_LOW1 40
#define OW_US_LOW2 200
// < OW_US_LOW1 write 1 or read
// > OW_US_LOW1 && < OW_US_LOW2 write 0
// > OW_US_LOW2 reset
//---------------------------------------
#define OW_ST_IDLE 0
#define OW_ST_RESET 1
#define OW_ST_CMD 2
#define OW_ST_READ 3
#define OW_BYTE_NUM 8
#define OW_CMD_READ 0x33
#define OW_CMD_SEARCH 0xf0 // not support now
// port configuration
#define ONEWIRE_PIN() (PINC & (1<<PC5))
#define ONEWIRE_LOW() (DDRC |= 1<<PC5) //{DDRC |= 1<<PC5; PORTC &= ~(1<<PC5);}
#define ONEWIRE_IDLE() (DDRC &=~(1<<PC5)) //{DDRC &=~(1<<PC5); PORTC |= 1<<PC5;}
// Global variable
BYTE OneWireRun = 1; // wnen running OneWire(), set OneWireRun to 0, can break;
BYTE OWData[OW_BYTE_NUM] = {0x01, 0xFC, 0x51, 0x5B, 0x06, 0x00, 0x00, 0xf7};
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void OneWirePauseUs(WORD cnt)
{
while(cnt--);
}
//------------------------------------------------------------------------------
void OneWireInit(void)
{
DDRC &= ~(1<< PC5);
PORTC &= ~(1<< PC5);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
BYTE OneWire(void)
{
BYTE i;
BYTE lm;
BYTE cmd;
WORD cnt;
BYTE Status;
Status = OW_ST_IDLE;
while(1){
if(Status == OW_ST_READ){
for(i = 0; i<OW_BYTE_NUM; i++){
cmd = OWData[i];
for(lm =0; lm<8; lm++){
while((OneWireRun) && ONEWIRE_PIN());
ONEWIRE_LOW();
if((cmd & 0x01) == 0)
OneWirePauseUs(OW_US_R0_HOLD);
ONEWIRE_IDLE();
cmd >>=1;
while((OneWireRun) && ONEWIRE_PIN()==0);
}
}
if(OneWireRun == 0) return 0;
else return 1;
}else{
cnt = 2;
while((OneWireRun) && ONEWIRE_PIN());
while((OneWireRun) && (ONEWIRE_PIN() == 0))
cnt++; // pause 1uS here
}
if(cnt < OW_US_LOW1){ // write 1
if(Status == OW_ST_CMD){
cmd >>= 1;
cmd |= 0x80;
if(++lm >= 7){
if(cmd == OW_CMD_READ){
Status = OW_ST_READ;
}else{
return 0;
}
}
}else if(Status == OW_ST_RESET){
cmd = 0x80;
lm = 0;
Status = OW_ST_CMD;
}else{
return 0;
}
}else if(cnt < OW_US_LOW2){ // write 0
if(Status == OW_ST_RESET){
cmd = 0x00;
lm = 0;
Status = OW_ST_CMD;
}else if(Status == OW_ST_CMD){
cmd >>= 1;
if(++lm >= 7){
if(cmd == OW_CMD_READ){
Status = OW_ST_READ;
}else{
return 0;
}
}
}else{
return 0;
}
}else{ // reset
OneWirePauseUs(OW_US_RESET_WAIT);
ONEWIRE_LOW();
OneWirePauseUs(OW_US_RESET_HOLD);
ONEWIRE_IDLE();
Status = OW_ST_RESET;
}
if(OneWireRun == 0)
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -