OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9885|回复: 28

关于NRF24L01一对多的讨论

[复制链接]

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
发表于 2018-5-15 20:42:27 | 显示全部楼层 |阅读模式
每个NRF24L01有六个接收通道, 可以实现6发1收,即每个接收通道对应一个NRF24L01的发,
非常适合1主6从进行通信,

这一点在用户数据手册中有专门介绍,

我的问题是: 能不能配置成一发多收?
即某NRF24L01只发送一次报文,
多个NRF24L01可以同时收到, 类似于广播方式.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-15 20:43:43 | 显示全部楼层
为什么发帖之后看不着?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

34

主题

388

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4081
金钱
4081
注册时间
2012-10-21
在线时间
642 小时
发表于 2018-5-15 21:29:13 | 显示全部楼层
地址设置相同,信号相同等,发送端发送,所有接收端都可以接收到,本来就是一个广播的模式
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-15 22:02:52 | 显示全部楼层
PCA 发表于 2018-5-15 21:29
地址设置相同,信号相同等,发送端发送,所有接收端都可以接收到,本来就是一个广播的模式

话虽这么说,
但这个东东有ACK自动应答,
一发多收的话, 由谁来发ACK呢?
要把ACK关掉吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-17 07:56:20 | 显示全部楼层
实测了一下,
要实现1发多收,
必须将所有NRF24L01的自动应答关闭
只要网中有一个NRF24L01有自动应答,
就会造成全网的瘫痪.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-17 08:08:48 | 显示全部楼层
warship 发表于 2018-5-17 07:56
实测了一下,
要实现1发多收,
必须将所有NRF24L01的自动应答关闭

这个与我原来的想法有出入,
其实我并不是想完全做成广播模式,
我的应用类似于:
首先有两个NRF24L01正常通信,
一个为从机, 采集各种信息发回主机,并接收遥控
一个为主机, 接收显示从机采集的信息, 并控制从机的动作
这两个NRF24L01要可靠通信, 所以最好有ACK自动应答机制
后来, 又要增加一个基本属于旁听监视的终端,
其实不需要它发射, 只要能够接收到前两者的信息,主要是从机的采集信息,
并且能够根据采集信息作出一些自身反应.
于是想着只把它设为不自动应答,
反正接收通道号与前二者相同,
按照道理应该可以收到信息,
结果不行.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-17 08:12:30 | 显示全部楼层
这样都关闭ACK后,
虽然可以互相收到信息了
但与我的初衷已经不同.
前两个NRF24L01不能确保可靠通信了.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-17 08:14:00 | 显示全部楼层
在这种情况下,
要保证前二者的可靠通信,
必须人工设置应答确认.


我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-17 08:17:08 | 显示全部楼层
warship 发表于 2018-5-17 07:56
实测了一下,
要实现1发多收,
必须将所有NRF24L01的自动应答关闭

事实上,
将所有NRF24L01的自动应答关闭后,
不光是可以1对多,
N个NRF24L01已经组成了一个网状网,
只要距离范围内,
没有干扰的情况下,
任何一个NRF24L01发送信息,
所有其它NRF24L01都可以收到.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-18 13:29:18 来自手机 | 显示全部楼层
初看了一下英文手册,有ack和无ack时的数据帧都是不同的,所以二者无法在同一个系统里混用
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-18 13:32:33 来自手机 | 显示全部楼层
作为新型24L01,其亮点就是ack自动应答协议,无须CPU的参与,实现可靠地无差错传输,弃之不用是相当可惜的
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-19 14:31:38 | 显示全部楼层
关于一对多, 手册上有如下例子:
发送方:  (共六个发送方)                           接收方 PRX 只有一个, 但有六个接收通道
PTX1: TX_ADDR: 0xB3B4B5B6F1   -->      Addr Data Pipe 0 ( RX_ADDR_P0: 0xB3B4B5B6F1)
   RX_ADDR_P0: 0xB3B4B5B6F1   <--  应答   
PTX2: TX_ADDR: 0xB3B4B5B6F0   -->      Addr Data Pipe 1 ( RX_ADDR_P1: 0xB3B4B5B6F0)
   RX_ADDR_P0: 0xB3B4B5B6F0   <--  应答     
PTX3: TX_ADDR: 0xB3B4B5B6F7   -->      Addr Data Pipe 2 ( RX_ADDR_P2: 0xB3B4B5B6F7)
   RX_ADDR_P0: 0xB3B4B5B6F7   <--  应答     
PTX4: TX_ADDR: 0xB3B4B5B6F5   -->      Addr Data Pipe 3 ( RX_ADDR_P3: 0xB3B4B5B6F5)
   RX_ADDR_P0: 0xB3B4B5B6F5   <--  应答
PTX5: TX_ADDR: 0xB3B4B5B6F4   -->      Addr Data Pipe 4 ( RX_ADDR_P4: 0xB3B4B5B6F4)
   RX_ADDR_P0: 0xB3B4B5B6F4   <--  应答      
PTX6: TX_ADDR: 0xB3B4B5B6F6   -->      Addr Data Pipe 5 ( RX_ADDR_P5: 0xB3B4B5B6F6)
   RX_ADDR_P0: 0xB3B4B5B6F6   <--  应答
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-19 14:52:17 | 显示全部楼层
(接上楼)
上楼左侧是六个终端(标记为发送方), 右侧是一个终端(标记为接收方)
六个发送方对一个接收方, 按上述地址就可以工作了.
但问题是:  通信不是单向的, 右侧的所谓接收方,它也是要发送数据的.
假如它要向PTX1主动发送数据:
按照自动接收ACK应答的模式, 它必须这样配置:
RX_ADDR_P0的地址: 0xB3B4B5B6F1   
发送地址寄存器TX_ADDR:  0xB3B4B5B6F1
从上表可知它现有状态就是如此, 所以它可以正常向PTX1回传数据

但是,假如它现在要向PTX2主动发送数据:
按照自动接收ACK应答的模式, 它必须这样配置:
RX_ADDR_P0的地址要改成: 0xB3B4B5B6F0   
发送地址寄存器TX_ADDR也必须置成:  0xB3B4B5B6F0
这样配置后它就已经不能正常接收PTX1发送的数据了,
所以必须轮询工作才行.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-19 15:29:53 | 显示全部楼层
所以, 一对六的双向通信可以这样进行:
常态下,地址按12楼,也就是用户手册的示例配置:
这个时候, 接收方可以接收六个发送方传送的数据并正常回执(ACK)
同时, 接收方也可以主动向PTX1回传数据,
当接收方需要向其它的PTX回传数据时,
就需要把自己的0号接收通道(当然TX_ADDR也要)临时改变成对方的发送通道地址,
回传数据完毕后,马上把地址恢复成常态.
这种工作方式, 也算不上真正的轮询,
但它的效率比较高, 无须在软件上搞轮询机制,
六个发送方的软件也无须特别的改造,
实现起来非常容易.

唯一的缺点是, 如果六个发送方上传的业务量都非常大时,
可能会增加空中碰撞的机会,
这时候可能就需要设计真正的轮询流程,
由接收方来主动点名轮流发送了.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-19 20:53:59 | 显示全部楼层
刚刚编程验证了我以上的想法,
不过刚开始时有一个小问题卡了我半个小时,
那就是存放地址的数组:
一定要注意低位在前, 比如:
unsigned char TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
实际地址是:0x0110104334, 希望对来看此帖者提前心中有数.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

20

主题

228

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-5-19 21:25:11 | 显示全部楼层
软件处理就好了,最好添加应答机制。否则。。。会丢包
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-20 07:13:46 | 显示全部楼层
SimpleLife 发表于 2018-5-19 21:25
软件处理就好了,最好添加应答机制。否则。。。会丢包

你说得非常对,
无线与有线不同,
丢包很正常,
如果想要可靠传输,
必须具备差错控制措施,
要么应用软件处理,
要么利用2401原有的ACK返回重传机制.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-20 10:31:32 | 显示全部楼层
六发一收时, 在主接收的24L01的状态寄存器中,
第3到1位        (RX_P_NO)即接收数据通道号。000-101:数据通道号0-5、110: 保留、111: RX FIFO 寄存器为空
从这里可以知道, 接收到的数据是来自哪个通道, 即来自哪个24L01?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-20 10:49:25 | 显示全部楼层
为提高效率, 建议所有的24L01的接收和发送均采用中断方式
这样在主程序中无须等待,
只须检查相关标志就行了.
等我调试优化后, 会贴出中断服务程序
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-21 13:43:15 | 显示全部楼层
Flush RX FIFO, used in RX mode Should not be executed during transmission of acknowledge, that is, acknowledge package will not be completed.
这个陷阱又坑了我半天, 后来在网上找到了前人的帖子,
方才解决了莫名其妙的问题.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-21 14:09:23 | 显示全部楼层
莫名其妙的问题记录如下:
一个终端采集各种数据, 向另外两个终端时不时传送采集数据,
刚开始时,都很正常,
两个终端都能收到数据,
但一段时间后, 某一终端就再也接收不到数据了,
严重时两个终端均接收不到数据,
而数据被证实一直有在发送.
这时候, 如果收不到信号的终端临时转为发, 回传一下数据
必然会发生最大次数重发中断, 然后就可恢复到能正常接收.
一段时间后又是如此重复.
刚开始我以为是最大次数重发中断方面的问题,
折腾了半天均无果, 直接导致我怀疑人生!!!
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-1-20
在线时间
1 小时
发表于 2018-5-21 14:09:59 | 显示全部楼层
关闭自动ACK会丢包,距离越远丢包越明显。而且实测通信距离会变短。
建议在通信应用协议中增加应答
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-21 14:13:06 | 显示全部楼层
eddy836 发表于 2018-5-21 14:09
关闭自动ACK会丢包,距离越远丢包越明显。而且实测通信距离会变短。
建议在通信应用协议中增加应答

现在都是使用了自动重发,
自动重发是Enhanced ShockBurst&#8482;的引以为卖点的功能,
不用岂不是亏了?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

20

主题

228

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-5-21 15:39:49 | 显示全部楼层
本帖最后由 SimpleLife 于 2018-5-21 15:41 编辑
warship 发表于 2018-5-20 07:13
你说得非常对,
无线与有线不同,
丢包很正常,

原有的ACK返回重传机制.我测试过,仍会丢包(我在发送文件时测试出来的),建议使用原有ACK返回机制,同时添加软件应答机制。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-1-20
在线时间
1 小时
发表于 2018-5-21 15:53:41 | 显示全部楼层
加了ACK和自动重发也无法解决丢包的问题,因此我觉得楼上说得很对,需要添加软件应答。
回复 支持 反对

使用道具 举报

32

主题

1947

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4396
金钱
4396
注册时间
2018-5-11
在线时间
917 小时
 楼主| 发表于 2018-5-21 18:09:44 | 显示全部楼层
SimpleLife 发表于 2018-5-21 15:39
原有的ACK返回重传机制.我测试过,仍会丢包(我在发送文件时测试出来的),建议使用原有ACK返回机制,同 ...

用了ACK重传机制, 当然不能保证完全不丢包:
在软件中还必须处理, 达到最大重发次数后怎么办?
如果达到最大重发次数后就不管了,当然包就会丢了.
所以, 一是最大重发次数的设置, 可设多达15次, 重发间隔也是需要根据通联情况而设置
二是在软件中要检查重传失败, 并决定再重启传输.
但即便如此,如果干扰较大,距离较远, 多次重传也不一定解决问题.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

20

主题

228

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-5-23 09:20:08 | 显示全部楼层
warship 发表于 2018-5-21 18:09
用了ACK重传机制, 当然不能保证完全不丢包:
在软件中还必须处理, 达到最大重发次数后怎么办?
如果达到 ...

无线的局限就在那里咯。哈哈哈
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-10-22
在线时间
10 小时
发表于 2020-10-11 22:27:32 | 显示全部楼层
我用发送端发送4个字节数组,0x02,0x04,0x33,0x55,  接收端只能收到0x02,0x02,0x02,0x02。 极小概率收到正确的四个字节,找不到原因,求解
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-11-18
在线时间
0 小时
发表于 2020-11-18 11:48:57 | 显示全部楼层
楼主能附上一收多发的双向通讯的代码吗?是双向通讯哦,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 10:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表