NRF24L01调试的一些经验之谈

这次大大小小又搞了一个星期,还特地做了测试版。

图中大部分是SI24R1,和NRF24L01+完全兼容,关键是还便宜。

需求要做一个无线通讯大网,一个主机和上百个从机通讯。

该模块有自动应答功能,发送一个包到应答数据收到,只需要1ms以内的时间就能完成,数据包还自带CRC校验。比485,CAN总线这些高效很多。还不需要布线。

说说经验记录,

1、不管是PTX还是PRX端,在初始化模块之后,CE一直保持高即可,不要去操作CE脚。PTX端发送缓冲区有数据就自动发送,无数据就等待有数据再发,写数据是CE也可以一直保持高。

2、PTX端需要检查状态寄存器STATUS中MAX_RT最大发送失败标志,MAX_RT为1后只有清除后才能继续发送。

3、PTX端在修改发送地址时,可以直接修改,再写入缓冲发送,也不用操作CE。(实测更改地址到收到应答用时550us)

4、PTX端建议查询STATUS(0x07)状态寄存器去收发数据。MAX_RT置位时必须手动清除。如果PRX端发送缓冲区无数据,只会给PTX应答信号、不带数据,此时TX_DS会置位,而RX_DR不会置位。

5、PRX端因为是被动模式,数据只有PTX发送后才会被取走,(就像USB通讯一样,PC端查询方式取走数据)。MAX_RT不用关心。PRX端既可以通过STATUS寄存器去读写FIFO,也可以通过FIFO_STATUS(缓冲状态寄存器)去读写FIFO。在初始化之后只要去操作缓冲器即可。

6、再者就是这关键的130us

 就是说,PTX在发数据发送完之后的130us之内是处于等待状态,130us之后就会去查询有没有PRX应答自己。这里时间是定死的。

PRX在PTX发送完之后,假定同时也收完数据了,那PRX的应答数据就得在这130us结束之前准备好,才能保证PTX读取到。

然而往往我们想知道自己收到什么才知道回应啥数据。PRX在知道自己收到数据到把数据读出来,快慢也要100多us,再去处理数据怕是轻轻松松用完这130us了。所以这样并不是靠谱的事。

那么就可以在PRX收到数据后(状态RX_DR置位),不先取读取RXFIFO缓冲区数据(为了省时间),先写数据到TXFIFO(经过测试直接写保证100us以内能写完)。然后再去读RXFIFO数据,再去处理数据。这样是基本上是来得及的。

上面这种操作就像SPI全双工通讯一样,读取一个数据需要发送两个数据。

这次的执行结果需要下一次通讯才能获取到,需要两次通讯。

如果不需要执行结果,一次通讯就行。

7、就是上文提到的PID问题,PID不一定自增,为了防止数据包被误判为重复包丢弃,在PTX发送数据时尽量保证数据有变动,简单的方式就是预留一个字节作自增即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值