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

📄 onewire.c

📁 1-wire"从机"模拟程序, 不是主机,1-wire的主机模拟程序网上很多.使用mega88模拟DS1990A芯片时序, 再加上模拟主机就可以搭建不使用DALASI芯片而使用1-wire协议的系统.
💻 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 + -