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

📄 458_905_test.c

📁 pic-nrf905 SPI通信 无线收发程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  }while(cd==5);
  if(f920==1)
  {
   init_905_2_920();
  }
  else
  {
   init_905_2();
  }
  PIR1bits.TMR2IF=0;
  TMR2=0;
  T2CONbits.TMR2ON=1;//启动定时器2
  do
  {
   RX_905();
   if(PIR1bits.TMR2IF==1)
   {break;}
  }while(rved!=1);
  if(PIR1bits.TMR2IF==1)//对方没收到
  {
   re_T++;
   T2CONbits.TMR2ON=0;
   TMR2=0;
   PIR1bits.TMR2IF=0;
   //continue;
  }
  else //对方收到
  {
   T2CONbits.TMR2ON=0;//停止TMR2
   TMR2=0;//定时器清零
   rved=0;
   if(s_rv[s_bff_num][0]==0xff)
   {
    if(s_rv[s_bff_num][1]==t_package_num)
    {
     u_rcount[u_bff_num_temp]=0;
     re_T=100;
     PORTA=0x00;
     if(f920==1)
     {
      init_905_32_920();
     }
     else
     {
      init_905_32();
     }
    }
    else
    {re_T++;}
   }
   else
   {re_T++;}
  }
///*
  if(re_T==2)
  {
   //PORTA=0x02;
   T2CONbits.TMR2ON=0;//停止TMR2
   if(f920==0)
   {
    T905_jump920();
   }
   else
   {
    T905_jump915();
   }
   delay(1000);
   re_T=1;
  }//if(re_T==2)
 }//while(re_T<2)
/*
  if(re_T==2)
  {
   //PORTA=0x02;
   reT_num++;
   T2CONbits.TMR2ON=0;//停止TMR2
   //delay(1000);
   if(f920==0)
   {
    T905_jump920();
   }
   else
   {
    T905_jump915();
   }
   re_T=1;
   //goto zzzz;
  }
//*/

 INTCONbits.INT0IF=0;
 u_rcount[u_bff_num_temp]=0;
 txing=0;
 INTCONbits.INT0IE=1;//开外部INT0中断
}

void T905_jump920()
{
 char i;
 INTCONbits.INT0IE=0;//关闭外部INT0中断,防止接收ARQ信息与接收真正的数据冲突
 i=0;
 cd=0xff;
 wnum=0;
 
 while(i<=10)
 {
  i=i+1;
  tx905bff[0]=0xff;
  tx905bff[1]=0x00;
  init_905_32();
  do
  {
   cd=TX_905(32);
  }
  while(cd==5);
  init_905_2_920();
  PIR1bits.TMR2IF=0;
  TMR2=0;
  T2CONbits.TMR2ON=1;//启动定时器2
  do
  {
   RX_905();
   if(PIR1bits.TMR2IF==1)
   {break;}
  }
  while(rved!=1);
  if(PIR1bits.TMR2IF==1)//对方没收到
  {
   T2CONbits.TMR2ON=0;
   TMR2=0;
   PIR1bits.TMR2IF=0;
   ///*//新频道询问
   tx905bff[0]=0xf0;
   tx905bff[1]=0x00;
   init_905_32_920();
   do
   {
    cd=TX_905(32);
   }
   while(cd==5);
   init_905_2_920();
   PIR1bits.TMR2IF=0;
   TMR2=0;
   T2CONbits.TMR2ON=1;//启动定时器2
   do
   {
    RX_905();
    if(PIR1bits.TMR2IF==1)
    {break;}
   }
   while(rved!=1);
   if(PIR1bits.TMR2IF==1)//没收到询问回答信息
   {
    T2CONbits.TMR2ON=0;
    TMR2=0;
    PIR1bits.TMR2IF=0;
    continue;
   }
   else//对方收到询问信息 
   {
    T2CONbits.TMR2ON=0;//停止TMR2
    TMR2=0;//定时器清零
    rved=0;
    PORTA=0x00;
    //PORTA=PORTA||0X08;
    init_905_32_920();
    f920=1;
    INTCONbits.INT0IF=0;
    INTCONbits.INT0IE=1;//开外部INT0中断
    return;
   }//*/
   continue;
  }
  else //对方收到
  {
   T2CONbits.TMR2ON=0;//停止TMR2
   TMR2=0;//定时器清零
   rved=0;
   PORTA=0x00;
   //SPI_readcon();
   //PORTA=PORTA||0X04;
   _asm
   nop
   nop
   _endasm
   //if(s_rv[s_bff_num][0]==0x00)
   //{
   init_905_32_920();
   f920=1;
   INTCONbits.INT0IF=0;
   INTCONbits.INT0IE=1;//开外部INT0中断
   return;
   //}
  }
 }
 if(i>10)
 {
  PORTA=0x02;
 }
}

void T905_jump915()
{
 char i;
 INTCONbits.INT0IE=0;//关闭外部INT0中断,防止接收ARQ信息与接收真正的数据冲突
 i=0;
 cd=0xff;
 wnum=0;

 while(i<=10)
 {
  tx905bff[0]=0x0f;
  tx905bff[1]=0x00;
  i=i+1;
  init_905_32_920();
  do
  {
   cd=TX_905(32);
  }
  while(cd==5);
  init_905_2();
  PIR1bits.TMR2IF=0;
  TMR2=0;
  T2CONbits.TMR2ON=1;//启动定时器2
  do
  {
   RX_905();
   if(PIR1bits.TMR2IF==1)
   {break;}
  }
  while(rved!=1);
  if(PIR1bits.TMR2IF==1)//对方没收到
  {
   T2CONbits.TMR2ON=0;
   TMR2=0;
   PIR1bits.TMR2IF=0;
   ///*//原频道询问
   tx905bff[0]=0xf0;
   tx905bff[1]=0x00;
   init_905_32();
   do
   {
    cd=TX_905(32);
   }
   while(cd==5);
   init_905_2();
   PIR1bits.TMR2IF=0;
   TMR2=0;
   T2CONbits.TMR2ON=1;//启动定时器2
   do
   {
    RX_905();
    if(PIR1bits.TMR2IF==1)
    {break;}
   }
   while(rved!=1);
   if(PIR1bits.TMR2IF==1)//对方没收到询问信息
   {
    T2CONbits.TMR2ON=0;
    TMR2=0;
    PIR1bits.TMR2IF=0;
    continue;
   }
   else//对方收到询问信息 
   {
    T2CONbits.TMR2ON=0;//停止TMR2
    TMR2=0;//定时器清零
    rved=0;
    PORTA=0x00;
    init_905_32();
    f920=0;
    INTCONbits.INT0IF=0;
    INTCONbits.INT0IE=1;//开外部INT0中断
    return;
   }//*/
   continue;
  }
  else //对方收到
  {
   T2CONbits.TMR2ON=0;//停止TMR2
   TMR2=0;//定时器清零
   rved=0;
   PORTA=0x00;
  // if(s_rv[s_bff_num][0]==0x00)
   //{
   init_905_32();
   f920=0;
   INTCONbits.INT0IF=0;
   INTCONbits.INT0IE=1;//开外部INT0中断
   return;
  // }
  }
 }
 if(i>10)
 {
  PORTA=0x02;
 }
}

//INT0输入中断 高优先级
#pragma code InterruptVectorHigh=0x08 //高优先级中断向量
void InterruptVectorHigh(void)
{
 _asm
  goto InterruptHandlerHigh //跳到中断程序
 _endasm
}
//高优先级中断程序
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh()
{
 if(INTCONbits.INT0IF==1) 
 {
  INTCONbits.INT0IF=0;
  if(txing==0)
  {
   //lighting_led(GREEN,5000);
   SPI_read();
   if(s_rv[s_bff_num][0]==0xff)//jump to 920
   {
    init_905_2_920();
    f920=1;
    PORTA=0x00;
    tx905bff[0]=0x00;
    do
    {
     cd=TX_905(2);
     if(cd==5)
     {
      //lighting_led(COMPLETE,3000);
     }
    }
    while(cd==5);
    if(f920==1)
    {
     init_905_32_920();
    }
    else
    {
     init_905_32();
    }
    return;
   }
   if(s_rv[s_bff_num][0]==0x0f)//jump to 915
   {
    init_905_2();
    f920=0;
    PORTA=0x00;
    tx905bff[0]=0x00;
    do
    {
     cd=TX_905(2);
     if(cd==5)
     {
      //lighting_led(COMPLETE,3000);
     }
    }
    while(cd==5);
    if(f920==1)
    {
     init_905_32_920();
    }
    else
    {
     init_905_32();
    }
    return;
   }
   if(s_rv[s_bff_num][0]==0xf0)//收到询问信息
   {
    if(f920==1)
    {
     init_905_2_920();
    }
    else
    {
     init_905_2();
    }
    tx905bff[0]=0x00;
    PORTA=0x00;
    do
    {
     cd=TX_905(2);
     if(cd==5)
     {
      //lighting_led(COMPLETE,3000);
     }
    }
    while(cd==5);
    if(f920==1)
    {
     init_905_32_920();
    }
    else
    {
     init_905_32();
    }
    return;
   }
   if((s_rv[s_bff_num][0]<6)&&(s_rv[s_bff_num][0]>0))
   {
    if(r_package_num==s_rv[s_bff_num][0])
    {
     if(f920==1)
     {
      init_905_2_920();
     }
     else
     {
      init_905_2();
     }
     PORTA=0x00;
     tx905bff[0]=0xff;
     tx905bff[1]=r_package_num;
     //发送ACK与已有包号
     do
     {
      cd=TX_905(2);
      if(cd==5)
      {
       //lighting_led(COMPLETE,3000);
      }
     }
     while(cd==5);
     if(f920==1)
     {
      init_905_32_920();
     }
     else
     {
      init_905_32();
     }
     mode_905(RX_MODE);
    }
    else
    {
     r_package_num=s_rv[s_bff_num][0];
     if(f920==1)
     {
      init_905_2_920();
     }
     else
     {
      init_905_2();
     }
     PORTA=0x00;
     tx905bff[0]=0xff;
     tx905bff[1]=r_package_num;
     //发送ACK与包号
     do
     {
      cd=TX_905(2);
      if(cd==5)
      {
       //lighting_led(COMPLETE,3000);
      }
     }
     while(cd==5);
     if(f920==1)
     {
      init_905_32_920();
     }
     else
     {
      init_905_32();
     }
     mode_905(RX_MODE);
     s_bff_num_temp=s_bff_num;
     s_bff_num++;
     if(s_bff_num>=2)
     {
      s_bff_num=0;
     }
     TX_USART();
     srd=1;
    }
   }
  }
  INTCONbits.INT0IF=0;
 }
 if(PIR2bits.HLVDIF==1)
 {
  PORTA=0x08;
  lvd_tag=1;
  PIR2bits.HLVDIF=0;
 }
} 

//USART接收中断,低优先级
#pragma code InterruptVectorLow=0x18 //低优先级中断向量
void InterruptVectorLow(void)
{
 _asm
  goto InterruptHandlerLow //跳到中断程序
 _endasm
}
//低优先级中断程序
#pragma code
#pragma interrupt InterruptHandlerLow
void InterruptHandlerLow()
{
 if(PIR1bits.RCIF==1)
 {
  //lighting_led(COMPLETE,5000);
  RX_USART();
  T1CONbits.TMR1ON=0;//关闭TMR1
  PIR1bits.TMR1IF=0;
  if(u_rnum==30)
  {
   u_rnum=0;
   return;
  }

  TMR1H=0x00;
  TMR1L=0x00;
  if(txing==1)
  {
   u_rd=1;
  }
  if(txing==0)
  {
   PIR1bits.TMR1IF=0; 
   T1CONbits.TMR1ON=1;//启动TMR1
  }
 }
 if(PIR2bits.HLVDIF==1)
 {
  lighting_led(COMPLETE,10000);
  PIR2bits.HLVDIF=0;
 }
} 


void main()
{
 turn_flash_led();
 init();
 t_package_num=0x00;//发送包号清零
 r_package_num=0x00;//接收包号清零
 rved=0;//接收到标志清零
 re_T=0;//重传标志清零
 txing=0;
 stxing=0;
 sstxing=0;
 srd=0;
 u_rcount[0]=0;
 u_rnum=0;
 s_rnum=0;
 u_bff_num=0;
 u_bff_num_temp=0;
 s_bff_num=0;
 s_bff_num_temp=0;
 u_rd=0;
 cd=0xff;
 reT_num=0;
 f920=0;
 lvd_tag=0;
 lvd_count=0;
 while(1)
 {
  _asm
   clrwdt
  _endasm
  if(lvd_tag==1)
  {
   lvd_count++;
   PORTA=0x08;
  }
  if(lvd_count>=10000)
  {
   PORTA=0x00;
   lvd_tag=0;
   lvd_count=0;
  }
  if(init32==0)
  {
   if(f920==1)
   {
    init_905_32_920();
   }
   else
   {
    init_905_32();
   }
  }
  if(mode905!=RX_MODE)
  {
   mode_905(RX_MODE);
  }
  if((PIR1bits.TMR1IF==1)||(u_rcount[u_bff_num]==30))
  {
   txing=1;
   u_bff_num_temp=u_bff_num;
   u_bff_num++;
   if(u_bff_num>=2)
   {
    u_bff_num=0;
   }
   T1CONbits.TMR1ON=0;//关闭TMR1
   PIR1bits.TMR1IF=0;
   TMR1H=0x00;
   TMR1L=0x00;
   u_rnum=0; 
   //delay(500);
  }
  if(u_rd==1)
  {
   PIR1bits.TMR1IF=0; 
   T1CONbits.TMR1ON=1;//启动TMR1
   u_rd=0;
  }
  if(txing==1)
  {
   T905();
   //SPI_readcon();
  }
  if(srd==1)
  {
   srd=0;
  }
 }
}

⌨️ 快捷键说明

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