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

📄 nrf.c

📁 atmega128单片机上实现的nrf905无线收发程序
💻 C
字号:
/***************************************
*2008,浙江工业大学信息与控制研究所
*All rights reserved
*
*文件名称:nrf.c
*摘    要:NRF905相关的子程序实现
*
*当前版本:1.1
*作    者:王微
*完成日期:2008.4.28
****************************************/
#include<macros.h>
#include<iom128v.h> 

#include"spi.h"
#include"common.h"
#include"nrf.h"


unsigned char  data_conf[10];
//unsigned char  send_addr[4]={0x13,0x65,0x13,0x65};                    //4字节的发送地址
//unsigned char  broad_addr[4]={0xff,0xff,0xff,0xff};                   //4字节的广播地址
//unsigned char  receive_addr[4]={0x65,0x13,0x65,0x13};                 //4字节的接收地址a513d36a
//unsigned char  receive_data[PACKAGE_LENGTH];                          //PACKAGE_LENGTH字节的接收数据缓存区
//unsigned char  transmit_data[PACKAGE_LENGTH];                         //PACKAGE_LENGTH字节的发送数据缓存区



/**************************************************
函数功能:初始化nRF905,
输入参数:无
输出参数:无
**************************************************/
void init_905()
{
	DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
	DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入 
	
	PORTE |=(1<<PWR_UP);              //905上电
	PORTE |=(1<<CSN);                //CSN引脚置位,停止SPI操作,
	
	PORTB |=1<<SCK;                    // Spi clock line init high	
	   
	PORTE &=~(1<<TX_EN);                 
	PORTB &=~(1<<TRX_CE);               // Set nRF905 in standby mode

	Delay3ms();
}

/**************************************************
函数功能:设置配置字
输入参数:905的接收地址
输出参数:无
**************************************************/
void set_confword(unsigned char*r_addr)
{ 
 
  data_conf[0]=0x01;                  //
  data_conf[1]=0x0c;                  //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
  data_conf[2]=0x44;                  //4字节的接收地址和发送地址
               
  data_conf[3]=PACKAGE_LENGTH;         //RX有效数据长度
  data_conf[4]=PACKAGE_LENGTH;         //TX有效数据长度

  data_conf[5]=r_addr[0];                //5~8为RX地址
  data_conf[6]=r_addr[1];                                   
  data_conf[7]=r_addr[2];
  data_conf[8]=r_addr[3];
  
  data_conf[9]=0xd8;
 
}

/************************************************************
函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
输入参数:无
输出参数:无
*************************************************************/
void send_conf()
{
  unsigned char  i;					
  PORTE &=~(1<<CSN);			// Spi enable for write a spi command
  SpiWrite(WC);				// Write config command写放配置命令
  for (i=0;i<10;i++)	// Write configration words  写放配置字
  {
	SpiWrite(data_conf[i]);
  }
  PORTE |=(1<<CSN);						// Disable Spi
}

/***************************************************************
函数功能:把905配置成发送模式
输入参数:无
输出参数:无
***************************************************************/
void set_Tmode()
{	
	PORTE |=(1<<PWR_UP);              //905上电
	PORTE |=(1<<TX_EN); 
	PORTB &=~(1<<TRX_CE);
	Delay650us(); 					// delay for mode change(>=650us)
}

/***************************************************************
函数功能:把905配置成接收模式
输入参数:无
输出参数:无
***************************************************************/
void set_Rmode()
{
	PORTE |=(1<<PWR_UP);              //905上电
	PORTE &=~(1<<TX_EN); 
	PORTB |=(1<<TRX_CE);
	Delay650us(); 					// delay for mode change(>=650us)				
}

/***************************************************************
函数功能:把905配置成掉电和SPI模式(节省能量)
输入参数:无
输出参数:无
***************************************************************/
void set_Powerdownmode()
{
    PORTE &=~(1<<PWR_UP);                   //掉电
	Delay650us(); 					// delay for mode change(>=650us)	
}

/***************************************************************
函数功能:把905配置成STANDBY和SPI模式(节省能量)
输入参数:无
输出参数:无
***************************************************************/
void set_STmode()
{
    PORTE |=(1<<PWR_UP);              //905上电
	PORTB &=~(1<<TRX_CE); 
	Delay3ms(); 					// delay for mode change(>=650us)	
}



/**************************************************************************
函数功能:通过SPI设定905的发送地址
输入参数:发送地址数据的首地址
输出参数:无
**************************************************************************/
void set_Taddr(unsigned char*addr)
{
    unsigned i;
	PORTE &=~(1<<CSN);						// Spi 使能
	SpiWrite(WTA);				                // Write address command
	for (i=0;i<4;i++)			                // Write 4 bytes address
	{
		SpiWrite(addr[i]);
	}	
	PORTE |=(1<<CSN);						   // 禁止Spi 
} 

/**************************************************************************
函数功能:905发送一个数据包
输入参数:要发送的数据包的首地址
输出参数:无
**************************************************************************/
void TxPacket(unsigned char*send_d)
{
	unsigned char temp,i;
	//Config905();				
	PORTE &=~(1<<CSN);			// CSN置零,Spi 使能
	SpiWrite(WTP);				  // 写SPI命令
//    SpiWrite(serial);
	for (i=0;i<PACKAGE_LENGTH;i++)
	{	  
	  SpiWrite(*(send_d+i));		// 写21字节的TX数据
	}
	PORTE |=(1<<CSN);						// 禁止Spi						
	//
	PORTB |=(1<<TRX_CE); 					// Set TRX_CE high,开始TX数据发送
	                                   
	Delay650us();	                             // 形成脉冲
	PORTB &=~(1<<TRX_CE); 				// Set TRX_CE low,进入standby模式
}

/***************************************************************************
函数功能:把905接收到的一个数据包放到CPU的接收缓冲区
输入参数:接收缓冲区的首地址
输出参数:无
***************************************************************************/
void RxPacket(unsigned char*received_d)
{
	unsigned char  i;
	PORTB &=~(1<<TRX_CE); 					// 把nRF905 设置成standby,不再接收无线数据	
	PORTE &=~(1<<CSN);			// Spi enable for write a spi command,Spi 使能
	SpiWrite(RRP);				  // Read payload command	
	for (i=0;i<PACKAGE_LENGTH;i++)
	{
		*(received_d+i)=SpiWrite(0x00);			// Read data and save to buffer		
	}
	PORTE |=(1<<CSN);						// 禁止Spi
    Delay650us();
	PORTB |=(1<<TRX_CE);             //把nRF905 设置成RX mode
/*	if(DR)
	{
	  init_905();
      set_confword(broad_addr);
      send_conf();
      set_Rmode();
//	  return 0;
	}
	else{
	  
   //   return ack;
    }		*/		
}

⌨️ 快捷键说明

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