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

📄 protocol.c

📁 NEC9222参考代码
💻 C
字号:
#include "includes.h"


unsigned char rf_send_period = SHORT_TERM;


#ifdef RF_MCU_DELAY
#define SendByte   SendByteA
#else
#define SendByte   SendByteB
#endif


void RF_init(void)
{
    unsigned char i,j,st;
    unsigned short readVal;


    LED = 0;
    RF_SCK=0;
    RF_SDI=0;

    do
    {
        readVal = RFXX_WRT_CMD(0xcc00);
        _clr_wdt(); 
    }while(!(readVal&0x01));
#ifdef RF_RATE_4_8_K   
    RFXX_WRT_CMD(0x8B61);
#else
    RFXX_WRT_CMD(0x8B60);
#endif
    RFXX_WRT_CMD(0xA640);     //434MHz

#ifndef RF_MCU_DELAY   
    RFXX_WRT_CMD(0xD040);     //RATE/2
#endif

    //RFXX_WRT_CMD(0xD280);     //RATE/2
#ifdef RF_RATE_4_8_K   
    RFXX_WRT_CMD(0xC847);
#else

#ifdef RF_MCU_DELAY
    RFXX_WRT_CMD(0xC891);
#else
    RFXX_WRT_CMD(0xC847);
#endif

#endif

#if 0   
    switch(Rate){//SELECT DATA RATE
         case 0: RFXX_WRT_CMD(0xC891);break;//SendCmd(0xC8,0xA3);break;//1.134kbps
         case 1: RFXX_WRT_CMD(0xC847);break;//SendCmd(0xC8,0x47);break;//2.4kbps
         case 2: RFXX_WRT_CMD(0xC823);break;//SendCmd(0xC8,0x47);break;//4.8kbps
         case 3: RFXX_WRT_CMD(0xC811);break;//SendCmd(0xC8,0x23);break;//9.6kbps
         case 4: RFXX_WRT_CMD(0xC809);break;//SendCmd(0xC8,0x13);break;//17.2kbps
         case 5: RFXX_WRT_CMD(0xC808);break;//SendCmd(0xC8,0x11);break;//19.3kbps
         case 6: RFXX_WRT_CMD(0xC804);break;//SendCmd(0xC8,0x08);break;//38.8kbps
         case 7: RFXX_WRT_CMD(0xC800);break;//SendCmd(0xC8,0x02);break;//118.4kbps
         default: RFXX_WRT_CMD(0xC811);break;//SendCmd(0xC8,0x23);break;//9.6kbps
    }
#endif   

    RFXX_WRT_CMD(RF_TIME_CALIBR);   

    //_delay(50000);
    //_delay(50000);
    //_delay(50000);   
    //_delay(50000); 

    //RFXX_WRT_CMD(RF_TIME_CLEAR); 
    //RFXX_WRT_CMD(0xE067);           //0xE06b
    //RFXX_WRT_CMD(RF_TIME_SET);

    LED = 1;
}
void Delay_7i5(unsigned char uS){
  while(--uS);
}

unsigned char send8bit(unsigned char aByte)
{
  unsigned char i;
  RF_SCK=0;
  for(i=0;i<8;i++){
    if(aByte&0x80){
      RF_SDI=1;
    }else{
      RF_SDI=0;
    } 
    RF_SCK=1;
    aByte<<=1;
    RF_SCK=0;
  } 
  RF_SDI=0;
  
  return 0;
}


void SendByteA(unsigned char aByte){
  unsigned char i,j;
  for(i=0;i<8;i++){
    if(aByte&0x80){
      RF_SDI=1;
    }else{
      RF_SDI=0;
    }
    aByte<<=1;

#ifdef RF_RATE_4_8_K  
    Delay_7i5(69);
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();    
#else    
    //NOP();  
    Delay_7i5(147);    //2.4K
#endif    


#if 0        
    switch(Rate){
    case 0:Delay_7i5(115);j++;               break;      //1.2k-shell=20us
    case 1:Delay_7i5(55);                    break;      //2.4k-shell=24us
    case 2:Delay_7i5(24);j++;j--;j++;j--;j++;break;      //4.8k-shell=28us
    case 3:Delay_7i5(9);j++;j--;             break;      //9.6k-shell=32us
    case 4:Delay_7i5(2);j++;                 break;      //17.2k-shell=36us
    case 5:j++;j--;j++;j--;j++;j++;j--;j++;j--;j++;break;//19.2k-shell=40us
    case 6:break;//22.73k
    case 7:break;
    }
#endif  

  }
}

 
void SendByteB(unsigned char aByte){
  unsigned char i;
  unsigned short n = 0;
  for(i=0;i<8;i++)
  {
    n = 0;
    while(RF_IRQ);
    {
        n++;
        if(n > 400)
            break;
    } 
    n = 0;
    while(!RF_IRQ);
    {
        n++;
        if(n > 400)
            break;
    }
    
    if(aByte&0x80){
      RF_SDI=1;
    }else{
      RF_SDI=0;
    }
    aByte<<=1;  
    
  }
}


unsigned int RFXX_WRT_CMD(unsigned short aCmd)
{
  unsigned char i; 
  unsigned int temp;
  RF_SCK = 0;
  RF_CS = 0;

  for(i=0;i<16;i++){    
    RF_SCK = 0;
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    if(aCmd&0x8000){
      RF_SDI = 1;
    }else{     
      RF_SDI = 0;
    } 
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    RF_SCK = 1;
    aCmd<<=1; 
    temp<<=1;
    if(RF_IRQ){ 
      temp|=0x0001;
    }   
    
  };      
  RF_SCK = 0;
  RF_CS = 1;
  return(temp); 
} 

void RF_send_frame(void)
{
    unsigned char i,j;
    unsigned long ad_result = 0;

    report_status = battery_voltage;
    
    if(_key_flag == 0)
        LED = 0;

    RFXX_WRT_CMD(RF_START_SEND_CMD);
    P12.1 = 1;
    _delay(40);
    
    for(i=0; i< AD_MAX_CHANNEL; i++)
    {
        ad_result += AD_conv_result[i];        
    };

    //ad_result = ad_result/(RF_SEND_PERIOD - 1); 
    
    ad_result = ad_result * 1000 /1414;

    j = 0; 
    j += meter_id>>8;
    j += meter_id&0xff;    
    j += ad_result>>8;
    j += ad_result&0xff;
    j += report_status;
    
    RF_CS=0;
    send8bit(0xC6);


//#ifndef RF_RATE_4_8_K   
//   RFXX_WRT_CMD(0x8B81);
//#else    
    
    SendByte(0xAA);
    SendByte(0xAA);
    
    SendByte(0xAA);
    SendByte(0x2D);
    SendByte(0xD4);
                           
    SendByte((unsigned char)(meter_id>>8));
    
    SendByte((unsigned char)(meter_id&0xff));

    SendByte((unsigned char)(ad_result>>8));
    
    SendByte((unsigned char)(ad_result&0xff));
            
    SendByte(report_status);
    
    SendByte(j);//send sum

    SendByte(0xAA);
        
    RF_CS=1;

    RFXX_WRT_CMD(RF_STOP_SEND_CMD);
    P12.1 = 0;
    memset(AD_conv_result, 0, AD_MAX_CHANNEL * sizeof(unsigned long));

#if 1   
    if(_key_flag == 0)
        if(LED_on_time == 0)
            LED = 1;
#endif        
}
unsigned char ReadStatus(void)
{
    unsigned char i,st;
    RF_SCK=0;
    RF_CS=0;
    send8bit(0xCC);
    RF_SDI=0;
    for(i=0;i<8;i++){
      st<<=1;
      
      RF_SCK=1;
      RF_SCK=1;
      RF_SCK=1;
      RF_SCK=1;
      if(RF_IRQ){
        st++;
      }
      RF_SCK=0;    
    };
    RF_CS=1;
    return(st);
}

⌨️ 快捷键说明

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