大哥些,求助啊。关于NRF24L01+ 的问题,能发送,不能接收

[复制链接]
查看11 | 回复9 | 2021-1-27 06:50:50 | 显示全部楼层 |阅读模式
单片机:STC89C52RC无线模块:NRF24L01+(注意带加号)
本人在网上找了N多代码,就是不能成功。接收端始终接收不到数据包,接收端采用中断方式接收。
就是一个发一个收;
发送端初始化如下:
sbitIRQ=P3^2;
sbitMISO=P1^3;
sbitMOSI=P1^4;
sbitSCK=P1^5;
sbitCSN=P1^6;
sbitCE=P1^7;
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//

发送模式
voidTX_Mode()
{
CE=0;
inerDelay_us(10);
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写入发送地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//为了应答接收设备,接收通道0地址和发送地址相同
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//0x01);//使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPI_RW_Reg(WRITE_REG+RF_CH,0X40);//0x40);//选择射频通道0x40
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//CRC使能,16位CRC校验,上电
CE=1;
inerDelay_us(130);
}
发送函数:
voidnRF24L01_TxPacket(unsignedchar*tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写本地地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//装载数据
CE=1;//置高CE,激发数据发送
inerDelay_us(100);
}

接收端:
sbitIRQ=P3^2;
sbitMISO=P1^3;
sbitMOSI=P1^4;
sbitSCK=P1^5;
sbitCSN=P1^6;
sbitCE=P1^7;
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//

接收模式设置:
voidRX_Mode(void)
{
CE=0;
inerDelay_us(100)
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//0x01);//使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPI_RW_Reg(WRITE_REG+RF_CH,0X40);//0x40);//40);//选择射频通道0x40
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//CRC使能,16位CRC校验,上电,接收模式
CE=1;//拉高CE启动接收设备
inerDelay_us(200);
}
采用中断方式接收。IRQ连接P3^2引脚
voidNRF_IRQ()interrupt0//视乎从来没有进入中断函数
{
cnt++;
sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况
if(RX_DR)//判断是否接收到数据
{
CE=0;//SPI使能
SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer
SPI_RW_Reg(WRITE_REG+STATUS,0xff);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
LCD_Clear();//清屏
LCD_Write_String(1,0,uchartostr(cnt,str))//只是看看收到有没有中断
if(cnt==250)
cnt=1;
Delay(10);
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
接收端配置接收状态后,读一下状态寄存器,确认芯片运行状态
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
读了状态啊,以下十进制状态
STATUS:14
CONFIG:111
FIF0:17
CD:0(偶尔闪到1)
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
问题已经解决,电路问题,加个稳压电容就对了
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
我也是你的问题,发送端一直正常发送,接收端IRQ引脚一直为高电平,就是没有中断产生。。。郁闷啊~楼主真是电源的问题吗???
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
电源杂波影响很大(首先处理好滤波),CE=0后延时100uS有改善、IO口加10K下拉电阻
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
发送端,CE=1后要判一下发送完了吗?发完要关闭CE脚的。否则耗电,也会对下次发送带来影响。
另外2.4G的周边电容很重要,摆放方式尽量按照参考设计来。
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
我的情况和你一样,但是我加了电容之后还是一样,没有解决
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
我的情况和你一样,但是我加了电容之后还是一样,没有解决
回复

使用道具 举报

千问 | 2021-1-27 06:50:50 | 显示全部楼层
我的情况和你一样,但是我加了电容之后还是一样,没有解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行