要想24L01多通道通讯成功,务必先单通道调试成功,并且懂得这块芯片通讯的一些基本知识。
 
一、基本的通讯条件
1、接收端的接收地址(RX_ADDR_Px)等于发射端的发射送地址(TX_ADDR)
2、收发端的频道一致(RF_CH)
3、收发端的发射参数一致(RF_SETUP)
 
二、收发模式初始化的基本步骤
Rx端初始化步骤:
1)写 Rx 节点的地址 RX_ADDR_Px
2)使能 AUTO ACK  EN_AA
3)使能通道的接收地址 EN_RXADDR
4)选择通信频率 RF_CH
5 ) 选择通道有效数据宽度  Rx_Pw_Px
6)配置发射参数(低噪放大器增益、发射功率、无线速率)  RF_SETUP
7)配置 24L01 的基本参数以及切换工作模式 CONFIG
Tx端初始化步骤:
1)写 Tx 节点的地址 TX_ADDR
2)写 RX通道P0 的地址 用ACK应答 RX_ADDR_P0
3)使能自动应答 EN_AA
4)使能通道接收地址 EN_RXADDR
5)配置自动重发次数 SETUP_RETR
6)选择通信频率 RF_CH
7)配置发射参数(低噪放大器增益、发射功率、无线速率)  RF_SETUP
8 ) 选择通道有效数据宽度  Rx_Pw_Px
9)配置 24L01 的基本参数以及切换工作模式 CONFIG
 
三、多通道通讯关键代码
接收端:
 
const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
//使用通道0和1通讯接收模式
//设置RX地址,写RX数据宽度,选择RF频道
//当CE变高后,即进入RX模式,并可以接收数据了
void NRF24L01_RX_Mode(void)
{
    NRF24L01_CE=0;   
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//写P0的Rx节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写P1的Rx节点地址 
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);    //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能所有通道的接收地址  
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置RF通信频率      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道1的有效数据宽度       
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启  
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
    NRF24L01_CE = 1; //CE为高,进入接收模式
    delay_us(130);
}   1234567891011121314151617181920212223
发送端0:
 
const u8 TX_ADDRESS0[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x00}; //发送地址
//**发送端0初始化代码,使用通道0进行通讯:**
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道
void NRF24L01_TX_Mode(void)
{                                                       
    NRF24L01_CE=0;     
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS0,TX_ADR_WIDTH);//写TX节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS0,RX_ADR_WIDTH); //设置RX_ADDR_P0的地址,为了使能ACK
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址 
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
    NRF24L01_CE=1;//CE为高,10us后启动发送
    delay_us(10);
}123456789101112131415161718192021
发送端1:
 
const u8 TX_ADDRESS1[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x01}; //发送地址
//**发送端1初始化代码,使用通道1进行通讯:**
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道
void NRF24L01_TX_Mode(void)
{                                                       
    NRF24L01_CE=0;     
    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//写TX节点地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS1,RX_ADR_WIDTH); //设置RX_ADDR_P0的地址,为了使能ACK    
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址 
    NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
    NRF24L01_CE=1;//CE为高,10us后启动发送
    delay_us(10);
}1234567891011121314151617181920
 
四、多通道通讯关键点
1、发送端数据通道0被用做接收应答信号,因此不同通道发射端都要必须使能RX_ADDR_P0,因此需要把发送端地址写入里面。(当然除非关掉应答)
2、使能第N个​的通道,前N个通道也必须被使能。
3、2~5通道与通道1共用高32位(4字节)地址,只有低8位(1字节)可以改变,且绝不能一样,如下:
 
const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
const u8 RX_ADDRESS2[] = {0x02,0xff,0xff,0xff,0x01};//通道2地址
const u8 RX_ADDRESS3[] = {0x03,0xff,0xff,0xff,0x01};//通道3地址
const u8 RX_ADDRESS4[] = {0x04,0xff,0xff,0xff,0x01};//通道4地址
const u8 RX_ADDRESS5[] = {0x05,0xff,0xff,0xff,0x01};//通道5地址123456
PS:如果地址宽度是2(16位),那么高8位(1字节)共用,低8位(1字节)不同。
4、接收端写各通道地址时候,必须先从低通道(通道0开始)开始写,使能地址宽度也是。
 
NRF24L01作为一块低价格、入门级无线通讯芯片,自身限制还是挺多的,稳定组网还是有一定的难度,还不够成熟于物联网领域,做点小作品还是可以的。           
      
                     
 
 
 
       
              
               
               NRF24L01模块----6通道通讯测试
---------------------
作者:爱面条的可达
来源:CSDN
原文:https://blog.csdn.net/haha1fan/article/details/78843080
版权声明:本文为博主原创文章,转载请附上博文链接!

NRF24L01多对一、多通道通讯关键代码的更多相关文章

  1. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

  2. 在android程序中加入widget(窗口小部件)并与之交互的关键代码

    摘要: widget(窗口小部件)可以增强应用程序的交互性, 是很多应用中都会用到的功能,本文不求大而全,但是会给出程序与widget交互的关键代码 正文: 其实widget是嵌入(embedded) ...

  3. 实现手电筒Flash Light 关键代码

    实现手电筒Flash Light 关键代码 实现Flash的逻辑 view.setOnClickListener(new OnClickListener() { @Override public vo ...

  4. Android之打开闪光灯关键代码

    在AndroidManifest中注册相应的权限: <uses-permission android:name="android.permission.FLASHLIGHT" ...

  5. easyui-datagrid通过action从数据库获取数据的关键代码

    实际上是结合struts2来从数据获取json格式的数据.   关键代码: GetUserAction.java代码   package com.log.control; import java.io ...

  6. Android中弹出对话框,AlertDialog关键代码

    写在这里便于以后查看. Android中弹出对话框的关键代码: btn01.setOnClickListener(new OnClickListener() { @Override public vo ...

  7. 分享非常有用的Java程序(关键代码)(七)---抓屏程序

    原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...

  8. 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)

    原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...

  9. 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map

    原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...

随机推荐

  1. app1----攻防世界

    啥也不说把题目下载下来,在模拟器里运行一下 输入正确的key就是flag 继续下一步分析,可以使用Androidkiller分析,我喜欢使用jeb这里我就使用jeb进行分析 找到MainActivit ...

  2. C++面试常见问题——16函数模板的使用

    函数模板的使用 函数模板在使用之前必须在外部对函数模板进行初始化. 函数模板的实例化包含两中 1.隐式实例化: template <class T> //没有: T Fun(T a,T b ...

  3. 洛谷 P1929 迷之阶梯

    题目传送门 解题思路: f[i]表示跳到第i层的最少移动次数,如果可以从下面一级跳上来,那么直接跳上来,如果跳不上来,那就往后退,退到不能退或能跳上第i层 AC代码: #include<iost ...

  4. dwr??

    官方网站:http://directwebremoting.org/dwr/index.html http://m.blog.csdn.net/u013628152/article/details/5 ...

  5. 怎样设置使IntelliJ IDEA智能提示忽略大小写?

    打开设置(CTRL+ALT+S)打开editor,找到“Code Completion”->点击Match case前面的框不勾选即可.如下图:

  6. docker安装并设置开机启动(Linux)

    docker 开机启动: systemctl enable docker 使用的linux系统为CentOS7.2 docker分为CE和EE版本,EE版本收费,一般我们使用CE版本就满足要求了 do ...

  7. 使用WinDbg分析蓝屏dump原因

    大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...

  8. 动态弹出框,iframe的name包含一串随机数

    由于name是随机的,要定位name比较困难,此处由于iframe的标签是唯一的,所以可以用tag_name定位 framename=driver.find_element_by_tag_name(& ...

  9. asp.net数据库增删改查demo

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. 040-PHP使用闭包函数来进行父实例的变量自增,正确示例

    <?php // 如何使用闭包函数来进行父实例的变量自增 function demo(){ $num = 1; # 给use的变量加个&符合,就能改变对应参数的域的限制 $func = ...