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

📄 nrf2401.c

📁 USB2.0控制器CY7C68013控制无线收发芯片nRF2401进行无线发射的51单片机程序
💻 C
字号:
/**********************************************************************************/
/**********************************************************************************/
// The nRF2401 2.4GHz Multi Channel Software
//
// This software and any related documentation is provided "as is" without any
// warranty of any kind, either express or implied, including, without
// limitation, the implied warranties or merchantability, fitness for a
// particular purpose, and noninfringment. The entire risk arising out of use
// of this software remains with you.
// write time is 2004.3.20====debug time is 2004.3.20--21
// copyright is shenzhen.xuntong Co.Ltd
// cpu= At89lv51,keilC51 compiler
/**********************************************************************************/
/**********************************************************************************/
#include "fx2.h"
#include "fx2regs.h"
#include "intrins.h"
/**********************************************************************************/
#define uchar unsigned char 
#define uint  unsigned int

#define	Fclk	3686400
#define	BitRate	19200
#define	BRR		(Fclk/(16*Bitrate))-1

#define	timerdiv	1
#define	timerval	256-(Fclk/timerdiv)/100000			// timeout each 10us
/**********************************************************************************/
uchar 	InitData[15];
uchar 	TXData[30];
uchar 	RXData[26];

uchar 	Temp;
uchar 	BitCnt;	
uchar 	ByteCnt;
uchar 	Data1=	0xff;

bdata 	uchar 	tempi;
/**********************************************************************************/

#define BIT(b)	(1<<(b))
#define NBIT(b)	~(1<<(b))

#define CS	0
#define CE  2
#define PWR_UP	4

#define DR1	1
#define CLK1	3
#define DATA	5


sbit 	bflag	=tempi^7;

/**********************************************************************************/
void 	init_io();
void 	nRF2401_ON();
void 	BuildInitWord();
void 	InitnRF2401();
void 	DoSPIClock();
void 	CE_High();
void 	RXEN_HIGH();
void 	TXEN_LOW();
void 	Delay10();
void 	delay100();
void 	BuildShockWord();
void 	ShockBurst();
void 	ReceiveShock();
void    initUart(void);

#define LED_ADDR		0x72

void write_leds (BYTE d)
{
	while (I2CS & 0x40);	//Wait for stop to be done
	I2CS = 0x80;			//Set start condition
	I2DAT = LED_ADDR;		//Write led address
	while (!(I2CS & 0x01));	//Wait for done
	I2DAT = d;				//Write data
	while (!(I2CS & 0x01));	//Wait for done
	I2CS = 0x40;			//Set stop bit
}

/*****************************************MAIN  START ******************************/
void my_InitnRF2401(void)
{
	init_io();
	nRF2401_ON();
	BuildInitWord();
	InitnRF2401();
	CE_High();
	RXEN_HIGH();
    delay100();				//delay for LED light	
    write_leds(0x0E);				//close all LED 
    TXEN_LOW();				// set TX mode
	BuildShockWord();  
	ShockBurst();		
	Delay10();				// delay for mode change
	TXEN_LOW();
	
//    initUart();	                         
/*	while(1)
		{
		//	CheckButtons(); //check if the button is pressed
		
			//DR1=1;
			if(IOA&BIT(DR1))		// Check if DR1 is high (any received from nRF2401)	
			{
				ReceiveShock();			
//				write_leds(6);
			}
			else
			{
//				write_leds(1);
			}
			
		}					
		*/
		
}
/*************************************Rmain      END *******************************/
/*************************************init_io   START ******************************/
void init_io()
{
	OEA|=BIT(CS)|BIT(CE)|BIT(PWR_UP)|BIT(CLK1)|BIT(DATA);
	OEA&=NBIT(DR1);

	IOA|=BIT(PWR_UP);
	IOA&=NBIT(CS)&NBIT(CE)&NBIT(CLK1)&NBIT(DATA);
}
/*************************************init_io    END *******************************/
/*************************************BuildSPIWord START****************************/
void BuildInitWord()
{
	InitData[0]=0xd0;		//RX receiver 2, Datalength 13*16bit(26 byte)
	InitData[1]=0xd0;		//RX receiver 1, Datalength 13*16bit(26 byte)
	InitData[2]=0x00;
	InitData[3]=0xcc;
	InitData[4]=0xcc;
	InitData[5]=0xcc;
	InitData[6]=0xcc;
	InitData[7]=0x00;
	InitData[8]=0xcc; 		//RX receiver 1 address   High byte
	InitData[9]=0xcc;		//RX receiver 1 address   High byte
	InitData[10]=0xcc;		//RX receiver 1 address   Low byte
	InitData[11]=0xcc;		//RX receiver 1 address   Low byte
	//InitData[12]=0x82;	//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
	InitData[12]=0x83;		//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	//InitData[13]=0x4f;		//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[13]=0x6f;	//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[14]=0x04;		//Channel Number(Bit7-Bit1), RX/TX mode(Bit0), transmit mode
}
/*************************************BuildSPIWord END******************************/
/*************************************InitnRF2401 START******************************/		
void InitnRF2401()
{
					//Disable CE
	IOA&=NBIT(CE);
	IOA|=BIT(CS);					//Enable CS--confige mode
	for (ByteCnt=0;ByteCnt<15;ByteCnt++)
		{
		tempi=InitData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
			{
				if (bflag==1)	//Check if first bit is HIGH
					//Set Data high
					IOA|=BIT(DATA);
				else
				//Set Data low
					IOA&=NBIT(DATA);
				tempi=tempi<<1;	//Left Shift to get next bit
				DoSPIClock();	//Call "DoClock" to generate a clock pulse
			}
		}
	IOA&=NBIT(CS);						//Disable CS--standby mode	
	IOA&=NBIT(DATA);						//Set Data low
}
/*************************************InitnRF2401 END *******************************/
/*************************************DoSPIClock START******************************/
void DoSPIClock()
{
	IOA|=BIT(CLK1);
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	IOA&=NBIT(CLK1);
}	

/*************************************DoSPIClock END *******************************/
/*************************************CE_High   START ******************************/
void CE_High()
{
	IOA|=BIT(CE);
}
/*************************************CE_High    END *******************************/
/*************************************TXEN_LOW  START ******************************
void CE_Low()
{
	CE=0;
}
*************************************CE_Low     END ********************************/
/*************************************nRF2401_ON START******************************/
void nRF2401_ON()
{
	IOA|=BIT(PWR_UP);
}
/*************************************nRF2401_ON END *******************************/
/*************************************nRF2401_OFF START*****************************/
//void nRF2401_OFF()
//{
//	PWR_UP=0;			// Set Power_Up low	
//}
/*************************************nRF2401_OFF END ******************************/
/*************************************RXEN_HIGH START ******************************/
void RXEN_HIGH()
{
		//Set CE LOW
	IOA&=NBIT(CE);	
	IOA|=BIT(CS);
	IOA|=BIT(DATA);															
		//Set CS HIGH--confige mode
				//Set Data HIGH
	DoSPIClock(); 		//Make one SPIClock cycle
		//Set CS LOW		
			//Set CE HIGH--active mode
	IOA&=NBIT(CS);
	IOA|=BIT(CE);
}
/*************************************RXEN_HIGH  END *******************************/
/*************************************TXEN_LOW  START ******************************/		
void TXEN_LOW()
{
			//Set CE LOW
	IOA&=NBIT(CE);	
	IOA|=BIT(CS);
	IOA&=NBIT(DATA);															
		//Set CS HIGH--confige mode
				//Set Data LOW
	DoSPIClock(); 		//Make one SPIClock cycle
		//Set CS LOW		
			//Set CE HIGH--active mode
	IOA&=NBIT(CS);
	IOA|=BIT(CE);
}

/*************************************TXEN_LOW   END *******************************/
/*************************************delay10   START ******************************/
void Delay10()
{
	uchar  x;
	uchar  y;
	for(x=0;x<10;x++)
		{
		for(y=0;y<100;y++)
		_nop_();
		_nop_();
		_nop_();
		}
}
/*************************************delay10    END *******************************/
/*************************************delay100   START *****************************/	
void delay100()
{
	uchar  x;
	uchar  y;
	for(x=0;x<100;x++)
		{
		for(y=0;y<100;y++)
		_nop_();
		_nop_();
	_nop_();
		}
}
/*************************************delay100   END *******************************/
/*************************************ShockBurst START *****************************/
void BuildShockWord()
{
	int i;
	
	TXData[0]=0xcc;		//MSB    ;RX receiver 1 address   High byte
	TXData[1]=0xcc;		//MSB-1  ;RX receiver 1 address   High byte
	TXData[2]=0xcc;		//MSB-2  ;RX receiver 1 address   Low byte
	TXData[3]=0xcc;		//MSB-3  ;RX receiver 1 address   Low  byte
	TXData[4]=Data1;	//MSB-4  ;Data byte 9
	for(i=5;i<30;i++)
		TXData[i]=i-3;  
}
/************************************* BuildShockWord END *******************************/
/************************************* ShockBurst   START *******************************/
void ShockBurst()
{
			//Pull CS low
	IOA&=NBIT(CS);
	IOA|=BIT(CE);				//Enable CE	active mode
	for (ByteCnt=0;ByteCnt<30;ByteCnt++)
	{
		tempi=TXData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
		{
			if (bflag==1)	//Check if first bit is HIGH
					//Set Data high
				IOA|=BIT(DATA);
			else
				IOA&=NBIT(DATA);		//Set Data low
			tempi=tempi<<1;	//Left Shift to get next bit
			DoSPIClock();
			//SendData();	//Call SendData
		}
	}
			//Disable CE (TX Starts!)--standby mode
	IOA&=NBIT(CE);
			//Set Data low
	IOA&=NBIT(DATA);
}
/************************************* ShockBurst END ***********************************/
/************************************* SendData     START *******************************
		
void SendData()
{
	for (BitCnt=0;BitCnt<8;BitCnt++)
		{
		if (bflag==1)		//Check if first bit is HIGH
			Data=1;			//Set Data high
		else
			Data=0;			//Set Data low
		tempi=tempi<<1;		//Left Shift to get next bit
		DoSPIClock();		//Call "DoClock" to generate a clock pulse
		}
}

************************************** SendData END *************************************/

/************************************* ReceiveShock START *******************************
void ReceiveShock()
{
			//Set Data tri state
	IOA|=BIT(DATA);				
	OEA&=NBIT(DATA);
	Temp=0;
	for (ByteCnt=0;ByteCnt<26;ByteCnt++)
	{
		for(BitCnt=0;BitCnt<8;BitCnt++)
		{
			Temp=Temp<<1;	//shift left to receive next bit
	//set clock high
			IOA|=BIT(CLK1);
			_nop_();	
			_nop_();		//wait one clk cycle
			_nop_();
	_nop_();
	_nop_();
	_nop_();
			IOA|=BIT(DATA);
			if(IOA&BIT(DATA))		//check if Data=high		
				Temp|=0x01;	//yes - set bit high
			//set clock low
			IOA&=NBIT(CLK1);
			_nop_();		//wait one clk cycle
			_nop_();
	_nop_();
	_nop_();
	_nop_();
		}
		_nop_();
		_nop_();
	_nop_();
		RXData[ByteCnt]=Temp;
 //       SBUF=Temp;
        TI=0;
		IOA|=BIT(DR1);
		if((IOA&BIT(DR1))==0)			//check if DR1 is not still high
		{		
			_nop_();
			_nop_();
	_nop_();
			write_leds(RXData[0]);
			delay100();
			write_leds(0xff);
		}
	 }

	 OEA|=BIT(DATA);
}
************************************* ReceiveShock END *******************************/	

⌨️ 快捷键说明

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