我在测试的时候遇到一个神奇的现象,
因为是测试,所以PTX和PRX两端都重复发送一些数据。
会出现如下现象:
- PTX发送端能正常发送数据并收到ACK应答包;
- 然而PRX端没有收到任何数据,状态寄存器STATUS和缓冲区寄存器FIFO_STATUS也没有任何变化。即使单片机不运行,PTX端收到依然还在正常进行。将PRX端断电PTX才发送失败了。
分析:
- 就是说,出现如上现象时,PRX端应答PTX了,但是PRX却不认为自己收到有效数据了.
- 再将发送端数据的第一个字节自增1,PRX就能正常收到数据。
- 所以初步确定是PRX接收端认为是重复数据副本并被丢弃。
摘自计数书册:
7.3.3.2PID(数据包标识)2位PID字段用于检测接收到的数据包是新的还是重新传输的。PID可防止PRX设备向接收主机单片机多次呈现相同的有效负载。对于通过SPI接收到的每个新数据包,PID字段在TX侧递增。PRX设备使用PID和CRC字段(见第30页的第7.3.5节)来确定数据包是重传输还是新传输。当链路上丢失几个数据包时,PID字段可能等于最后接收到的PID。如果一个包具有与前一个包相同的PID,nRF24L01+将比较来自两个包的CRC和。如果CRC和也相等,最后接收的包被认为是之前接收的包的副本并被丢弃。
结果:
理论上PID会递增的,递增了接收端就不会被丢了啊,所以PID为啥不增呢?
我也不知道!!!
知道有这个问题,每次发送的数据不一样就能保证CRC变化,就不会被判断重复包而被丢弃。