📄 main.c
字号:
#include <reg9e5.h>
#define int8u unsigned char
#define int16u unsigned int
#define INT8U unsigned char
#define INT16U unsigned int
#define WRC 0x00 //W_RF_CONFIG
#define RRC 0x10 //R_RF_CONFIG
#define WTP 0x20 //W_TX_PAYLOAD
#define RTP 0x21 //R_TX_PAYLOAD
#define WTA 0x22 //W_TX_ADDRESS
#define RTA 0x23 //R_TX_ADDRESS
#define RRP 0x24 //R_RX_PAYLOAD
#define RAD 0x40 //R_ADC_DATA
#define WAC 0x44 //W_ADC_CONFIG
#define RAC 0x46 //R_ADC_CONFIG
#define WTU 0x50 //W_TEST_UNLOCK (use with data A5)
#define WTR 0x52 //W_TEST_REGISTER
#define RTR 0x53 //R_TEST_REGISTER
#define CC 0x80 //CHANNEL_CONFIG
#define SAV 0xC0 //START_ADC_CONV
#define HFREQ 1 // 0=433MHz, 1=868/915MHz 19/08/2004 set 915mhz
#define POWER 3 // 0=min power...3 = max power
#define TurnBY() TRX_CE = 0;TXEN = 0
sbit LEDG =P0^6;
sbit LEDR =P0^5;
int8u Nrf9e5Config[10] = {
0x28, //频道设置
0x0e, //自动重发关,发送节电模式关,输出功率10dB,915MHZ
0x44, //收发地址都为4字节
0x0a, //接收数据长度,10字节
0x0a, //发送数据长度,10字节
0xe7,
0xe7,
0xe7,
0xe7, //地址
0xdf //CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
};
int8u Rxbuf[37];
int8u timer[2];
int8u T0LREL, T0HREL;
/*****************************************************************************************
//函数名:void delay(int16u s)
//输入:时间
//输出:无
//功能描述:普通廷时
/*****************************************************************************************/
void delay(int16u s)
{
int16u i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
/*****************************************************************************************
//函数名:int8u SpiReadWrite(int8u b)
//输入:发送的数据
//输出:收到的数据
//功能描述:SPI发送接收一个字节
/*****************************************************************************************/
int8u SpiReadWrite(int8u b)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = b; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00); // Wait until SPI hs finished transmitting
return SPI_DATA;
}
/*****************************************************************************************
//函数名:InitTimer(void)
//输入:无
//输出:无
//功能描述:定时器0初始化
/*****************************************************************************************/
void InitTimer(void)
{
timer[0] = timer[1] = 0;
TR0 = 0;
TMOD &= ~0x03;
TMOD |= 0x01; // mode 1
CKCON |= 0x00; // T0M = 1 (/4 timer clock)
T0LREL = 0x60; // 1KHz tick...
T0HREL = 0xF0; // ... = 65536-16e6/(4*1e3) = F060h
TF0 = 0; // Clear any pending Timer0 interrupts
TR0 = 1; // Start Timer0
ET0 = 1; // Enable Timer0 interrupt
}
/*****************************************************************************************
//函数名:ResetTimer(int8u n)
//输入:要复位的计时器
//输出:无
//功能描述:复位计时器
/*****************************************************************************************/
void ResetTimer(int8u n)
{
ET0 = 0; // Disable Timer0 interrupt
timer[n & 0x01] = 0; // Clear timer[n]
ET0 = 1; // Enable Timer0 interrupt
}
/*****************************************************************************************
//函数名:int16u GetTimer(int8u n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
/*****************************************************************************************/
int16u GetTimer(int8u n)
{
int16u tmp;
ET0 = 0; // Disable Timer0 interrupt
tmp = timer[n]; // Clear timer[n]
ET0 = 1; // Enable Timer0 interrupt
return tmp;
}
/*****************************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
/*****************************************************************************************/
void InitCpu(void)
{
int8u cklf;
SPICLK = 0; // Max SPI clock
SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
// Switch to 16MHz clock:
RACSN = 0;
SpiReadWrite(RRC | 0x09);
cklf = SpiReadWrite(0) | 0x04;
RACSN = 1;
RACSN = 0;
SpiReadWrite(WRC | 0x09);
SpiReadWrite(cklf);
RACSN = 1;
P0_DIR=P0_DIR&0x1F; //led p0.6 p0.5 P0.7 output
LEDR=0;
LEDG=0;
P0_DIR |= 0x18; // P0.4 /3 is input
P0_DIR &= 0xf6;
InitTimer();
EA = 1;
}
/*****************************************************************************************
//函数名:void Init9E5(void)
//输入:无
//输出:无
//功能描述:Nrf9e5初始化,这里我们配置成32位地址。
/*****************************************************************************************/
void Init9E5(void)
{
int8u i;
TRX_CE=0;
TXEN=0; //配置模式
RACSN = 0;
SpiReadWrite(WRC);
for(i=0; i<10; i++)
{
SpiReadWrite(Nrf9e5Config[i]);
}
RACSN = 1;
}
/*****************************************************************************************
//函数名:int8u Recepacket(void)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
/*****************************************************************************************/
int8u Recepacket(void)
{
int8u i;
TXEN = 0;
TRX_CE = 1;
ResetTimer(1);
while(DR == 0)
{
if(GetTimer(1) > 300)
{
TRX_CE = 0;
return 0;
}
}
TRX_CE = 0;
RACSN = 0;
SpiReadWrite(RRP);
i = 0;
for(i=0; i<4; i++)
{
Rxbuf[i] = SpiReadWrite(0);
}
while(DR)
{
SpiReadWrite(0);
}
RACSN = 1;
return 1;
}
/******************************************************************************************
*******************************************************************************************
************************************中断服务程序*********************************************
*******************************************************************************************
******************************************************************************************/
void Timer0ISR (void) interrupt 1
{
EA = 0;
TH0 = T0HREL; // Reload Timer0 high byte
TL0 = T0LREL; // Reload Timer0 low byte
timer[0]++; // Increment timer[0]
timer[1]++;
EA =1;
}
/******************************************************************************************
*******************************************************************************************
******************************************主程序********************************************
*******************************************************************************************
******************************************************************************************/
main()
{
int8u temp;
InitCpu();
delay(5000);
Init9E5();
LEDR = 1;
LEDG = 1;
while(1)
{
temp = Recepacket();
if(temp == 1)
{
LEDR = 0;
LEDG = 0;
delay(20000);
LEDR = 1;
LEDG = 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -