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

📄 nrf905_rx.c

📁 NRF905的驱动
💻 C
字号:
#include <at89x52.h>
#include <stdio.h>
#include<intrins.h>
#define W_TX_PAYLOAD 0X20//写发射数据命令
#define W_CONFIG 0X00//写配置寄存器命令
#define R_CONFIG 0X10//读配置寄存器命令
#define R_RX_PAYLOAD 0X24//读接受寄存器数据命令
#define R_TX_PAYLOAD 0X21//读发射寄存器数据命令
#define W_TX_ADDRESS 0X22//写发射数据地址命令

sbit TX_EN=P3^7;
sbit TRX_CE=P1^7;
sbit PWR_UP=P1^6;
sbit CD=P3^4;
sbit AM=P3^2;
sbit DR=P3^3;
sbit MISO=P1^5;
sbit MOSI=P1^4;
sbit SCK=P1^3;
sbit CSN=P1^2;
unsigned char state[8]={0,1,2,3,4,5,6,7};
unsigned char code p[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

unsigned char stat=8;






void delay(unsigned int t)

  {
       while(--t);
  }







void nrf905_standby_spi_mode()//待机和SPI编程模式

  {
      PWR_UP=1;
      TRX_CE=0;
  }






void nrf905_tx_mode()//发射模式
  {
      PWR_UP=1;
      TRX_CE=1;
      TX_EN=1;

  }





void nrf905_rx_mode()//接收模式
  {
      PWR_UP=1;
      TRX_CE=1;
      TX_EN=0;     
  }







void spi_write_byte(unsigned char dat)//向SPI写入一个字节数据
  {
    unsigned char i=0;
      for(i=0;i<8;i++)
         {              
            MOSI=((dat>>(7-i))&0x01);
            SCK=1;
            _nop_();
            SCK=0;
         }
  }







unsigned char spi_read_byte()//从SPI读取一个字节数据
{
    unsigned char i=0,state=0;
        for(i=0;i<8;i++)
         {
            state=state<<1; 
            if(MISO) state++;
            SCK=1;
            _nop_();
            SCK=0; 
         }
    return  state;

}









void nrf905_write_config()//配置寄存器初始化
  {
       unsigned char i=0;
       CSN=0;

       spi_write_byte(W_CONFIG);
       spi_write_byte(0x5f);
       spi_write_byte(0x0d);
       spi_write_byte(0x44);
       spi_write_byte(0x20);
       spi_write_byte(0x20);
       spi_write_byte(0xe7);
       spi_write_byte(0xe7);
       spi_write_byte(0xe7);
       spi_write_byte(0xdf);
       CSN=1;


   }










void nrf905_write_txaddr_txload(unsigned char txaddr,unsigned char txload)//写入发射数据地址及其数值
  {
       unsigned char i=0;
       CSN=0;//写地址开始
       spi_write_byte(W_TX_ADDRESS);      
         for(i=0;i<4;i++)
           {
              spi_write_byte(txaddr);
           }
       CSN=1;//写地址结束
       delay(100);

       CSN=0;//写数据开始
       spi_write_byte(W_TX_PAYLOAD);
        for(i=0;i<32;i++)
       spi_write_byte(txload); 
       CSN=1;


  }









void nrf905_tx(unsigned char txaddress,unsigned txpayload)//发射数据最终子程序
  {
       nrf_standby_spi_mode();//进入SPI编程模式
       nrf905_write_txaddr_txload(txaddress,txpayload);//写入发射数据地址及其数值
       nrf905_tx_mode();
       while(DR==0);//等待数据发送结束
       nrf_standby_spi_mode();//转入STANDBY和SPI编程模式

  }








void nrf905_read_trxdata(unsigned char *trx_dat0,unsigned char *trx_dat1,unsigned char *trx_dat2,unsigned char *trx_dat3,unsigned char PAYLOAD)//接受数据子程序
  {
      unsigned char i=0;
      nrf905_standby_spi_mode();//进入SPI编程模式
      CSN=0;
      spi_write_byte(PAYLOAD);
        for(i=0;i<8;i++)
           {
              *(trx_dat0+i)=spi_read_byte();
           }
        for(i=0;i<8;i++)
           {
              *(trx_dat1+i)=spi_read_byte();
           }
        for(i=0;i<8;i++)
           {
              *(trx_dat2+i)=spi_read_byte();
           }
        for(i=0;i<8;i++)
           {
              *(trx_dat3+i)=spi_read_byte();
           }
     CSN=1;
  }








void nrf905_state_read()//读寄存器初始值
  {
      unsigned char i=0;
      nrf905_standby_spi_mode();
      CSN=0;
      spi_write_byte(R_CONFIG);
   
       for(i=0;i<8;i++)
       state[i]=spi_read_byte();

       stat=spi_read_byte();
      CSN=1;
    
  }







void nrf905_ini()               //905初始化程序,STANDBY和SPI编程模式
  {
    SCK=0;
    nrf905_standby_spi_mode();
    
    nrf905_write_config();//配置寄存器初始化
  }







void send_com_data()                //向串口发送config数据
  {
      unsigned char i=0;
      SBUF='c';while(TI==0);TI=0;
      SBUF='o';while(TI==0);TI=0;
      SBUF='n';while(TI==0);TI=0;
      SBUF='f';while(TI==0);TI=0;
      SBUF='i';while(TI==0);TI=0;
      SBUF='g';while(TI==0);TI=0;
      SBUF=':';while(TI==0);TI=0;//发送字符config:
          for(i=0;i<8;i++)//发送回读数据
               {
                  SBUF=p[state[i]/16];
                  while(TI==0);
                  TI=0; 
                  SBUF=p[state[i]%16];
                  while(TI==0);
                  TI=0;   
                  SBUF=' ';
                  while(TI==0);
                  TI=0;     
               }

     SBUF=p[stat/16];while(TI==0);TI=0; 
     SBUF=p[stat%16];while(TI==0);TI=0;   
     SBUF=' ';while(TI==0);TI=0; 



  }







void send_com_trxdata(unsigned char *rx_dat0,unsigned char *rx_dat1,unsigned char *rx_dat2,unsigned char *rx_dat3)    //向串口发送接受到的数据
  {
      unsigned char i=0;
      SBUF='r';while(TI==0);TI=0;
      SBUF='x';while(TI==0);TI=0;
      SBUF='d';while(TI==0);TI=0;
      SBUF='a';while(TI==0);TI=0;
      SBUF='t';while(TI==0);TI=0;
      SBUF='a';while(TI==0);TI=0;
      SBUF=':';while(TI==0);TI=0;//发送字符rxdata:
          for(i=0;i<8;i++)//发送回读数据
               {
                  SBUF=p[(*(rx_dat0+i))/16];
                  while(TI==0);
                  TI=0; 
                  SBUF=p[(*(rx_dat0+i))%16];
                  while(TI==0);
                  TI=0;   
                  SBUF=' ';
                  while(TI==0);
                  TI=0;     
               }
          for(i=0;i<8;i++)//发送回读数据
               {
                  SBUF=p[(*(rx_dat1+i))/16];
                  while(TI==0);
                  TI=0; 
                  SBUF=p[(*(rx_dat1+i))%16];
                  while(TI==0);
                  TI=0;   
                  SBUF=' ';
                  while(TI==0);
                  TI=0;     
               }
          for(i=0;i<8;i++)//发送回读数据
               {
                  SBUF=p[(*(rx_dat2+i))/16];
                  while(TI==0);
                  TI=0; 
                  SBUF=p[(*(rx_dat2+i))%16];
                  while(TI==0);
                  TI=0;   
                  SBUF=' ';
                  while(TI==0);
                  TI=0;     
               }
          for(i=0;i<8;i++)//发送回读数据
               {
                  SBUF=p[(*(rx_dat3+i))/16];
                  while(TI==0);
                  TI=0; 
                  SBUF=p[(*(rx_dat3+i))%16];
                  while(TI==0);
                  TI=0;   
                  SBUF=' ';
                  while(TI==0);
                  TI=0;     
               }

  }










void main(void)
{
    unsigned char a=0,i=0;
    unsigned char trx_data0[8]={0,0,0,0,0,0,0,0};
    unsigned char trx_data1[8]={0,0,0,0,0,0,0,0};
    unsigned char trx_data2[8]={0,0,0,0,0,0,0,0};
    unsigned char trx_data3[8]={0,0,0,0,0,0,0,0};
    SCON=0x50;  //模式1
    TMOD=0x20;  //定时模式2


     //=====19200=======
     PCON=0x00;   //波特率9600BPS,晶振11.0592MHZ
     TH1=0xFD;  //
     TL1=0xFD;  //计数器初值
     //================

     TI = 0;//串行中断标志位清零
     TR1 = 1;//打开计数器1  
     nrf905_ini();      //nrf905上电,进入STANDBY和SPI编程模式,寄存器配置初始化

   while(1)        //自由收发段函数,自己任意更改
   {    
          nrf905_rx_mode();
          while(DR==0);


              
          nrf905_state_read();

          send_com_data();
          //nrf905_write_txaddr_txload(0xe7,0x55);
          nrf905_read_trxdata(trx_data0,trx_data1,trx_data2,trx_data3,R_RX_PAYLOAD);

          send_com_trxdata();

                  

     
   }
}

⌨️ 快捷键说明

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