天线|RF射频
直播中

冯敬宇

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

NRF24L01+的模块代码分享?

NRF24L01+的模块所有问题在这个帖子讨论吧。我为你们解答。
毕竟玩了有段时间了。
我重新修改了  C  文件和  H  文件,你们下载后,稍微移植下,就可以用了。不会有什么大的问题。
//这次加入了半双工模式
//24L01操作线
#define NRF24L01_GND    0           //24L01电源0v
#define NRF24L01_VCC    3.3         //24L01电源3.3v
#define NRF24L01_CE     CE         //24L01天线使能(高电平有效)
#define NRF24L01_CSN    CSN //spi传输使能(低电平有效)
#define NRF24L01_SCK    SCK //spi时钟(上升沿有效)
#define NRF24L01_MOSI   MOSI//spi输入脚(上位机MO输出,下位机SI输入)
#define NRF24L01_MISO   MISO//spi输出脚(上位机MI输入,下位机SO输出)
#define NRF24L01_IRQ    IRQ //中断脚输出(拉低电平)
//////////////////////////////////////////////////////////////////////////////////         
// 写一个字节,同时读出一个字节
u8 SPI_ReadWriteByte(u8 byte)//[D7:D0][D15:D8]
  {
   u8 i,data;//循环8次
//         SCK=0;//时钟准备
//         CSN=0;//使能spi传输
         data=byte;//数据准备
   for(i=0;i<8;i++)// output 8-bit
      {
        if(data & 0x80)MOSI = 1;// 输出高位逻辑值
                                          else MOSI = 0;
                                delay_us(1);//nrf24l01要>40ns;
        data = (data<<1);       // 丢弃高位,低位补0
        SCK = 1; // SCK 上升沿有效
                                delay_us(1);
                                if((MISO&0x01)==0x01)data|=0x01;
        SCK = 0; // ..then set SCK low again
       }
   return(data); // 输出读取的8位
}
//////////////////////////////////////////////////////////////////////#include "STM32f4xx.h"
#include "stm32f4xx_conf.h"
#include "delay.h"
#include "spi.h"
#include "nrf24l01plus.h"//nrf24L01+无线模块
void HardFault_Handler()
{
}//硬件故障
int main(void)
   {
                 static u8 rxbuf[32]={0};//接收包
                 static u8 txbuf[32]={0};//发送包
     static u8 P,i=0x0f;//P通道地址
                 static u8 temp;//0x07寄存器的值
//                 SystemInit();//时钟初始化
                 delay_init();
                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
////////////////////////////////////////////////////////////
//A.tx-B.p1    B.tx-A.p1
     NRF24L01_bilateral_A_Init();//初始化NRF24L01为上位机A,
//                 NRF24L01_bilateral_B_Init();//初始化NRF24L01 为下位机B
//////////////////////////////////////////////////
                 for(i=0;i<32;i++) txbuf=0x41+i;  //字母A开始//写数据包
                 i=0;
                 
                 while(1)//循环发送
                        {
                                
/////////////////////////
//写数据包
                                txbuf[0]=0x41+(i++);//写数据包//A.B.C.D....
                                if(txbuf[0]>0x41+26-1){txbuf[0]=0x41;i=0;}//Z->A
//       txbuf[0]=0x00;//没有数据要发送
////////////////////////////
                                
                                
//数据 发送成功一次就跳出一次
                                while(1)//发送成功一次跳出
                                {
                                        temp=NRF24L01_bilateral_Pack(rxbuf,txbuf);//接收包优先,后TX数据包
                                        if(temp&1<<6 )//收到数据
                                         {
                                                P=temp>>1;
                                                P=P&0x07;//取出接收通道的编号;
                                                switch(P)//通道
                                                {
                                                        case 0:             break;//通道P0
                                                        case 1:             break;//通道P1
                                                        case 2:             break;//通道P2
                                                        case 3:             break;//通道P3
                                                        case 4:             break;//通道P4
                                                        case 5:             break;//通道P5
                                                        default:            break;//无效
                                                }
                                   }        
                                 if(temp&1<<5)break;//发送成功才跳出;
                                
                        }
                }
}
         
        
        
        

temp.zip (2.66 MB )
51的2401双通讯.zip (132.73 KB )

回帖(26)

陈芳

2020-7-30 09:12:25
有需要帮助的留言。注意看下函数
NRF24L01_bilateral_A_Init();//初始化NRF24L01为上位机A,
//                 NRF24L01_bilateral_B_Init();//初始化NRF24L01 为下位机B
写数据包函数是
j=NRF24L01_bilateral_Pack(rxbuf,txbuf);//接收包优先,后TX数据包
举报

孙奕

2020-7-30 09:18:33
//TX发送模式下,P0被占用,用来接收应答信号,
所以P0接收地址要和发送地址一样。P0的应答必须开启。
举报

高若琰

2020-7-30 09:28:01
刚刚完成nrf24l01的焊接。
请教一下,
这个芯片是否具备查询当前空中所有在线设备的功能?
这个芯片能够进行空中的全双工通讯(类似于全双工也可以)?
这个芯片是通过什么样的机制找到目标并建立通讯的呢,通道?频率?还是其他东西?
举报

h1654155275.5708

2020-7-30 09:40:38
1无法准确查询所有设备,但可以扫描所有频率范围。通过载波检测大概知道当前有多少个设备。
2不能全双工,但可以半双工。A和B可以A发B收也可以B发A收
3通讯默认是使用前设置好帧的。地址频率速度等设置一样才可通讯。
举报

刘丽菲

2020-7-30 09:55:00
感谢回复,你的简单陈述给我了极其重要的一些信息。
那么请允许我继续问。
两个nRF24L01+必须要频率设置相同才可以通讯。(应该是这样吧)
那么同一个频率有三个设备会怎么样,芯片有相关的自动仲裁吗?
据说它的通讯在每个频点上还有若干个通道,这若干的通道可以相互独立使用吗,可以同时使用吗?
它的空中通讯是广播式的还是点对点通讯的?(它支持单播、多播、广播中的哪几种?)
举报

更多回帖

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