📄 nrf9e5发送主程序.txt
字号:
#include <reg9e5.h>
#include "ISD51.h"
#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
///////////////////////////////////////////////////////////////////////////////
//*****************************************************************************
//I/O口定义
//*****************************************************************************
sbit LEDG =P0^6;
sbit LEDR =P0^5;
sbit KEY1 =P0^3;
sbit KEY2 =P0^4;
///////////////////////////////////////////////////////////////////////////////
//*****************************************************************************
//配置寄存器
//*****************************************************************************
code INT8U Nrf9e5Config[10] = {
0x28, //频道设置
0x0e, //自动重发关,发送节电模式关,输出功率10dB,915MHZ
0x44, //收发地址都为4字节
0x04, //接收数据长度,4字节
0x04, //发送数据长度,4字节
0xe7,
0xe7,
0xe7,
0xe7, //地址
0xdf //CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
};
///////////////////////////////////////////////////////////////////////////////
//*****************************************************************************
//全局变量?//*****************************************************************************
INT16U TimerCount[2] = {0x00, 0x00}; //超时计数器
INT8U T0_L; //定时器0初值低字节。
INT8U T0_H; //定时器0初值低字节。
///////////////////////////////////////////////////////////////////////////////
//*****************************************************************************
//函数名:void Delay100us(INT8U n)
//输入:时间
//输出:无
//功能描述:廷时100us
//*****************************************************************************
void Delay100us(INT8U n)
{
INT8U i;
while(n--)
for(i=0;i<35;i++);
}
//*****************************************************************************
//函数名: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; // 清除SPI中断标致位
SPI_DATA = b;
while((EXIF & 0x20) == 0x00); //等待发送接收完成
return SPI_DATA;
}
//*****************************************************************************
//函数名:void InitTimer(void)
//输入:无
//输出:无
//功能描述:定时器0初始化
//*****************************************************************************
void InitTimer(void)
{
TR0 = 0;
TMOD &= ~0x03;
TMOD |= 0x01; //16位定时
CKCON |= 0x00;
T0_H = 0xFA;
T0_L = 0xCA; //1MS
TF0 = 0;
TR0 = 1;
ET0 = 1;
}
//*****************************************************************************
//函数名:ResetTimer(INT8U n)
//输入:要复位的计时器
//输出:无
//功能描述:复位计时器
//*****************************************************************************
void ResetTimer(INT8U n)
{
ET0 = 0;
TimerCount[n & 0x01] = 0; //清零超时计数器
ET0 = 1;
}
//*****************************************************************************
//函数名:INT16U ReadTimer(INT8U n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
//*****************************************************************************
INT16U ReadTimer(INT8U n)
{
INT16U tmp;
ET0 = 0;
tmp = TimerCount[n]; //读出超时计数器值
ET0 = 1;
return tmp;
}
//*****************************************************************************
//函数名:InitUart(void)
//输入:无
//输出:无
//功能描述:串口初始化
//*****************************************************************************
void InitUart(void)
{
TH1 = 243; // 19200
CKCON |= 0x10;
PCON = 0x80; // SMOD=1
SCON = 0x52; // 模式1,使能接收
TMOD &= ~0x30;
TMOD |= 0x20;
TR1 = 1; // timer1开启
P0_ALT |= 0x06; // 串口端口使能
P0_DIR |= 0x02; // P0.1 输入
P0_DIR &= 0xfb;
ES = 0;
ISDwait();
}
//*****************************************************************************
//函数名:void SendCh(INT8U c)
//输入:发送的数据
//输出:无
//功能描述:发送一个字节
//*****************************************************************************
void SendCh(INT8U c)
{
EA = 0;
TI = 0;
SBUF = c;
while(!TI);//等待发送完成
TI = 0;
EA = 1;
}
//*****************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
//*****************************************************************************
void InitCpu(void)
{
INT8U cklf;
SPICLK = 0; // Max SPI clock
SPI_CTRL = 0x02; // SPI接到RF端
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; //P0.6,P0.5,P0.7 输出
LEDR=0;
LEDG=0;
P0_DIR |= 0x18; // P0.3,P0.4 输入
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;
}
//*****************************************************************************
//函数名:TransmitPacket(INT8U *pBuf)
//输入:发送的数据
//输出:无
//功能描述:发送发送缓冲区的数据
//*****************************************************************************
void TransmitPacket(INT8U *pBuf)
{
INT8U i;
RACSN = 0;
SpiReadWrite(WTP);
for(i=0; i<Nrf9e5Config[4]; i++)
{
SpiReadWrite(pBuf[i]);//写入发送数据缓冲区
}
RACSN = 1;
TXEN = 1;
TRX_CE = 1; //使能发送
Delay100us(1);
TRX_CE = 0;
}
//*****************************************************************************
//函数名:INT8U Recepacket(INT8U *pBuf)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
//*****************************************************************************
INT8U Recepacket(INT8U *pBuf)
{
INT8U i;
TXEN = 0;
TRX_CE = 1;
ResetTimer(1);//复位超时计数器。
while(DR == 0)//有收到切换到空闲状态时退出接收状态。
{
if(ReadTimer(1) > 300)//300MS超时退出。
{
TRX_CE = 0;
return 0;
}
}
TRX_CE = 0;
RACSN = 0;
SpiReadWrite(RRP);
for(i=0; i<Nrf9e5Config[4]; i++)//读出数据。
{
pBuf[i] = SpiReadWrite(0);
}
while(DR)//直到DR为高。
{
SpiReadWrite(0);
}
RACSN = 1;
return 1;
}
/******************************************************************************
*******************************************************************************
**********************************中断服务程序*********************************
*******************************************************************************
******************************************************************************/
void Timer0ISR (void) interrupt 1 //定时器0中断
{
EA = 0;
TF0 = 0;
TH0 = T0_H;
TL0 = T0_L;
TimerCount[0]++;
TimerCount[1]++;
EA =1;
}
/******************************************************************************
*******************************************************************************
***********************************主程序**************************************
*******************************************************************************
******************************************************************************/
main()
{
INT8U RxBuf[4]; //接收数据缓冲区
InitCpu(); //初始化CPU
InitTimer();
InitUart(); //初始化串口。
delay(5000);
Init9E5(); //初始化NRF9E5
LEDR = 1;
LEDG = 1; //两个LED灭。
SendCh('a');
while(1)
{
if(Recepacket(RxBuf)) //接收到数据。
{
if(RxBuf[2] == 0x0F)
{
LEDG = 0;
delay(40000);
LEDG = 1;
}
else if(RxBuf[2] == 0xF0)
{
LEDR = 0;
delay(40000);
LEDR = 1;
}
SendCh(RxBuf[0]);
SendCh(RxBuf[1]);
SendCh(RxBuf[2]);
SendCh(RxBuf[3]);
}
}
}
//end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -