Mirf 库在使用 NRF24L01 的时候接触到,感觉很好用。但在用 Arduino101 的时候遇到一些问题,记录一下,对于底层不了解,希望有熟悉的同学能给点指点:
- 编译会提示 MirfHardwareSpiDriver.cpp 中的 SPI_2XCLOCK_MASK 未定义,查看 intel 目录下的 SPI 实现,没有这个定义,先不管3721,把这个改为相应常量 0x01 试试
#include "MirfHardwareSpiDriver.h" uint8_t MirfHardwareSpiDriver::transfer(uint8_t data){ return SPI.transfer(data); } void MirfHardwareSpiDriver::begin(){ SPI.begin(); SPI.setDataMode(SPI_MODE0); // SPI.setClockDivider(SPI_2XCLOCK_MASK); SPI.setClockDivider(0x01); // <- 这里改 } void MirfHardwareSpiDriver::end(){ } MirfHardwareSpiDriver MirfHardwareSpi;
- 编译可以通过了,并且上传成功,运行
运行发现卡在 Mirf.isSending() 的判断中,一直无法发送完毕。查看 SPI 的文档,发现说 setClockDivider 接口不推荐,推荐使用 SPISettings 来做配置,并且在发送前后使用 SPI.beginTransaction() 和 SPI.endTransaction() 来包围起来。于是改一下 MirfHardwareSpiDriver.cpp:
#include "MirfHardwareSpiDriver.h" uint8_t MirfHardwareSpiDriver::transfer(uint8_t data){ // return SPI.transfer(data); // 这里改为如下,settings 里的速度参数可以调整 uint8_t ret; SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); ret = SPI.transfer(data); SPI.endTransaction(); return ret; } void MirfHardwareSpiDriver::begin(){ SPI.begin(); // 这里之后的都注释掉不用了 /* SPI.setDataMode(SPI_MODE0); // SPI.setClockDivider(SPI_2XCLOCK_MASK); SPI.setClockDivider(0x01); */ } void MirfHardwareSpiDriver::end(){ } MirfHardwareSpiDriver MirfHardwareSpi;
- 编译、上传、运行
可以正常发送了!不过在 Arduino101 上发送,在普通板上接收只有偶尔可以接收到数据,用普通板来下载同样程序进行发送,均可 100% 接收,调整速度参数也是一样的表现,真是不知道哪里的问题了