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

📄 458_905_test.c

📁 pic-nrf905 SPI通信 无线收发程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <p18f4580.h>
#pragma config OSC = HS

#define RED 0
#define YELLOW 1
#define GREEN 2
#define COMPLETE 3
#define LIGHT 6
#define FLASH 10
#define TX_MODE 11
#define RX_MODE 12
#define STBY 13

volatile unsigned char mode905,cd,t_package_num,r_package_num,rved,re_T,txing,stxing,sstxing,srd,init32,u_rd,f920;
volatile unsigned char udata,sdata,uselessdata,s_tx[33],lvd_tag;
unsigned char wnum,s_tnum,u_tnum,s_rnum,u_rnum,s_rv[2][32],u_rv[2][32];
volatile unsigned char s_rcount,s_tcount,u_rcount[2],u_tcount,u_bff_num,u_bff_num_temp,s_bff_num,s_bff_num_temp,tx905bff[32];
int reT_num,aaa,bbb,ggg,hhh,iii,kkk,jump_succeed;
unsigned long lvd_count;
/* u_rnum记录从串口接收到的数据个数,满30个后重新计数
*/
void InterruptHandlerHigh(void);
void InterruptHandlerLow(void);
void mode_905(volatile unsigned char mode);
void T905_jump920();
void T905_jump915();
void delay(unsigned long m)//延时程序,27778为1秒,1为36微妙
{
 unsigned long i;
 for(i=0;i<m;i++)
 {
  _asm
   clrwdt
  _endasm
 }
}

void init_SPI()//SPI主控
{
 SSPCON1bits.SSPM3=0;
 SSPCON1bits.SSPM2=0;
 SSPCON1bits.SSPM1=0;
 SSPCON1bits.SSPM0=0;//SPI主控方式选择,时钟频率选择4分之一晶振,1MHZ
 SSPCON1bits.CKP=0;//时钟极性选择
 SSPSTATbits.SMP=1;//数据输出结束时采样输入数据
 SSPSTATbits.CKE=1;//时钟沿选择
 TRISCbits.TRISC5=0;//SDO输出使能
 TRISCbits.TRISC3=0;//SCK时钟输出
 SSPCON1bits.SSPEN=1;//SPI串行通信使能
 PIR1bits.SSPIF=0;//清除中断标志
}

void init_USART()
{
 TXSTAbits.TX9=0;//发送8位数据
 RCSTAbits.RX9=0;//接收8位数据
 TXSTAbits.SYNC=0;//异步方式选择
 TXSTAbits.BRGH=1;//高速波特率选择
 SPBRG=25;//9.6Kb/s
 RCSTAbits.SPEN=1;//串行端口使能
 TXSTAbits.TXEN=1;//发送使能
 RCSTAbits.CREN=1;//连续接收
}

void init_lvd()//初始化低电压检测
{
 HLVDCONbits.HLVDL3=0;
 HLVDCONbits.HLVDL2=0;
 HLVDCONbits.HLVDL1=0;
 HLVDCONbits.HLVDL0=0;//低电压检测范围2.18V~2.36V
 INTCONbits.GIE=0;//关闭中断
 PIE2bits.HLVDIE=0;//关闭HLVD中断 
 HLVDCONbits.HLVDEN=1;//HLVD模块使能
 delay(100);
 HLVDCONbits.IRVST=1;//内部参考电压标志位
 delay(100);
 IPR2bits.HLVDIP=1;//HLVD高优先级中断
 PIR2bits.HLVDIF=0;//清零中断标志位
 PIE2bits.HLVDIE=1;//开放HLVD中断 
}

void init_tmr1()
{
 T1CONbits.RD16=1;//使能在16位操作TMR1
 T1CONbits.T1CKPS1=0;
 T1CONbits.T1CKPS0=0;//1:1前分频
 T1CONbits.T1OSCEN=0;//禁止TMR1振荡器
 T1CONbits.TMR1CS=0;//内部时钟F/4,定时方式
 TMR1H=0x00;
 TMR1L=0x00;
 T1CONbits.TMR1ON=0;//停止TMR1
 PIR1bits.TMR1IF=0;
}

void init_tmr2()
{
 T2CONbits.T2OUTPS3=1;
 T2CONbits.T2OUTPS2=1;
 T2CONbits.T2OUTPS1=1;
 T2CONbits.T2OUTPS0=1;//1:16后分频
 T2CONbits.T2CKPS1=1;
 T2CONbits.T2CKPS0=1;//1:16前分频
 PR2=25;//4ms周期=14
 TMR2=0;//定时器清零
 T2CONbits.TMR2ON=0;//停止TMR2
 PIR1bits.TMR2IF=0; 
}

void init_INT()//中断初始化
{
 INTCON=0x00; //关总中断
 RCONbits.IPEN=1;//使能中断优先级
 INTCON2bits.INTEDG0=1;//INT0上升沿中断  
 INTCONbits.INT0IE=1;//开放外部INT0中断,始终是高优先级中断源
 RCONbits.IPEN=1;//使能中断优先级
 IPR1bits.RCIP=0;//USART接收中断低优先级
 PIE1bits.RCIE=1;//USART接收中断使能
 INTCONbits.PEIE=1;//开放外围模块中断
 INTCONbits.GIE=1;//开放中断
}

void init_pin()//引脚初始化,CSN要置高
{
//灯引脚初始化
 TRISAbits.TRISA0=0;
 TRISAbits.TRISA1=0;
 TRISAbits.TRISA2=0;
 TRISAbits.TRISA3=0;
 PORTA=0;
 TRISBbits.TRISB0=1;
 TRISBbits.TRISB1=1;
 TRISBbits.TRISB2=1;
 TRISBbits.TRISB3=0;
 TRISBbits.TRISB4=0;
 TRISBbits.TRISB5=0;
 PORTBbits.RB3=0;
 PORTBbits.RB4=0;
 PORTBbits.RB5=0;
 TRISCbits.TRISC2=0;
 TRISCbits.TRISC3=0;
 TRISCbits.TRISC4=1;
 TRISCbits.TRISC5=0;
 PORTC=0;
 TRISDbits.TRISD4=0;
 TRISDbits.TRISD6=0;//485发送接收切换
 TRISDbits.TRISD7=0;//禁止3161
 PORTD=0;
 PORTCbits.RC2=1;//CSN为高
}

void SPI_read()
{
 PORTCbits.RC2=0;//CSN为低
 s_rnum=0;
 s_rcount=0;
 while(s_rnum<33)
 {
  if(s_rnum==0)
  {
   SSPBUF=0x24;//读RXPAYLOAD命令
   if(SSPCON1bits.WCOL==1) //写冲突检测
   {
    SSPCON1bits.WCOL=0;
   }
   do
   {;}
   while(PIR1bits.SSPIF==0);
   PIR1bits.SSPIF=0;
   if(SSPSTATbits.BF==1)
   {
    uselessdata=SSPBUF;
   }
  }
  if(s_rnum!=0)
  {
   SSPBUF=0xff;
   if(SSPCON1bits.WCOL==1) //写冲突检测
   {
    SSPCON1bits.WCOL=0;
   }
   do
   {;}
   while(PIR1bits.SSPIF==0);
   PIR1bits.SSPIF=0;
   if(SSPSTATbits.BF==1)
   {
    sdata=SSPBUF;
    s_rv[s_bff_num][s_rnum-1]=sdata;
   }
   if(PORTBbits.RB0==0)
   {
    s_rnum=100;
   }
   s_rcount++;
  }
  s_rnum++;
 }
 PORTCbits.RC2=1;//CSN为高
}

void SPI_readcon()
{
 PORTCbits.RC2=0;//CSN为低
 s_rnum=0;
 while(s_rnum<33)
 {
  if(s_rnum==0)
  {
   SSPBUF=0x21;//读CONF命令
   if(SSPCON1bits.WCOL==1) //写冲突检测
   {
    SSPCON1bits.WCOL=0;
   }
   do
   {;}
   while(PIR1bits.SSPIF==0);
   PIR1bits.SSPIF=0;
   if(SSPSTATbits.BF==1)
   {
    uselessdata=SSPBUF;
   }
  }
  if(s_rnum!=0)
  {
   SSPBUF=0xff;
   if(SSPCON1bits.WCOL==1) //写冲突检测
   {
    SSPCON1bits.WCOL=0;
   }
   do
   {;}
   while(PIR1bits.SSPIF==0);
   PIR1bits.SSPIF=0;
   if(SSPSTATbits.BF==1)
   {
    sdata=SSPBUF;
    s_rv[s_bff_num][s_rnum-1]=sdata;
   }
   //if(PORTBbits.RB0==0)
   //{
    //s_rnum=100;
   //}
  }
  s_rnum++;
 }
}
void SPI_write(volatile unsigned char num)
{
 s_tnum=0;
 PORTCbits.RC2=0;//CSN为低
 delay(1);
 while(s_tnum<num)
 {
  SSPBUF=s_tx[s_tnum];
  do
  {;}
  while(PIR1bits.SSPIF==0);
  PIR1bits.SSPIF=0;
  if(SSPSTATbits.BF==1)
  {
   uselessdata=SSPBUF;
  }
  s_tnum++;
 }
 PORTCbits.RC2=1;//CSN为高
}

void init_905_32()
{
 s_tx[0]=0x00;//配置命令,从0字节开始
 s_tx[1]=45;
 s_tx[2]=0x0f;//915MHZ,不重发,10DB
 s_tx[3]=0x44;
 s_tx[4]=0x20;
 s_tx[5]=0x20;
 s_tx[6]=0xe7;
 s_tx[7]=0xe7;
 s_tx[8]=0xe7;
 s_tx[9]=0xe7;
 s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
 mode_905(STBY);
 SPI_write(11);
 init32=1;
}

void init_905_2()
{
 s_tx[0]=0x00;//配置命令,从0字节开始
 s_tx[1]=45;
 s_tx[2]=0x0f;//915MHZ,不重发,10DB
 s_tx[3]=0x44;
 s_tx[4]=0x02;
 s_tx[5]=0x02;
 s_tx[6]=0xe7;
 s_tx[7]=0xe7;
 s_tx[8]=0xe7;
 s_tx[9]=0xe7;
 s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
 mode_905(STBY);
 SPI_write(11);
 init32=0;
}

void init_905_32_920()
{
 s_tx[0]=0x00;//配置命令,从0字节开始
 s_tx[1]=95;//120;
 s_tx[2]=0x0f;//920MHZ,不重发,10DB
 s_tx[3]=0x44;
 s_tx[4]=0x20;
 s_tx[5]=0x20;
 s_tx[6]=0xe7;
 s_tx[7]=0xe7;
 s_tx[8]=0xe7;
 s_tx[9]=0xe7;
 s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
 mode_905(STBY);
 SPI_write(11);
 init32=1;
}

void init_905_2_920()
{
 s_tx[0]=0x00;//配置命令,从0字节开始
 s_tx[1]=95;//120;
 s_tx[2]=0x0f;//870MHZ,不重发,10DB
 s_tx[3]=0x44;
 s_tx[4]=0x02;
 s_tx[5]=0x02;
 s_tx[6]=0xe7;
 s_tx[7]=0xe7;
 s_tx[8]=0xe7;
 s_tx[9]=0xe7;
 s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
 mode_905(STBY);
 SPI_write(11);
 init32=0;
}

void init()
{
 init_lvd();
 init_USART();
 init_pin();
 init_SPI();
 init_INT();
 init_905_32();
 init_tmr1();
 init_tmr2();
 PORTDbits.RD4=0;
 PORTDbits.RD6=1;//485接收
 PORTDbits.RD7=1;//3161使能
}
 
void lighting_led(volatile unsigned char color,unsigned long n)
{
 if(color==RED)
 {
  PORTAbits.RA0=1;
  if(n!=0)
  {
   delay(n);
  PORTAbits.RA0=0;
  }
 }
 if(color==YELLOW)
 {
  PORTAbits.RA1=1;
  if(n!=0)
  {
   delay(n);
  PORTAbits.RA1=0;
  }
 }
 if(color==GREEN)
 {
  PORTAbits.RA2=1;
  if(n!=0)
  {
   delay(n);
  PORTAbits.RA2=0;
  }
 }
 if(color==COMPLETE)
 {
  PORTAbits.RA3=1;
  if(n!=0)
  {
   delay(n);
  PORTAbits.RA3=0;
  }
 }
}

void mode_905(volatile unsigned char mode)
{
 if(mode==STBY)
 {
  PORTBbits.RB3=1;//POWER_UP
  PORTBbits.RB5=0;//TXEN   进入STBY模式
  PORTBbits.RB4=0;//TRX_EN
  mode905=STBY;
  delay(1);
 }
 if(mode==TX_MODE)
 {
  PORTBbits.RB3=1;//POWER_UP
  PORTBbits.RB5=1;//TXEN   进入TX模式
  PORTBbits.RB4=1;//TRX_EN
  mode905=TX_MODE;
  delay(15);
 }
 if(mode==RX_MODE)
 {
  PORTBbits.RB3=1;//POWER_UP
  PORTBbits.RB5=0;//TXEN   进入RX模式
  PORTBbits.RB4=1;//TRX_EN
  mode905=RX_MODE;
  delay(15);
 }
}

volatile unsigned char TX_905(volatile unsigned char num)//905发送,CD为高,返回5
{                              //要发送的数据在USART接收时存入发送缓冲区tx905bff[32]
 volatile unsigned char tnum;
 tnum=0;
 if(PORTBbits.RB2==1)
 {
  return 5;
 }
 else
 {
  mode_905(STBY);
  s_tx[0]=0x22;//写地址命令
  s_tx[1]=0xe7;
  s_tx[2]=0xe7;
  s_tx[3]=0xe7;
  s_tx[4]=0xe7;
  SPI_write(5);
  while(tnum<num)
  {
   s_tx[tnum+1]=tx905bff[tnum];
   tnum++;
  }
  s_tx[0]=0x20;//写数据命令
  SPI_write(num+1);
  mode_905(TX_MODE);
  do
  {;}
  while(PORTBbits.RB0==0);
  _asm
   nop
   nop
  _endasm
  mode_905(STBY);
 }
 return 0;
}

void RX_905()//未加CRC错误检测识别机制
{
 if(mode905!=RX_MODE)
 {
  mode_905(RX_MODE);
 }
 if(PORTBbits.RB0==1)
 {
  rved=1;
  SPI_read();
 }
}

void TX_USART()
{
 //INTCONbits.INT0IE=0;//关外部INT0中断
 PORTDbits.RD6=0;//485发送
 PORTDbits.RD4=1;
 u_tnum=0;
 while(u_tnum<s_rv[s_bff_num_temp][1])
 {
  if(PIR1bits.TXIF==1)
  {
   TXREG=s_rv[s_bff_num_temp][u_tnum+2];
   u_tnum++;
  }
 } 
 if(stxing==1) 
  stxing=0;
 if(sstxing==1)
  sstxing=0;
 PORTDbits.RD6=1;
 PORTDbits.RD4=0;
 //INTCONbits.INT0IE=1;//开外部INT0中断
}

unsigned char RX_USART()
{
 if(PIR1bits.RCIF==1)//等待接收完成
 {
  if(RCSTAbits.FERR==1)
  {
   uselessdata=RCREG;
   return 5;
  }
  else
  {
   if(PIR1bits.RCIF==1)
   {
    udata=RCREG;//接收数据
     u_rv[u_bff_num][u_rnum]=udata;
     u_rnum++;
     u_rcount[u_bff_num]=u_rnum;

   }
  }
 }
}

void turn_flash_led()
{
  init_pin();
  delay(15000);
  PORTA=0;
  PORTAbits.RA0=1; 
  delay(15000);
  PORTAbits.RA0=0;
  PORTAbits.RA1=1;
  delay(15000);
  PORTAbits.RA1=0;
  PORTAbits.RA2=1;
  delay(15000);
  PORTAbits.RA2=0;
  PORTAbits.RA3=1;
  delay(15000);
}

void num_led(unsigned char x)
{
 if(x==1)
 {
  PORTA=0x08;
  delay(30000);
  PORTAbits.RA3=0;
 }
 if(x==2)
 {
  PORTA=0x04;
  delay(30000);
  PORTAbits.RA2=0;
 }
 if(x==3)
 {
  PORTA=0x0c;
  delay(30000);
  PORTAbits.RA2=0;
  PORTAbits.RA3=0;
 }
 if(x==4)
 {
  PORTA=0x02;
  delay(30000);
  PORTAbits.RA1=0;
 }
 if(x==5)
 {
  PORTA=0x0A;
  delay(30000);
  PORTAbits.RA1=0;
  PORTAbits.RA3=0;
 } 
}

void T905()
{
 INTCONbits.INT0IE=0;//关闭外部INT0中断,防止接收ARQ信息与接收真正的数据冲突
 cd=0xff;
 re_T=0;
 while(re_T<2)
 {
  wnum=0;
  if(re_T==0)
  {
   if(t_package_num!=5)
   {
    t_package_num++;
   }
   else
   {
    t_package_num=1;
   }
   tx905bff[0]=t_package_num;
   tx905bff[1]=u_rcount[u_bff_num_temp];
   while(wnum<u_rcount[u_bff_num_temp])
   {
    tx905bff[wnum+2]=u_rv[u_bff_num_temp][wnum];
    wnum++;
   }   
  }
  else//if(re_T==0)
  {
   //PORTA=0X01;
   if(f920==1)
   {
    init_905_32_920();
   }
   else
   {
    init_905_32();
   }
   ///*
   tx905bff[0]=t_package_num;
   tx905bff[1]=u_rcount[u_bff_num_temp];
   while(wnum<u_rcount[u_bff_num_temp])
   {
    tx905bff[wnum+2]=u_rv[u_bff_num_temp][wnum];
    wnum++;
   } //*/  
  }//if(re_T==0)
  do
  {
   cd=TX_905(32);
   if(cd==5)
   {
    //lighting_led(COMPLETE,3000);
   }

⌨️ 快捷键说明

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