天线|RF射频
直播中

傅琦

7年用户 207经验值
私信 关注
[问答]

NRF24L01发送失败的原因是什么?

根据网上给出的调试NRF24L01的方法,首先调试发送程序,

进行如下处理:


 SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);          // 关闭通道0自动应答
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);     // 关闭接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   // 关闭自动重发[/mw_shl_code]



并写函数获得STATUS和FIFO_STATUS的值


u8 NRF_Get_State(void)
{
u8 status;
status=NRF24L01_Read_Reg(READ_REG_NRF+STATUS);
return status;
}
u8 NRF_Get_FIFOState(void)
{
u8 FIFO_status;
FIFO_status=NRF24L01_Read_Reg(READ_REG_NRF+NRF_FIFO_STATUS);
return FIFO_status;
}[/mw_shl_code]





在主函数中进行验证:


[C] 纯文本查看 复制代码
if(sta==0x2e)  {  LED1=0; }if(FIFO_sta==0x11){LED2=0;}





实验发现两盏灯都没有亮,说明发送失败了。

其余部分的NRF程序都是直接从原子的例程拷贝的,在线调试时全速运行发现程序的确卡死在这里了,

while(NRF24L01_IRQ!=0);//等待发送完成

但是当我单步运行的时候发现程序正常运行过这里,且在单步调试过程中,两盏灯都是能亮起来的。

为什么单步运行和全速运行结果不同呢?



注:NRF24L01_Check检测到连接已经成功了



下面附上我的main函数


int main(void)
{
        u8 temp_buf[33]={0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,                         0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x07};
        u8 sta;
        u8 FIFO_sta;
        LED_Init();
        NRF24L01_Init();        
        while(NRF24L01_Check())
        {
                LED3=0;  
                Delay_1us(5000);
                LED3=1;
                Delay_1us(5000);
        }
        TX_Mode();
        while(1)
        {
                NRF24L01_TxPacket(temp_buf);
                sta=NRF_Get_State();
                FIFO_sta=NRF_Get_FIFOState();
                if(sta==0x2e)
                {
                        LED1=0;
                }
                if(FIFO_sta==0x11)
                {
                        LED2=0;
                }
                NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,0XFF);
                Delay_10us(10);
        }
}
[/mw_shl_code]

不知道到底怎么解决这个问题,大家有遇到这种情况么?应该怎么解决呢?求指教!谢谢!

回帖(17)

杨红

2020-6-13 07:51:05
找到原因了,是STATUS的值弄错了,应该是0x0e灯就可以亮了~
举报

张新里

2020-6-13 07:57:40
刚刚重新研究下调试教程,感觉自己理解错误了,教程里面说的是



我们可以通过读取STATUS的值来判断是哪个事件触发了中断,寄存器4、5、6位分别对应自动重发完成中断,数据发送完成中断,数据接收完成中断。也就是说,在之前的配置下,如果数据成功发送,那么STATUS的值应该为0x2e。这样就可以作为一个检测标准,另外一个标准可以看FIFO_STATUS寄存器,第5位的描述:发送缓冲器满标志,1为满,0为有可用空间;第4位的描述:发送缓冲器空标志,1为空,0为有数据;同样可以看到接收缓冲器的对应标志。这样在数据发送成功后,发送寄存器当然应该是空的,接收缓冲因为在之前已经失能,所以也应该是空,也就是说成功发送之后的FIFO_STATUS寄存器值应该是0x11。 



也就是说,应该是使能重发等参数的时候,有STATUS=0x2e,
所以就将以下配置改回来了


[C] 纯文本查看 复制代码
NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); 
[C] 纯文本查看 复制代码
NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); 
[C] 纯文本查看 复制代码
NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);



发现LED2是亮了,证明FIFOSTATUS的值的确是0x11

但是LED1还是不亮的,即无论上述三个参数是否使能,STATUS都不能得到0x2e的值

请问是不是我对上面教程中的话理解错误了呢?

到底什么时候才有STATUS=0X2E FIFOSTATUS=0X11?

是不自动重发失能应答和接收地址的时候?还是自动重发且使能自动应答和接收地址的时候??


发现LED2是亮了,证明FIFOSTATUS的值的确是0x11

但是LED1还是不亮的,即无论上述三个参数是否使能,STATUS都不能得到0x2e的值

请问是不是我对上面教程中的话理解错误了呢?

到底什么时候才有STATUS=0X2E FIFOSTATUS=0X11?

是不自动重发失能应答和接收地址的时候?还是自动重发且使能自动应答和接收地址的时候??
举报

魏渝韦

2020-6-13 08:09:27
帮顶....
举报

李佳

2020-6-13 08:24:08
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

任娟娟

2020-6-13 08:42:16

原子哥,我nRF24L01开启自动应答,但是TX_DS一直不置位,这有没有什么原因?基本的读写函数是没问题的,写进去读出来没问题,使用的模拟SPI
举报

更多回帖

相关问答

nRF24L01
发帖
登录/注册
×
20
完善资料,
赚取积分