📄 nrf905_rx.c
字号:
#include <at89x52.h>
#include <stdio.h>
#include<intrins.h>
#define W_TX_PAYLOAD 0X20//写发射数据命令
#define W_CONFIG 0X00//写配置寄存器命令
#define R_CONFIG 0X10//读配置寄存器命令
#define R_RX_PAYLOAD 0X24//读接受寄存器数据命令
#define R_TX_PAYLOAD 0X21//读发射寄存器数据命令
#define W_TX_ADDRESS 0X22//写发射数据地址命令
sbit TX_EN=P3^7;
sbit TRX_CE=P1^7;
sbit PWR_UP=P1^6;
sbit CD=P3^4;
sbit AM=P3^2;
sbit DR=P3^3;
sbit MISO=P1^5;
sbit MOSI=P1^4;
sbit SCK=P1^3;
sbit CSN=P1^2;
unsigned char state[8]={0,1,2,3,4,5,6,7};
unsigned char code p[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
unsigned char stat=8;
void delay(unsigned int t)
{
while(--t);
}
void nrf905_standby_spi_mode()//待机和SPI编程模式
{
PWR_UP=1;
TRX_CE=0;
}
void nrf905_tx_mode()//发射模式
{
PWR_UP=1;
TRX_CE=1;
TX_EN=1;
}
void nrf905_rx_mode()//接收模式
{
PWR_UP=1;
TRX_CE=1;
TX_EN=0;
}
void spi_write_byte(unsigned char dat)//向SPI写入一个字节数据
{
unsigned char i=0;
for(i=0;i<8;i++)
{
MOSI=((dat>>(7-i))&0x01);
SCK=1;
_nop_();
SCK=0;
}
}
unsigned char spi_read_byte()//从SPI读取一个字节数据
{
unsigned char i=0,state=0;
for(i=0;i<8;i++)
{
state=state<<1;
if(MISO) state++;
SCK=1;
_nop_();
SCK=0;
}
return state;
}
void nrf905_write_config()//配置寄存器初始化
{
unsigned char i=0;
CSN=0;
spi_write_byte(W_CONFIG);
spi_write_byte(0x5f);
spi_write_byte(0x0d);
spi_write_byte(0x44);
spi_write_byte(0x20);
spi_write_byte(0x20);
spi_write_byte(0xe7);
spi_write_byte(0xe7);
spi_write_byte(0xe7);
spi_write_byte(0xdf);
CSN=1;
}
void nrf905_write_txaddr_txload(unsigned char txaddr,unsigned char txload)//写入发射数据地址及其数值
{
unsigned char i=0;
CSN=0;//写地址开始
spi_write_byte(W_TX_ADDRESS);
for(i=0;i<4;i++)
{
spi_write_byte(txaddr);
}
CSN=1;//写地址结束
delay(100);
CSN=0;//写数据开始
spi_write_byte(W_TX_PAYLOAD);
for(i=0;i<32;i++)
spi_write_byte(txload);
CSN=1;
}
void nrf905_tx(unsigned char txaddress,unsigned txpayload)//发射数据最终子程序
{
nrf_standby_spi_mode();//进入SPI编程模式
nrf905_write_txaddr_txload(txaddress,txpayload);//写入发射数据地址及其数值
nrf905_tx_mode();
while(DR==0);//等待数据发送结束
nrf_standby_spi_mode();//转入STANDBY和SPI编程模式
}
void nrf905_read_trxdata(unsigned char *trx_dat0,unsigned char *trx_dat1,unsigned char *trx_dat2,unsigned char *trx_dat3,unsigned char PAYLOAD)//接受数据子程序
{
unsigned char i=0;
nrf905_standby_spi_mode();//进入SPI编程模式
CSN=0;
spi_write_byte(PAYLOAD);
for(i=0;i<8;i++)
{
*(trx_dat0+i)=spi_read_byte();
}
for(i=0;i<8;i++)
{
*(trx_dat1+i)=spi_read_byte();
}
for(i=0;i<8;i++)
{
*(trx_dat2+i)=spi_read_byte();
}
for(i=0;i<8;i++)
{
*(trx_dat3+i)=spi_read_byte();
}
CSN=1;
}
void nrf905_state_read()//读寄存器初始值
{
unsigned char i=0;
nrf905_standby_spi_mode();
CSN=0;
spi_write_byte(R_CONFIG);
for(i=0;i<8;i++)
state[i]=spi_read_byte();
stat=spi_read_byte();
CSN=1;
}
void nrf905_ini() //905初始化程序,STANDBY和SPI编程模式
{
SCK=0;
nrf905_standby_spi_mode();
nrf905_write_config();//配置寄存器初始化
}
void send_com_data() //向串口发送config数据
{
unsigned char i=0;
SBUF='c';while(TI==0);TI=0;
SBUF='o';while(TI==0);TI=0;
SBUF='n';while(TI==0);TI=0;
SBUF='f';while(TI==0);TI=0;
SBUF='i';while(TI==0);TI=0;
SBUF='g';while(TI==0);TI=0;
SBUF=':';while(TI==0);TI=0;//发送字符config:
for(i=0;i<8;i++)//发送回读数据
{
SBUF=p[state[i]/16];
while(TI==0);
TI=0;
SBUF=p[state[i]%16];
while(TI==0);
TI=0;
SBUF=' ';
while(TI==0);
TI=0;
}
SBUF=p[stat/16];while(TI==0);TI=0;
SBUF=p[stat%16];while(TI==0);TI=0;
SBUF=' ';while(TI==0);TI=0;
}
void send_com_trxdata(unsigned char *rx_dat0,unsigned char *rx_dat1,unsigned char *rx_dat2,unsigned char *rx_dat3) //向串口发送接受到的数据
{
unsigned char i=0;
SBUF='r';while(TI==0);TI=0;
SBUF='x';while(TI==0);TI=0;
SBUF='d';while(TI==0);TI=0;
SBUF='a';while(TI==0);TI=0;
SBUF='t';while(TI==0);TI=0;
SBUF='a';while(TI==0);TI=0;
SBUF=':';while(TI==0);TI=0;//发送字符rxdata:
for(i=0;i<8;i++)//发送回读数据
{
SBUF=p[(*(rx_dat0+i))/16];
while(TI==0);
TI=0;
SBUF=p[(*(rx_dat0+i))%16];
while(TI==0);
TI=0;
SBUF=' ';
while(TI==0);
TI=0;
}
for(i=0;i<8;i++)//发送回读数据
{
SBUF=p[(*(rx_dat1+i))/16];
while(TI==0);
TI=0;
SBUF=p[(*(rx_dat1+i))%16];
while(TI==0);
TI=0;
SBUF=' ';
while(TI==0);
TI=0;
}
for(i=0;i<8;i++)//发送回读数据
{
SBUF=p[(*(rx_dat2+i))/16];
while(TI==0);
TI=0;
SBUF=p[(*(rx_dat2+i))%16];
while(TI==0);
TI=0;
SBUF=' ';
while(TI==0);
TI=0;
}
for(i=0;i<8;i++)//发送回读数据
{
SBUF=p[(*(rx_dat3+i))/16];
while(TI==0);
TI=0;
SBUF=p[(*(rx_dat3+i))%16];
while(TI==0);
TI=0;
SBUF=' ';
while(TI==0);
TI=0;
}
}
void main(void)
{
unsigned char a=0,i=0;
unsigned char trx_data0[8]={0,0,0,0,0,0,0,0};
unsigned char trx_data1[8]={0,0,0,0,0,0,0,0};
unsigned char trx_data2[8]={0,0,0,0,0,0,0,0};
unsigned char trx_data3[8]={0,0,0,0,0,0,0,0};
SCON=0x50; //模式1
TMOD=0x20; //定时模式2
//=====19200=======
PCON=0x00; //波特率9600BPS,晶振11.0592MHZ
TH1=0xFD; //
TL1=0xFD; //计数器初值
//================
TI = 0;//串行中断标志位清零
TR1 = 1;//打开计数器1
nrf905_ini(); //nrf905上电,进入STANDBY和SPI编程模式,寄存器配置初始化
while(1) //自由收发段函数,自己任意更改
{
nrf905_rx_mode();
while(DR==0);
nrf905_state_read();
send_com_data();
//nrf905_write_txaddr_txload(0xe7,0x55);
nrf905_read_trxdata(trx_data0,trx_data1,trx_data2,trx_data3,R_RX_PAYLOAD);
send_com_trxdata();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -