|
本帖最后由 frankhan747 于 2021-7-26 22:52 编辑
明白了,其实数据是发出去了,不过你在自己吓唬自己
先附上一个详解NRF的帖子:开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
https://www.arduino.cn/forum.php ... 6275&fromuid=179950
(出处: Arduino中文社区)
帖子作者是alicedodo大佬
这是RF24库的write函数实现代码:
- bool RF24::write(const void* buf, uint8_t len, const bool multicast)
- {
- //Start Writing
- startFastWrite(buf, len, multicast);
- //Wait until complete or failed
- #if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- uint32_t timer = millis();
- #endif // defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- while (!(get_status() & (_BV(TX_DS) | _BV(MAX_RT)))) { //Status register判断1
- #if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- if (millis() - timer > 95) {
- errNotify();
- #if defined(FAILURE_HANDLING)
- return 0; //1号报错点
- #else
- delay(100);
- #endif
- }
- #endif
- }
- ce(LOW);
- uint8_t status = write_register(NRF_STATUS, _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT));
- //Max retries exceeded
- if (status & _BV(MAX_RT)) { //Status register判断2
- flush_tx(); //Only going to be 1 packet int the FIFO at a time using this method, so just flush
- return 0; //2号报错点
- }
- //TX OK 1 or 0
- return 1;
- }
复制代码
注意这两个报错点。
alicedodo在帖子里指出,NRF模块在进行半双工通信时有一个机制:如果主发射端(在发完一段数据后)没有收到主接收端的ACK应答(或数据,总之是一个响应),则会重新发送相同的数据(重试);如果这种重试达到一定次数、但主接收端仍然没有任何响应,主发送端会把这个情况上报给主控。
第一个报错点触发原因是 未接到主接收端的应答导致的等待超时;
第二个报错点的触发原因则是重试次数已达预设值,NRF判定通信失败并通过中断和Status register报错
在你的实验中,主接收端是不存在的,主发射端当然不会接收到任何应答。其实数据已经被转换成电磁波发射出去了(如果主接收端工作正常就应该能收到),但是write函数仍然会返回false,于是主程序执行Serial.println("failed");
至于具体代码解析,可以去看另外2处打中文注释的地方。NRF24L01的Status Register信息在数据手册Section 9.1,59页
另,_BV是AVR的黑话,_BV(x)等价于1<<x
如有错漏还请大佬斧正
|
|