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

📄 f211.c

📁 采用无线收发模块at86rf211的一个程序开发包,单片机采用Cygnal 8051F015,希望能对您有所帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
void rf211_init()                                       
{
	rf211Trx_Register_Wr(TRX_F0_ADDRESS,F0_CODE,0X20);                         //设置F0频率,433.9+0.01MHz
	rf211Trx_Register_Wr(TRX_F1_ADDRESS,F1_CODE,0X20);                         //设置F1频率,433.9-0.01MHz   
    rf211Trx_Register_Wr(TRX_F2_ADDRESS,F2_CODE,0X20);                         //设置F2频率,433.9MHz       

    rf211Trx_Register_Wr(TRX_F3_ADDRESS,F3_CODE,0X20);                         //设置F3频率
    rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,CTRL1_CODE,0X20);                   //设置CTRL1主控寄存器
	rf211Trx_Register_Wr(TRX_DTR_ADDRESS,DTR_CODE,0X06);                       //设置DTR(data slicer input offset,left_snap)
    rf211Trx_Register_Wr(TRX_WUC_ADDRESS,WUC_CODE,0X20);                       //设置WUC(WAKE_UP 控制寄存器)

    rf211Trx_Register_Wr(TRX_WUR_ADDRESS,WUR_CODE,0X12);                       //设置WUR(WAKE_UP 数据速率寄存器
    rf211Trx_Register_Wr(TRX_WUA_ADDRESS,WUA_CODE,0X19);                       //设置WUA(WAKE_UP 地址寄存器
	rf211Trx_Register_Wr(TRX_CTRL2_ADDRESS,CTRL2_CODE,0X20);                   //设置CTRL2控制寄存器
}


//------------------------------------------------------------------------------//
//    trx_addr:寄存器地址    trx_code:寄存器编码值                              //
//------------------------------------------------------------------------------//  
void rf211Trx_Register_Wr(unsigned char trx_addr,unsigned long trx_code,unsigned char trx_bits)
{
    TRX_SCK=0;                                                                  //置rf211的CLK线为低电平
	TRX_SLE=0;                                                                  //置rf211的SLE线为低电平

    rf211Send_Trx_Addr(trx_addr);                                               //写寄存器地址
    rf211Send_Trx_High();                                                       //设置R/W位为高,即为写状态
	rf211Send_Trx_Data(trx_code,trx_bits);	                                    //写如配置该寄存器的参数数据
    
	bit_delay();
    TRX_SLE=1;                                                                  //置rf211的SLE线为高,不允许对rf211进行读写操作
	bit_delay();
	bit_delay();
    bit_delay();
}


//------------------------------------------------------------------------------//
//    trx_addr:寄存器地址    trx_code:寄存器编码值                              //
//------------------------------------------------------------------------------//  
unsigned long rf211Trx_Register_Rd(unsigned char trx_addr,unsigned char trx_bits)
{
    unsigned long r_code=0;
    TRX_SCK=0;                                                                  //置rf211的CLK线为低电平
	TRX_SLE=0;                                                                  //置rf211的SLE线为低电平
    rf211Send_Trx_Addr(trx_addr);                                               //写寄存器地址
    rf211Send_Trx_Low();                                                        //设置R/W位为低,即为读状态
	r_code=rf211Read_Trx_Data(trx_bits);	                                    //写如配置该寄存器的参数数据
    TRX_SLE=1;                                                                  //置rf211的SLE线为高,不允许对rf211进行读写操作
    bit_delay();
	bit_delay();
	return(r_code);
}


//------------------------------------------------------------------------------//
//     写积存器地址 		  								    				//
//------------------------------------------------------------------------------//
void rf211Send_Trx_Addr(unsigned char trx_addr)
{
    unsigned char inde=0;
    trx_addr=trx_addr<<4;                                                       //取低4位数据
	for(inde=0;inde<4;inde++)
	{
	   if((trx_addr&0x80)==0x80)                                                //如果为高输出1
	   	       rf211Send_Trx_High();
       else    rf211Send_Trx_Low();  
	   trx_addr=trx_addr<<1;                                                    //左移一位
	} 
}


//------------------------------------------------------------------------------//
//     trx_code:寄存器编码值 trx_bits:传输位数                                 //
//------------------------------------------------------------------------------//
void  rf211Send_Trx_Data(unsigned long  trx_code,unsigned char trx_bits)
{
	unsigned char chbits=0;
    for(chbits=0;chbits<trx_bits;chbits++)                                       //写指定位数
    {
	  if ((trx_code&0x80000000)==0x80000000)
	       rf211Send_Trx_High();
      else rf211Send_Trx_Low();	   	
      trx_code=trx_code<<1;                                                      //左移一位
	}          	
}


//-------------------------------------------------------------------------------//
//    从指定寄存器中读取设定位数的数据                                           //
//-------------------------------------------------------------------------------//
unsigned long rf211Read_Trx_Data(unsigned char trx_bits)
{
       unsigned char inde=0;
	   unsigned long read_code=0;          
	   for (inde =0;inde<trx_bits;inde++)
	   {
	      TRX_SCK=1;
	      if (TRX_SDATA==1)                                                       //为高
            read_code=read_code|0x80000000; 
          else read_code=read_code|0x00000000; 
	      read_code=read_code>>1;                                                 //右移一位
		  bit_delay();
		  TRX_SCK=0;
		  bit_delay();
       }
	   return(read_code);
}


//-------------------------------写入高电平-------------------------------------//
void rf211Send_Trx_High()
{
      TRX_SDATA=1;
      bit_delay();
      TRX_SCK=1;	 
      bit_delay();
      TRX_SCK=0;
      bit_delay();
}

//-------------------------------写入低电平-------------------------------------//
void rf211Send_Trx_Low()
{
     TRX_SDATA=0;
	 bit_delay();
     TRX_SCK=1;
	 bit_delay();
	 TRX_SCK=0;
     bit_delay();
}

void Timer2_Isr(void) interrupt 5
{
	 //DATAMSG =~DATAMSG;
     //Timer2_count++;
}


void Int0_Isr(void) interrupt  0
{
     RFLAG=1; 
}

void timer0_Isr(void) interrupt 1
{
     //DATAMSG=~DATAMSG;
     TH0     = 0XF8;                                                            //定时100us
     TL0     = 0X43;
	 timer0_count++;   
	 level_count++;
}

void Uart_Isr(void) interrupt  4
{
  if(RI)                                                                         //开始接收数据
  {
     RI=0;
	 nFlag_RXSUCCESS=0;	
	 INPUT_BUF[nRX_INDEX] = SBUF;	                                             //从SBUF寄存器里读出数据,放到接收数据的BUFFER里
	 if (nRX_INDEX>=1)  
	 if((INPUT_BUF[nRX_INDEX-1])&&(INPUT_BUF[nRX_INDEX]))
	 {
	    nFlag_RXSUCCESS=0x55;                                                    //表示数据接收完毕,发送消息等待处理接收数据
 		nLen_Rx_Data=nRX_INDEX+1;
	 }
     nRX_INDEX++;
  }
  else if (TI)                                                                   //开始发送数据
  {
     TI=0;                                                                       //清发送标志位                             
	 if (nLen_Tx_Data!=0)
	 {
	    SBUF =Tx_Data[nTx_Index++];
		if (nTx_Index>=nLen_Tx_Data)                                             //判断缓冲区的数据是否发送完毕
		{
	        nTx_Index   =0;
			nLen_Tx_Data=0;
			SendEndflag=1;
		}
	 }
	 else SendEndflag=1;
  }
}


//-------------------------------------------------------------------------------//
//                   -------配置为传输模式-------            					 //
// TRANSMITMODE_CODE=0xFC           //0xDC                                             //
// 意义:    PDN=1(RF211激活)                                                    //
//           RXTX=1;(传输模式)                                                   //
//           DATACLK=1;(DATACLK引脚无信号)                                       //
//           TXLCOCK=1;(PLL锁存才能传输)                                         //
//           PAPDAN=1; (TX放大器激活)                                            //
//           WUEN=1;   (激活唤醒功能)                                            //
//           LANGSEL=0;(最小增益)      											 //
//           MVCC=0;   (RSSI电压测量)                                            //
//-------------------------------------------------------------------------------//
void  Make_Transmit_Mode()
{
      //DATAMSG=0;    
	  rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,TRANSMITMODE_CODE,0X08);            //设置CTRL1主控寄存器
}

//-------------------------------------------------------------------------------//
//                    -------配置为接收模式-------                               //
// TRANSMITMODE_CODE=0xB4     //0x94                                                   //
// 意义:    PDN=1(RF211激活)                                                    //
//           RXTX=0;(接收模式)                                                   //
//           DATACLK=1;(DATACLK引脚无信号)                                       //
//           TXLCOCK=1;(PLL锁存才能传输)                                         //
//           PAPDAN=0; (TX放大器无效)                                            //
//           WUEN=1;   (激活唤醒功能)                                            //
//           LANGSEL=0;(最小增益)      											 //
//           MVCC=0;   (RSSI电压测量)                                            //
//-------------------------------------------------------------------------------//
void  Make_Receive_Mode()
{
      rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,RECEIVERMODE_CODE,0X08);           //设置CTRL1主控寄存器
}

//-------------------------------------------------------------------------------//
//                     -------配置成为唤醒模式------							 //
//  WAKEWORD_CODE=0x80                                                           //
//  意义:	WUE=1(使能唤醒功能)													 //
//          DATA=0(消息没有数据段)												 //
//          STOP=0(固定数据长度,数据长度通过DATL设置,可从1到32)				 //
//          DATL=00000(数据长度,1位---最小值)									 //
//  ************************************************************				 //
//    																			 //
//  SLEEPMODE_CODE=0x34 //0x14      设置成为休眠模式,RF211定时扫描RF信号              //
//  意义:  PDN=0     (RF211工作于掉电模式,只有串行接口处于激活状态)		     //
//          RXTX=0    (处于接收模式)  									    	 //
//          DATACLK=1 (DATACLK引脚没有信号)									     //
//          TXLOCK=1  (仅PLL锁定时传输)    										 //
//          PAPDN=0   (TX电源放大器处于掉电模式)								 //
//          WUEN=1    (唤醒功能激活,依赖于WAKE_UP控制寄存器中的内容)			 //
//          LANGSEL=0 (最小增益)												 //
//          MVCC=0    (RSSI电压测量,这个值存储在STAT寄存器的MRSSI中)            //
//-------------------------------------------------------------------------------//
void  Make_Wakeup_Mode()
{
     rf211Trx_Register_Wr(TRX_WUC_ADDRESS,WAKEWORD_CODE,0X08);                   //设置WUC寄存器
     rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,SLEEPMODE_CODE,0X08);                //设置CTRL1主控寄存器
}


//-------------------------------------------------------------------------------//
//                       ------读wakeup 数据寄存器-------                        //                       
//-------------------------------------------------------------------------------//
void Read_Wakeup_Data()
{
   unsigned long wakeup_d=0;
   wakeup_d=rf211Trx_Register_Rd(TRX_WUD_ADDRESS,0x02);                          //从WUD中读取数据,WAKE_UP消息数据
}


//-------------------------------------------------------------------------------//
//                       组织传输原始数据                                        //
//-------------------------------------------------------------------------------//
void  Transmit_Data_Dispose(char *In_Buf,unsigned int nLen)
{
    unsigned int nInde=0;
	char   CheckSum=0;
    nLen_Tx_Data=0;
	for (nInde=0;nInde<nLen;nInde++)
	{
	  OUTPUT_BUF[nInde]=In_Buf[nInde];
	  if (nInde>0) CheckSum=In_Buf[nInde-1]^In_Buf[nInde];                      //校验和为各字节分别相异或后的结果
      nLen_Tx_Data++;
	}	
    OUTPUT_BUF[nInde++]=CheckSum;                                               //将校验和压入缓冲区
    OUTPUT_BUF[nInde++]='\r';    
	OUTPUT_BUF[nInde++]='\n';
	nLen_Tx_Data=nLen_Tx_Data+1;       
}


//-----------------------------------------------------------------------------//
//    监测接收的数据是否正确,如果正确发送接收成功消息Ok_Message			   //
//                            否者发送接收失败消息Fail_Message				   //
//-----------------------------------------------------------------------------//
bit  Receive_Data_CheckProcess()
{
   unsigned char CheckSum=0;
   unsigned int  nInde=0;
   for (nInde=1;nInde<nLen_Rx_Data-3;nInde++)
   {
       CheckSum=INPUT_BUF[nInde-1]^INPUT_BUF[nInde];
   } 
   if (CheckSum=INPUT_BUF[nInde-3]) return(1);                                  //比较校验和,如果相等返回1,否则返回0
   else return(0);
   nLen_Rx_Data=0;                                                              //清接收数据长度
}

⌨️ 快捷键说明

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