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

📄 nrf2401.c

📁 在KEILC51中NRF2401项目开发成功
💻 C
字号:
//====================================================================================
//文 件 名: nRF2401.c
//功能描述: nRF2401的驱动程序
//维护记录: 2008年10月26
//====================================================================================

#include <string.h>
#include <AT89X52.h>
#include <intrins.h>
#include "nRF2401.H"


sbit	PWR  	=	P0^0;
sbit	CE	    =	P0^1;
sbit	CS	    =	P0^2;
sbit	DR1	    =	P0^3;
sbit	CLK1	=	P0^4;
sbit	DATA	=	P0^5;
sbit	cs_test	 =	P0^6;


const unsigned char InitData[15] = 				// nRF2401 控制字 15 Byte
{
	0x08,										// 通道二接收数据宽度(bit)
	0x08,										// 通道一接收数据宽度(bit)
	0x00,										// 通道二地址(A24)
	0x00,										// 通道二地址(A23)
	0x00,										// 通道二地址(A22)
	0x00,										// 通道二地址(A21)
	0x01,										// 通道二地址(A20)
	0x00,										// 通道一地址(A14)
	0x00,										// 通道一地址(A13)
	0x00,										// 通道一地址(A12)
	0x00,										// 通道一地址(A11)
	0x01,										// 通道一地址(A10)
	0x83,										// b7~b2:接收地址宽度,和发送端一致,不超过40bit;
												// b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no)
	0x6f,										// b15:接收通道选择(0-通道1;1-通道1和2)
												// b14:收发模式(0-Direct模式,1-ShockBurst模式)
												// b13:波特率选择(0-250Kbps;1-1Mbps)
												// b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M)
												// b9~b8:发射功率(11-0db)																
	0x65										// b7~b1:发射频率配置
												// b0:收发控制(0-发送;1-接收)

};
unsigned char AddrBuffer[5];						// 地址寄存器
unsigned char AddrByteCnt;						// 地址Byte数

/******************************************************************************
void nRF2401_ON();								// nRF2401A上电
void nRF2401_OFF();								// nRF2401A掉电
void nRF2401_Initial();							// nRF2401A初始化
void nRF2401_WriteCommand();					// nRF2401A写命令字
void nRF2401_WriteByte(unsigned char uiData);	// 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData);	// 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned char uiMode);			// 切换nRF2401A收/发模式
void nRF2401_SendByte(unsigned char TxData);	
												// 将字节数据写入nRF2401A
void nRF2401_SendWord(unsigned int TxData);	
												// 将字数据写入nRF2401A
void nRF2401_SendBuffer_Byte(unsigned char TxData[],unsigned char DataByte);	
												// 将数组数据写入nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int DataWord);	
												// 将数组数据写入nRF2401A
unsigned int  nRF2401_RxStatus();				// 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned char RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned char Address[],unsigned char AddrByte);
												// 设置目标nRF2401A的地址
void Delay_Us(unsigned int TimeCnt);								// 延时(uS)

 void nRF2401_Str(unsigned char *arr);
  *******************************************************************************/
//=============================================================
// 语法格式:	void nRF2401_Initial(void)
// 实现功能:	nRF 初始化
// 参数:		无
// 返回值:		无
//=============================================================
void nRF2401_Initial(void)
{

   PWR=0;
   CE=0;
   CS=0;
   DR1=0;
   CLK1=0;
   DATA=0;
   cs_test=1;
	nRF2401_ON();
	Delay_Us(3000);
	nRF2401_WriteCommand();						// 向nRF2401A写命令字
	Delay_Us(300);
}

//=============================================================
// 语法格式:	void nRF2401_ON(void)
// 实现功能:	nRF 上电
// 参数:		无
// 返回值:		无
//=============================================================
void nRF2401_ON(void)
{

PWR=1;



}

//=============================================================
// 语法格式:	void nRF2401_OFF(void)
// 实现功能:	nRF 掉电
// 参数:		无
// 返回值:		无
//=============================================================
void nRF2401_OFF(void)
{

PWR=0;
}

//=============================================================
// 语法格式:	void nRF2401_WriteCommand(void)
// 实现功能:	nRF 写命令字
// 参数:		无
// 返回值:		无
//=============================================================
void nRF2401_WriteCommand(void)
{
	unsigned int i;

	  CE=0;
	  CS=1;

	Delay_Us(5);
	for(i=0; i<15; i++)
	{
		nRF2401_WriteByte(InitData[i]);
	}

	CS=0;
	CE=1;
}

//=============================================================
// 语法格式:	void nRF2401_Mode(unsigned int uiMode)
// 实现功能:	设置nRF2401A的工作方式
// 参数:		uiMode:0--接收;1--发送					
// 返回值:		无
//=============================================================
void nRF2401_Mode(unsigned char uiMode)
{

	CE=0;
	CS=1;

	if(uiMode == 0)
		nRF2401_WriteByte(InitData[14] | 0x01);			// 接收
	else
		nRF2401_WriteByte(InitData[14] & 0xFE);			// 发送

	CS=0;
	CE=1;
}

//=============================================================
// 语法格式:	void nRF2401_SetAddress(unsigned int *Address,unsigned int AddrByte)
// 实现功能:	设置目标nRF2401A的地址
// 参数:		unsigned int *Address:地址数组
//				unsigned int AddrByte:数组的长度					
// 返回值:		无
//=============================================================
void nRF2401_SetAddress(unsigned char *Address,unsigned char AddrByte)
{
	unsigned int i;
	for(i=0; i<AddrByte; i++)
	{
		AddrBuffer[i] = Address[i];
	}
	AddrByteCnt = AddrByte;
}

//=============================================================
// 语法格式:	void nRF2401_WriteByte(unsigned int uiData)
// 实现功能:	向nRF2401A写入一个字节数据
// 参数:		unsigned int uiData: 待写入数据
// 返回值:		无
//=============================================================
void nRF2401_WriteByte(unsigned char uiData)
{
	unsigned int i;
	cs_test=0;
	for(i=0; i<8; i++)
	{

		CLK1=0;
		if(uiData&0x80)

		DATA=1;
		else
			DATA=0;


				 CLK1=1;
				_nop_();
             	_nop_();

				_nop_();
             	_nop_();
				_nop_();
             	_nop_();

				_nop_();
             	_nop_();

			  CLK1=0;
			uiData = uiData<<1;
	}
	cs_test=1;
}

//=============================================================
// 语法格式:	void nRF2401_WriteWord(unsigned int uiData)
// 实现功能:	向nRF2401A写入一个字数据
// 参数:		unsigned int uiData: 待写入数据
// 返回值:		无
//=============================================================
void nRF2401_WriteWord(unsigned int uiData)
{
	unsigned int i;
	for(i=0; i<16; i++)
	{

		CLK1=0;
		if(uiData&0x8000)

			DATA=1;
		else

			DATA=0;

			CLK1=1;

			_nop_();
          	_nop_();

			_nop_();
          	_nop_();
			_nop_();
          	_nop_();

			_nop_();
          	_nop_();

			CLK1=0;
			uiData = uiData<<1;
	}
}

//=============================================================
// 语法格式:	void nRF2401_SendByte(unsigned int TxData)
// 实现功能:	将目标地址+字节数据写入nRF2401A
// 参数:		unsigned int TxData: 待发送字节数据
// 返回值:		无
//=============================================================
void nRF2401_SendByte(unsigned char TxData)
{
	unsigned int i;

     CE=1;
	Delay_Us(1);
				
	for(i=0; i<AddrByteCnt; i++)
	{
		nRF2401_WriteByte(AddrBuffer[i]);
	}
	nRF2401_WriteByte(TxData);

	CE=0;

	DATA=0;
	Delay_Us(10);
}


  void nRF2401_Str(unsigned char *arr)
{
	unsigned char i;
	
	i = 0;
	while(arr[i] != '\0')
	{
		nRF2401_SendByte(arr[i]);
		i++;
	}
}
//=============================================================
// 语法格式:	void nRF2401_SendWord(unsigned int TxData)
// 实现功能:	将目标地址+字数据写入nRF2401A
// 参数:		unsigned int TxData: 待发送字数据
// 返回值:		无
//=============================================================
void nRF2401_SendWord(unsigned int TxData)
{
	unsigned int i;
	

	CE=1;
	Delay_Us(1);				
	for(i=0; i<AddrByteCnt; i++)
	{
		nRF2401_WriteByte(AddrBuffer[i]);
	}
	nRF2401_WriteWord(TxData);

	CE=0;

	DATA=0;
	Delay_Us(20);
}

//=============================================================
// 语法格式:	void nRF2401_SendBuffer_Byte(unsigned int *TxData,unsigned int DataByte)
// 实现功能:	向nRF2401A发送一个数组的数据(字节方式)
// 参数:		unsigned int *TxData: 待发送数组
//				unsigned int DataByte:数组的长度					
// 返回值:		无
//=============================================================
void nRF2401_SendBuffer_Byte(unsigned char *TxData,unsigned char DataByte)
{
	unsigned int i;
	

	CE=1;
	Delay_Us(1);				
	for(i=0; i<AddrByteCnt; i++)
	{
		nRF2401_WriteByte(AddrBuffer[i]);
	}
	for(i=0; i<DataByte; i++)
	{
		nRF2401_WriteByte(TxData[i]);
	}

	CE=0;

	DATA=0;
	Delay_Us(20);
}

//=============================================================
// 语法格式:	void nRF2401_SendBuffer_Word(unsigned int *TxData,unsigned int DataWord)
// 实现功能:	向nRF2401A发送一个数组的数据(字方式)
// 参数:		unsigned int *TxData: 待发送数组
//				unsigned int DataWord:数组的长度					
// 返回值:		无
//=============================================================
void nRF2401_SendBuffer_Word(unsigned int *TxData,unsigned int DataWord)
{
	unsigned int i;

	CE=1;
	Delay_Us(1);					//
	for(i=0; i<AddrByteCnt; i++)
	{
		nRF2401_WriteByte(AddrBuffer[i]);
	}
	for(i=0; i<DataWord; i++)
	{
		nRF2401_WriteWord(TxData[i]);
	}

	CE=0;

	DATA=0;
	Delay_Us(20);
}

//=============================================================
// 语法格式:	unsigned int nRF2401_RxStatus()
// 实现功能:	判断nRF2401A的接收状态
// 参数:		无
// 返回值:		0:	没有接收到数据
//				1:	已经接收到数据,等待读出
//=============================================================
unsigned char nRF2401_RxStatus()
{

	if(DR1==0)
		return(0);
	else
		return(1);
}

//=============================================================
// 语法格式:	void nRF2401_ReceiveByte(unsigned int *RxData)
// 实现功能:	从nRF2401A读出一个字节的数据
// 参数:		unsigned int *RxData:读出的数据
// 返回值:		无
//=============================================================


void nRF2401_ReceiveByte(unsigned char *RxData)
{

   	unsigned char i = 0,j = 0;
	unsigned char dat = 0;


    while(DR1)
	{

		dat <<= 1;
		
		 CLK1=1;
		_nop_();
		_nop_();
		if(DATA)
			dat |= 0x01;
		i++;

		CLK1=0;

		if(i>7)
		{
			i = 0;
			RxData[j] = dat;
			dat = 0;
			j++;
		}

	}

	DATA=1;
 

}

//=============================================================
// 语法格式:	void nRF2401_ReceiveWord(unsigned int *RxData)
// 实现功能:	从nRF2401A读出一个字的数据
// 参数:		unsigned int *RxData:读出的数据
// 返回值:		无
//=============================================================
void nRF2401_ReceiveWord(unsigned int *RxData)
{
	unsigned int i = 0,j = 0;
	unsigned int dat = 0;


	while(DR1)
	{
		dat <<= 1;

		 CLK1=1;
		_nop_();
		_nop_();
		if(DATA)
			dat |= 0x01;
		i++;

		CLK1=0;

		if(i>15)
		{
			i = 0;
			RxData[j] = dat;
			dat = 0;
			j++;
		}

	}

	DATA=1;
}


//=============================================================
// 语法格式:	void Delay_Us(unsigned int TimeCnt)
// 实现功能:	延时(uS)
// 参数:		unsigned int TimeCnt:延时的us数
// 返回值:		无
//=============================================================
void Delay_Us(unsigned int TimeCnt)
{
	int i;

	for(i = 0; i < TimeCnt; i++)
	{

				_nop_();
	
	}
}


//******************************** END *************************************

⌨️ 快捷键说明

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