nRF24L01软实现Spi,支持中断
本帖最后由 yxwzyyk 于 2013-10-14 20:48 编辑最近在琢磨nRF24L01,看了几个帖子发现都不太好用太麻烦,所以参照了下nRF24L01手册自己写了一个库, 发出来给大家看看{:soso_e120:}.
默认开启增强型SchockBurstTM模式也就是开启自动回复机制.
默认开启自动重发.
默认开启中断.
默认传输速率2Mbps发射功率0dBm.
接线方法在头文件中定义的有,使用软SPI所以不依赖硬件可以自己更改
VCC 3.3v
GND GND
CE 8
CSN 9
SCK 10
MOSI 11
MISO 12
IRQ也就是中断接口2,也就是0号中断.
首先是发送端
#include "NRF24L01.h"
#define TX_NAME"32899"
/* 声明nRF24L01 */
nRF24L01 nrf24;
/* 建立发送数据缓存,初始化为0 */
char buf = {0};
void setup() {
Serial.begin(9600);
/* 初始化 nrf24 */
nrf24.init();
/* 配置数据宽度,也就是一次收发的字节数,默认是32字节,这里设为1是为了测试 */
nrf24.payload = 1;
/* 配置地址 */
nrf24.setTADDR(TX_NAME);
/* 写入配置 */
nrf24.config();
/* 初始化发送数据 */
for(int i = 0; i < 26; i++){
buf = 97+i;
}
}
void loop() {
for(int i = 0; i < 26; i++){
Serial.println("sending...");
nrf24.send(&buf);
if(nrf24.verifySend() == true){
Serial.println("Send completed!");
} else {
Serial.println("Failed to send!");
}
delay(3000);
}
}
接收端
#include "NRF24L01.h"
#define RX_NAME"32899"
/* 声明nRF24L01 */
nRF24L01 nrf24;
/* 建立接收数据缓存,初始化为0 */
char buf;
void setup() {
Serial.begin(9600);
nrf24.init();
nrf24.payload = 1;
nrf24.setRADDR(RX_NAME);
nrf24.config();
/* 设定中断 */
attachInterrupt(0, readData, LOW) ;
}
void loop() {
Serial.println("Wait...");
delay(1000);
}
void readData (void) {
Serial.println("Interrupt!");
if(nrf24.dataReady()){
Serial.println("Receiving the data!");
nrf24.getData(&buf);
Serial.print("Data -> ");
Serial.print(buf);
Serial.println(" ");
} else {
Serial.println("NULL!");
}
}
NRF24L01.zip
感谢LZ的分享, 正好最近买了nRF2401, 可拿来使用…. 这真是雪中送碳吖 NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的? szpapas 发表于 2013-10-15 02:42
NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的?
不是必须,可以不使用中断,需要的时候调用dataready()检测是否有数据到来就可以了,中断只是方便点我写的有获取中断状态的方法 我买了差不多6块NRF24L01,跟最小系统一起调了几次都没调成功,现在放了差不多一年了。看到楼主的帖子,我又看到了点希望,有空再试试。 试了LZ的 “软SPI” 可以实现同一块Arduino接两个nRF24L01, 自发自收(没使用中断). 请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示TX.cpp.o: In function `__static_initialization_and_destruction_0':
E:\Arduino\ArduinoExe/TX.ino:7: undefined reference to `nRF24L01::nRF24L01()'
TX.cpp.o: In function `loop':
E:\Arduino\ArduinoExe/TX.ino:31: undefined reference to `nRF24L01::send(char*)'
E:\Arduino\ArduinoExe/TX.ino:32: undefined reference to `nRF24L01::verifySend()'
TX.cpp.o: In function `setup':
E:\Arduino\ArduinoExe/TX.ino:15: undefined reference to `nRF24L01::init()'
E:\Arduino\ArduinoExe/TX.ino:19: undefined reference to `nRF24L01::setTADDR(char*)'
E:\Arduino\ArduinoExe/TX.ino:21: undefined reference to `nRF24L01::config()'
谢谢提供,最经被NRF24L01折腾死啦! maxims 发表于 2013-10-18 21:58 static/image/common/back.gif
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示
用022版本吧! maxims 发表于 2013-10-18 21:58 static/image/common/back.gif
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示
我是1.05版的编译OK!但无法实现无线通讯,问题查找中。。。。。。。 human2010 发表于 2013-10-19 21:09 static/image/common/back.gif
我是1.05版的编译OK!但无法实现无线通讯,问题查找中。。。。。。。
首先感谢论坛分享代码和经验的各位兄弟姐妹,让我们小白有了一个好的成长的环境。
其次,感谢nRF24L01软实现Spi,支持中断此贴的兄弟,提供了代码和思路。
根据该帖,我总结了一下经验:
1、下载“nRF24L01软实现Spi,支持中断”的附件,解压缩出来,确保目录结构为“NRF24L01/Examples”、“NRF24L01/NRF24L01.cpp”、“NRF24L01/NRF24L01.h”。也就是说主目录NRF24L01下边有一个文件夹和一个cpp和一个h文件。
2、关闭Arduino IDE,复制“NRF24L01”目录到arduino的安装目录下的“libraries”里边,重新启动Arduino IDE环境。
3、在IDE的“文件→示例→NRF24L01”菜单里边找到示例程序。分别打开RX和TX示例。
到这里,基础准备工作就完成了。
这里我要提醒大家:
初学者购买Arduino板子的时候,尽量购买Arduino UNO R3,因为很多网上的代码都是基于此写的。为了免去你莫名其妙的错误,尽量购买改型号做你的实验、学习用板。
如果,你手上有多种类型的Arduino板子,那么在进行该实验的时候,请用非UNO板作为TX端,用UNO板作为RX端,以减少非必要的麻烦。
4、请按照“NRF24L01.h”文件中对引脚的定义,对模块和主板进行连接,然后编译相应的程序进行下载到Arduino主板上。打开串口监视器,等待奇迹出现吧。
接收如果有问题,请检查IRQ端口是否有问题。
http://www.geek-workshop.com/thread-7562-1-1.html maxims 发表于 2013-10-20 14:34 static/image/common/back.gif
首先感谢论坛分享代码和经验的各位兄弟姐妹,让我们小白有了一个好的成长的环境。
其次,感谢nRF24L01软 ...
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo human2010 发表于 2013-10-20 22:56 static/image/common/back.gif
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo
MEGA2560和Leonardo的接收与发送对换几次,都没用 human2010 发表于 2013-10-20 22:56
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo
leonardo作接收端,请用非中断方式!中断方式我估计引脚对不上或中断工作方式与uno不一样!
中断是引发了,但没读到数据,所以反复的显示数据为空!