NRF24L01一对多通信中通道地址设定注意事项

本篇博文接着上一篇做补充,还是用上一篇博文中通信模型做分析;

这里我们将RX一端视为接收端(服务端),TX1-6视为6个发送端(客户端)。

一、收发端需要共同之处

1、收发端单方向上工作频率要一致,即当服务端发送——>客户端接收或客户端发送——>服务端接收,单方向上的频率要一致;

如:服务端发送:NRFWriteReg(WRITE_REGISTER+RF_CH,0x40);

       客户端接收:NRFWriteReg(WRITE_REGISTER+RF_CH,0x40);

---------------------------------------------------------------------------------------------------------------

      客户端发送:NRFWriteReg(WRITE_REGISTER+RF_CH,0xaa);

      服务端接收:NRFWriteReg(WRITE_REGISTER+RF_CH,0xaa);

---------------------------------------------------------------------------------------------------------------

两个方向上的工作频率可以不同,这样可以有效避免客户端与客户端之间的数据干扰;

2、发送方和接收方的数据宽度要一致;

如:

发送方:NRFWriteTxDate(WR_TX_PLOAD,TxDate,DATA_WIDTH);

接收方:NRFWriteReg(WRITE_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);

其中DATA_WIDTH等于RX_PLOAD_WIDTH(<=32)

3、发射速率与发射功率须一致;

如:NRFWriteReg2(WRITE_REGISTER+RF_SETUP,0x07);  //数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

二、服务端配置需要注意的地方(关键)

假设服务端发送地址和接收地址如下:

#define TX_ADR_WIDTH  5
#define RX_ADR_WIDTH  5
u8 TxAddr0[TX_ADR_WIDTH]= {0xE7,0xD3,0xF0,0x35,0x77};   
u8 TxAddr1[TX_ADR_WIDTH]= {0xC2,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr2[TX_ADR_WIDTH] = {0xC3,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr3[TX_ADR_WIDTH]=  {0xC4,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr4[TX_ADR_WIDTH] = {0xC5,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr5[TX_ADR_WIDTH]=  {0xC6,0xC2,0xC2,0xC2,0xC2};     

u8 RxAddr0[RX_ADR_WIDTH]= {0xE7,0xD3,0xF0,0x35,0x77};  
u8 RxAddr1[RX_ADR_WIDTH]= {0xC2,0xC2,0xC2,0xC2,0xC2};  
u8 RxAddr2[1] ={0xC3};
u8 RxAddr3[1] ={0xC4};
u8 RxAddr4[1] ={0xC5};
u8 RxAddr5[1] ={0xC6};

1、设置频道0-5,自动ACK应答;

如:NRFWriteReg(WRITE_REGISTER+EN_AA,0x3f);

2、设置接收通道全部允许;

如:NRFWriteReg(WRITE_REGISTER+EN_RXADDR,0x3f);

3、给特定通道发送数据时(假设通道2),发送地址寄存写入5Byte字节,同时还得将接收通道0地址寄存器设置与发送地址一致;(应答机制使然)

如:NRFWriteTxDate(WRITE_REGISTER+TX_ADDR,TxAddr2,TX_ADR_WIDTH);

       NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P0,TxAddr2,TX_ADR_WIDTH);

4、接收各个通道数据时,各个接收通道地址寄存器需要设置与客户端的发送地址一致,其中接收通道0和接收通道1必须不同(5Byte),而接收通道2-5只需写入一个字节就好;

如:

    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P0,TxAddr0,TX_ADR_WIDTH);  
    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P1,TxAddr1,TX_ADR_WIDTH); 
    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P2,TxAddr2,1);   
    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P3,TxAddr3,1);  
    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P4,TxAddr4,1);  
    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P5,TxAddr5,1);
   

三、客户端配置需要注意的地方(关键)

客户端的发送地址与接收地址和服务端一致:

#define TX_ADR_WIDTH  5
#define RX_ADR_WIDTH  5
u8 TxAddr0[TX_ADR_WIDTH]= {0xE7,0xD3,0xF0,0x35,0x77};   
u8 TxAddr1[TX_ADR_WIDTH]= {0xC2,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr2[TX_ADR_WIDTH] = {0xC3,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr3[TX_ADR_WIDTH]=  {0xC4,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr4[TX_ADR_WIDTH] = {0xC5,0xC2,0xC2,0xC2,0xC2};   
u8 TxAddr5[TX_ADR_WIDTH]=  {0xC6,0xC2,0xC2,0xC2,0xC2};  
  

u8 RxAddr0[RX_ADR_WIDTH]= {0xE7,0xD3,0xF0,0x35,0x77};  
u8 RxAddr1[RX_ADR_WIDTH]= {0xC2,0xC2,0xC2,0xC2,0xC2};  
u8 RxAddr2[1] ={0xC3};
u8 RxAddr3[1] ={0xC4};
u8 RxAddr4[1] ={0xC5};
u8 RxAddr5[1] ={0xC6};
 

而一个客户端只对应其中一个发送地址,接收通道亦可以全部打开允许接收数据。

1、向发送地址寄存器写入本客户端的发送地址(5Byte),同时,同时还得将接收通道0地址寄存器设置与发送地址一致;(应答机制使然)

如客户端1:NRFWriteTxDate(WRITE_REGISTER+TX_ADDR,TxAddr1,TX_ADR_WIDTH);
                    NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P0,TxAddr1,TX_ADR_WIDTH);

2、接收来自服务端的数据时,因为服务端只有一个,其发送地址就是唯一的,所以在客户端的接收通道配置中只配置通道0接收允许,且接收通道0接收地址寄存器写入的地址与服务端发送地址一致即可;

如:NRFWriteTxDate(WRITE_REGISTER+RX_ADDR_P0,TxAddr0,TX_ADR_WIDTH);
       NRFWriteReg(WRITE_REGISTER+EN_AA,0x01);//使能接收通道0自动应答
       NRFWriteReg(WRITE_REGISTER+EN_RXADDR,0x01);//使能接收通道0

2023/4/26  今日将我前面实际开发的项目工程无私贡献给大伙,仅供参考,是采用了收发中断处理的方式,任意通道都可独立收发,工程比较大,可先从中断处理exit.c中入手理解。

链接:https://pan.baidu.com/s/1AT6yZKSfY_KzJbJw3XnMNg 
提取码:c35n

  • 14
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值