天线|RF射频
直播中

李云

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

NRF24L01 "Send Failed"的问题怎么解决

原子哥,你的这个代码很智能,没有接收端就会显示”Send Failed“ ,但是我不知道为什么,有没有发送完成 和 有没有接收端有什么关系?他是怎么检测到有没有接收端?

找了很久没找到原因



while(1)

                {                                                             

                        if(NRF24L01_TxPacket(tmp_buf)==TX_OK) //如果发送完成【tmp_buf是发送的数据】

                        {        

                                LCD_ShowString(60,170,"Sended DATA:");        

                                LCD_ShowString(0,190,tmp_buf);         

                                key=mode;

                                for(t=0;t<32;t++)

                                {

                                        key++;

                                        if(key>('~'))key=' ';

                                        tmp_buf[t]=key;        //【将要发送的数据存入tmp_buf[32]数组】

                                }

                                mode++;

                                if(mode>'~')mode=' ';            

                                tmp_buf[32]=0;//加入结束符                   

                        }else

                        {                                                                                           

                                LCD_ShowString(60,170,"Send Failed "); /*【发送数据但是没有接收端会显示失败,为什么?*/

                                LCD_Fill(0,188,240,218,WHITE);//清空上面的显示                           

                        };

                        LED0=!LED0;

                        delay_ms(1500);                                   

                };

回帖(8)

杨丽

2020-5-22 14:46:16

因为启用了自动ACK功能,即发送端发送数据后,必须收到接收端反馈的ACK,才认为发送成功,只要没收到来自接收端的ACK信号,那就认为此次发送失败。
举报

李海玮

2020-5-22 14:53:08


我把自动ACK这段注释了,对程序也没影响......没有接收端还是会显示“Send Failed”...
举报

李猛

2020-5-22 15:08:24

void RX_Mode(void) 



NRF24L01_CE=0;           

          NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 

   

//          NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答【接收到数据产生应答】     

          NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址            

          NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);             //设置RF通信频率            

          NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度              

          NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启    

          NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式  

          NRF24L01_CE = 1; //CE为高,进入接收模式  

}           



void TX_Mode(void) 

{           

NRF24L01_CE=0;             

          NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址  

          NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK           



//          NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答     

          NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址   

          NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 

          NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40 

          NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启    

          NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断 

NRF24L01_CE=1;//CE为高,10us后启动发送 

}       



我把自动ACK这段注释了,对程序也没影响......没有接收端还是会显示“Send Failed”...
举报

刘岩丘

2020-5-22 15:27:51
这个是你要的配置:

void NRF24L01_TX_Mode(void)

{                                                                                                                 

        NRF24L01_CE=0;            

          NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 

          //NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          



          NRF24L01_Write_Reg(WRITE_REG+EN_AA,0);     //关闭通道0的自动应答    

          NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0); //关闭通道0的接收地址  

          NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0);//关闭自动重发送

          NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40

          NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

          NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断

        NRF24L01_CE=1;//CE为高,10us后启动发送

}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分