📄 nrf2401.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 + -