zoukankan      html  css  js  c++  java
  • NRF24L01多对一、多通道通讯关键代码

    要想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
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    如何实现Echart不刷新页面,多语言切换下的地图数据重新加载,api请求数据加载,soketed数据实时加载
    web开发中各种宽高
    http请求方式和传递数据类型
    Hexo之傻瓜攻略
    SQL2008 R2安装功能选择
    Windows Server2012 R2中安装SQL Server2008
    用户权限管理数据库设计
    C#生成缩略图 (通用模式)
    CAD习题集
    菜鸟学习MVC实录:弄清项目各类库的作用和用法
  • 原文地址:https://www.cnblogs.com/anandexuechengzhangzhilu/p/10706426.html
Copyright © 2011-2022 走看看