📄 nrf905.c
字号:
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc,0xcc, 0xcc, 0x58
};// │ │ │ │ │ │ │ │ │ │
//字节0 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8 字节9
// │ │ │ │ │ │ │ │ │ │
// │ │ │ │ │ │ │ │ │ 8位CRC校验位,CRC允许校验,外接16MHz晶体振荡器,没有外部时钟输出
// │ │ │ │ │ │ │ │ └ RX地址3字节为0xcc
// │ │ │ │ │ │ │ └ RX地址2字节为0xcc
// │ │ │ │ │ │ └ RX地址1字节为0xcc
// │ │ │ │ │ └ RX地址0字节为0xcc
// │ │ │ │ └ 32字节的TX有效数据宽度
// │ │ │ └ 32字节的RX有效数据宽度
// │ │ └ 4字节的TX地址宽度,4字节的RX地址有效宽度
// │ └ 不重发数据包,正常接收模式,输出功率为+10dBm,期间工作在433MHz频段,CH_NO[8]为0
// └ 430.0MHz
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;430MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar data TxBuf[32];
uchar data RxBuf[32];
uchar tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
sbit SCK =P1^7;
sbit MISO =P1^6;
sbit MOSI =P1^5;
sbit CSN =P1^4;
sbit TX_EN =P1^3;
sbit TRX_CE =P1^2;
sbit PWR_UP =P1^1;
sbit CD =P1^0;
sbit DR =P3^3;
sbit AM =P3^4;
sbit LED1 =P3^0;
sbit LED2 =P3^1;
sbit KEY2 =P3^7;
sbit KEY1 =P3^5;
/*******************************************************************************************/
//void InitIO(void); // Initialize IO port
//void Inituart(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void SetRxMode(void); // Set nRF905 in Rx mode
void TxPacket(void); // Send data by nRF905
void RxPacket(void); // Recive data by nRF905
void SpiWrite(uchar); // Write data to nRF905
uchar SpiRead(void); // Read data to nRF905
void Delay(uchar n); // Delay 100us
void UART_init(); //串口初始化函数
void COM_send(void); //串口发送函数
///////////////////////////////////////////
uchar code password[]={"Eiman"};
/*******************************************************************************************/
void Delay(uchar n) //大约延时1ms
{
uint i;
while(n--)
for(i=0;i<340;i++);
}
void main()
{
//================NRF905初始化
CSN=1; // 禁用SPI
SCK=0; // SCK置低,准备发送数据的下一位
DR=1; // 设置为输入端
AM=1; // 设置为输入端
PWR_UP=1; // nRF905 上电
TRX_CE=0; // 设置 nRF905 为 standby 模式
TX_EN=0; // 设置射频为 Rx接收模式
//================
Config905(); //向905配置寄存器写入信息
TxBuf[0] = 1;
TxBuf[1] = 1;
SetTxMode(); //设置发送模式
TxPacket(); //发送数据包
LED1 = 1;
LED2 = 1;
Delay(500); // delay for led light
LED1 = 0;
LED2 = 0;
TxBuf[0] = 0xff;
TxBuf[1] = 0xff; // led close
SetRxMode(); //设置接收模式
UART_init();
while(1)
{
uchar i,j;
//=====================从键盘获得数据
if(KEY1 ==0 ) { LED1 = 1; TxBuf[0] = 1 ;tf = 1 ; }
if(KEY2 ==0 ) { LED2 = 1; TxBuf[1] = 1 ;tf = 1 ; }
if (tf==1)
{
for(i=0;i<5;i++)
{
TxBuf[i+2] = password[i];
}
//===============NRF905发送相应的按键
SetTxMode(); // Set Tx Mode
TxPacket(); // Transmit Tx buffer data
TxBuf[0] = 0xff;
TxBuf[1] = 0xff;
SetRxMode(); // Set nRF905 in Rx mode
tf=0;
Delay(500);
LED1 = 0;
LED2 = 0;
}
//=====================等待NRF905接收
if (DR) // If recive data ready...
{
RxPacket(); // ... recive data
//COM_send();
for(j=0;j<5;j++)
{
if( RxBuf[j+2] != password[j])
{ RxBuf[0] = 0;RxBuf[1] = 0;break;}
}
if(RxBuf[0] == 1)
{ LED1 = 1 ;
TxBuf[1] = 1 ;
tf = 1 ;
}
if(RxBuf[1] == 1)
{ LED2 = 1 ;
TxBuf[0] = 1 ;
tf = 1 ;
}
Delay(500); // ...light led
LED1 = 0 ;
LED2 = 0 ;
}
}
}
/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
uchar i;
CSN=0; // CSN片选信号,SPI使能
SpiWrite(WC); //向905芯片写配置命令
for (i=0;i<RxTxConf.n;i++) //写入配置字信息
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1; //结束SPI数据传输
}
/*******************************************************************************************/
//function SpiWrite(); //单字节发送
/*******************************************************************************************/
void SpiWrite(uchar byte)
{
uchar i;
DATA_BUF=byte; //将需要发送的数据写入缓存
for (i=0;i<8;i++) //循环8次发送一个字节的数据
{
if (flag) //flag=DATA_BUF^7
MOSI=1;
else
MOSI=0;
SCK=1; //SCK高电平,总线上的数据将读入
DATA_BUF=DATA_BUF<<1; //左移一位,为下一位的发送准备
SCK=0; //SCK低电平,为下次时钟跳变做准备
}
}
/*******************************************************************************************/
//function SpiRead(); //单字节接收
/*******************************************************************************************/
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++) //循环8次发送一个字节的数据
{
DATA_BUF=DATA_BUF<<1; //左移一位,准备接收下一位数据
SCK=1; //SCK高电平
if (MISO)
flag1=1; //flag1=DATA_BUF^0
else
flag1=0;
SCK=0; //SCK低电平
}
return DATA_BUF; //DATA_BUF为接收到的完整数据
}
/*******************************************************************************************/
//function TxPacket(); //发送数据包
/*******************************************************************************************/
void TxPacket(void) //发送数据包
{
uchar i;
//Config905();
CSN=0; // 使能SPI
SpiWrite(WTP); // Write payload command
for (i=0;i<32;i++)
{
SpiWrite(TxBuf[i]); // 写入 32 字节的直接发送数据
}
CSN=1; // 关闭SPI,保存写入的数据
Delay(1);
CSN=0; // SPI使能,准备写入地址信息
SpiWrite(WTA); // 写数据至地址寄存器
for (i=0;i<4;i++) // 写入 4 字节地址
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // 关闭SPI
TRX_CE=1; // 进入发送模式,启动射频发送
Delay(1); // while (DR!=1);
TRX_CE=0; // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket(); //接收数据包
/*******************************************************************************************/
void RxPacket(void) //接收数据包
{
uchar i;
TRX_CE=0; //设置nRF905进入待机模式
CSN=0; //使能SPI
SpiWrite(RRP); //准备读取接收到的数据
for (i=0;i<32;i++)
{
RxBuf[i]=SpiRead(); //通过SPI接口从905芯片读取数据
}
CSN=1; //禁用SPI
while(DR||AM);
TRX_CE=1;
}
/*******************************************************************************************/
//function SetTxMode(); //设置发送模式
/*******************************************************************************************/
void SetTxMode(void)
{
TX_EN=1; //设置发送模式
TRX_CE=0; //暂不启动射频发送
Delay(1); // delay for mode change(>=650us)
}
/*******************************************************************************************/
//function SetRxMode(); //设置接收模式
/*******************************************************************************************/
void SetRxMode(void)
{
TX_EN=0; //设置接收模式
TRX_CE=1; //启动射频接收
Delay(1); // delay for mode change(>=650us)
}
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x58; //选择串口工作方式,打开接收允许
TMOD =0x20; //定时器1工作在方式2,
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TL1 =0xfd;
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
uchar point;
for(point=0;point<5,TI=1;point++) //连续发送5位数据
//把缓存区的数据都发送到串口
{
SBUF=RxBuf[point+2];
while(TI==0);
TI=0;
//Delay(500) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -