天线|RF射频
直播中

毛春华

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

请问NRF24L01的应用有哪些?

好,还有发一个包和收一个包数据的代码,给大家帖出来.




//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:发送完成状况

u8 NRF24L01_TxPacket(u8 *txbuf)

{

u8 sta;




NRF24L01_CE=0;




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




NRF24L01_CE=1;//启动发送

  

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




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




   

NRF24L01_Write_Reg(WRITE_REG+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;//其他原因发送失败

}





记住要记住有颜色的这几行.

然后是收一包数据.





u8 NRF24L01_RxPacket(u8 *rxbuf)

{

u8 sta,sta1;

      

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




   

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




Clear_line(18,0,30);

sta1=NRF24L01_Read_Reg(STATUS);

Bit_show(18,11,sta1);







if(sta&RX_OK)//接收到数据

{

NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据

NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器

return 0;

}   

return 1;//没收到任何数据

}








看到没有,和发数据不同,这里不用 NRF24L01_CE=0NRF24L01_CE=1.







如下几点在调试的时候总结出来的:



  1. 如果 TX FIFO 刚好够32个数时,状态寄存器都会显示 0 未满.如再丢进去就会说满了.

  2. 重启计算机时要记住重起一下NRF24 因为里边的数据还是之前的,除非重写一次.

  3. 中断位是要写1清0的.

  4. 如果地址都相同,读出来数据的是频道号数最大的那个频道.就是接收5通道. 大家可以做下实验,看对不对.

  5. 频道2~5只需写一个8位的地址就行.

  6. 有时中断产生了,但RX_FIFO会为0,要重读一次.



好了.大家如还发现什么都发到帖上去吧.

我丢上两个代码给大家试试.压缩的文件.

TX_COM_NRF2401_TEXT.rar (634.36 KB )
RX_COM_NRF2401_TEXT.rar (635.46 KB )

回帖(24)

云达贞

2020-4-24 04:53:34
我的代码如大家只有一台机,可以玩玩读写里边的寄存器.玩这玩意要两台机的,要不也能用现成的51搞个.
举报

张琳

2020-4-24 05:04:51
我在室内试过,十多米内没有墙是没有问题的.有墙就不行了,拐个弯都不行.

举报

李海洪

2020-4-24 05:18:00
要远点的就玩NRF905吧.有空我帖代码给大家玩玩.

举报

朱红艳

2020-4-24 05:23:12
靠呀,升到两钻级了.祝贺一下.
举报

更多回帖

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