新闻中心

EEPW首页>嵌入式系统>设计应用> NRF24L01接收程序(单片机是STC89C52)

NRF24L01接收程序(单片机是STC89C52)

作者: 时间:2016-11-27 来源:网络 收藏
#include

#include
typedef unsigned int uint;
typedef unsigned char uchar;

本文引用地址: //m.amcfsurvey.com/article/201611/322560.htm

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 8
#define RX_DATA_WITDH 8

#define R_REGISTER0x00// 读寄存器
#define W_REGISTER0x20// 写寄存器
#define R_RX_PLOAD0x61// 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD0xA0// 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式
#define FLUSH_TX0xE1// 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX0xE2// 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3// 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP0xFF// 空操作,可以用来读状态寄存器

#define CONFIG0x00// 配置寄存器
#define EN_AA0x01// “自动应答”功能寄存器
#define EN_RX_ADDR0x02// 接收通道使能寄存器
#define SETUP_AW0x03// 地址宽度设置寄存器
#define SETUP_RETR0x04// 自动重发设置寄存器
#define RF_CH0x05//射频通道频率设置寄存器
#define RF_SETUP0x06// 射频设置寄存器
#define STATUS0x07// 状态寄存器
#define OBSERVE_TX0x08// 发送检测寄存器
#define CD0x09// 载波检测寄存器
#define RX_ADDR_P00x0A// 数据通道0接收地址寄存器
#define RX_ADDR_P10x0B// 数据通道1接收地址寄存器
#define RX_ADDR_P20x0C// 数据通道2接收地址寄存器
#define RX_ADDR_P30x0D// 数据通道3接收地址寄存器
#define RX_ADDR_P40x0E// 数据通道4接收地址寄存器
#define RX_ADDR_P50x0F// 数据通道5接收地址寄存器
#define TX_ADDR0x10// 发送地址寄存器
#define RX_PW_P00x11// 数据通道0有效数据宽度设置寄存器
#define RX_PW_P10x12// 数据通道1有效数据宽度设置寄存器
#define RX_PW_P20x13// 数据通道2有效数据宽度设置寄存器
#define RX_PW_P30x14// 数据通道3有效数据宽度设置寄存器
#define RX_PW_P40x15// 数据通道4有效数据宽度设置寄存器
#define RX_PW_P50x16// 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17// FIFO状态寄存器
//*********************************************************************************
ucharsta;// 状态变量
#define RX_DR(sta & 0x40)// 接收成功中断标志
#define TX_DS(sta & 0x20)// 发射成功中断标志
#define MAX_RT (sta & 0x10)// 重发溢出中断标志

sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
sbitLED=P0^0;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar RX_Buffer[RX_DATA_WITDH];

void _delay_us(uint x)
{
uint i,j;
for (j=0;j for (i=0;i<12;i++);
}

void _delay_ms(uint x)
{
uint i,j;
for (j=0;j for (i=0;i<120;i++);
}
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
}

uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
MOSI=1;
else
MOSI=0;
byte<<=1;
SCK=1;
if(MISO)
byte|=0x01;
SCK=0;
}
return byte;
}

uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return status;
}

uchar SPI_R_byte(uchar reg)
{
uchar status;
CSN=0;
SPI_RW(reg);
status=SPI_RW(0);
CSN=1;
return status;
}

uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i {
Dat_Buffer[i]=SPI_RW(0);
}
CSN=1;
return reg_value;
}

uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i {
SPI_RW(TX_Dat_Buffer[i]);
}
CSN=1;
return reg_value;
}

void nRF24L01_Set_RX_Mode(void)
{
CE=0;//待机
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0);
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//0db,lna
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);

CE=1;
_delay_ms(5);
}

uchar nRF24L01_RX_Data(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_RX);
CSN=1;
return 1;
}
else
return 0;

}


void main(void)
{
uchar i;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
_delay_us(1000);
nRF24L01_Init();
while(1)
{
nRF24L01_Set_RX_Mode();
_delay_ms(100);
if(nRF24L01_RX_Data())
{
LED=0;//如果有数据收到灯亮
}
else//否则灯熄
LED=1;
}
}



评论


技术专区

关闭