天线|RF射频
直播中

刘柳

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

请教大家两个关于NRF2401的两个问题?


        这是发送机的TX_MODO配置



        void NRF24L01_TX_Mode(void)

{               

NRF_CE=0;     

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

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

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

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

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

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

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

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

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

}



        



         



        这是发送函数



          u8 NRF24L01_TxPacket(u8 *txbuf)

{

u8 sta;   

NRF_CE=0;

  NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节

  NRF_CE=1;//启动发送   

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

sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值

NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志

if(sta&MAX_TX)//达到最大重发次数

{

  NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器

  return MAX_TX;

}

if(sta&TX_OK)//发送完成

{

  return TX_OK;

}

return 0xff;//其他原因发送失败

}



        



        接收板用的是原子哥的战舰开发板。程序也是自带的。



        无论自动重发次数是多少都会出现以下两种情况。



        主机每次上电第一次发送总是收到不到数据,反回的值是达到最大发送次数。



        以后发送的时候就可以成功了,返回的值也是达到最大发送次数



        请各位大神帮忙分析下。



        


回帖(5)

洪禹

2020-6-3 15:51:09
可别沉了
举报

蔡烁坚

2020-6-3 16:03:44
发送返回状态的问题已经解决了,将发送函数中的

查询延时while(NRF_IRQ!=0);//等待发送完成

改为软件延时Delay10us();可解决返回函数总是达到最大发送次数的问题。



可是又引发了一个新的问题。上电第一次发送失败,返回值 达到最大发送次数;第二次发送失败,返回值0xff ,第三次开始就可以正常通信了,返回值0x20
举报

乐骞添

2020-6-3 16:16:25
回复【3楼】wfy9041:

------------------------------你好 问一下 为什么2401检测总是失败 谢谢
举报

高敏兰

2020-6-3 16:33:37
用发烧友的代码跟你遇上同一个问题。。。
不能改成延时10us的
举报

更多回帖

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