这次大大小小又搞了一个星期,还特地做了测试版。
图中大部分是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发送数据时尽量保证数据有变动,简单的方式就是预留一个字节作自增即可。