yxwzyyk 发表于 2013-10-14 20:41:50

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

hmjack2008 发表于 2013-10-14 23:00:55

感谢LZ的分享, 正好最近买了nRF2401, 可拿来使用….

maxims 发表于 2013-10-15 00:02:50

这真是雪中送碳吖

szpapas 发表于 2013-10-15 02:42:21

NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的?

yxwzyyk 发表于 2013-10-15 07:10:55

szpapas 发表于 2013-10-15 02:42
NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的?

不是必须,可以不使用中断,需要的时候调用dataready()检测是否有数据到来就可以了,中断只是方便点我写的有获取中断状态的方法

sirrom 发表于 2013-10-17 17:56:39

我买了差不多6块NRF24L01,跟最小系统一起调了几次都没调成功,现在放了差不多一年了。看到楼主的帖子,我又看到了点希望,有空再试试。

hmjack2008 发表于 2013-10-17 19:17:53

试了LZ的 “软SPI” 可以实现同一块Arduino接两个nRF24L01, 自发自收(没使用中断).

maxims 发表于 2013-10-18 21:58:24

请问楼主编译的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()'

human2010 发表于 2013-10-19 15:32:07

谢谢提供,最经被NRF24L01折腾死啦!

human2010 发表于 2013-10-19 16:10:12

maxims 发表于 2013-10-18 21:58 static/image/common/back.gif
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示

用022版本吧!

human2010 发表于 2013-10-19 21:09:34

maxims 发表于 2013-10-18 21:58 static/image/common/back.gif
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示

我是1.05版的编译OK!但无法实现无线通讯,问题查找中。。。。。。。

maxims 发表于 2013-10-20 14:34:34

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

human2010 发表于 2013-10-20 22:56:23

maxims 发表于 2013-10-20 14:34 static/image/common/back.gif
首先感谢论坛分享代码和经验的各位兄弟姐妹,让我们小白有了一个好的成长的环境。
其次,感谢nRF24L01软 ...

本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo

human2010 发表于 2013-10-20 22:59:27

human2010 发表于 2013-10-20 22:56 static/image/common/back.gif
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo

MEGA2560和Leonardo的接收与发送对换几次,都没用

maxims 发表于 2013-10-21 10:47:58

human2010 发表于 2013-10-20 22:56
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo

leonardo作接收端,请用非中断方式!中断方式我估计引脚对不上或中断工作方式与uno不一样!
中断是引发了,但没读到数据,所以反复的显示数据为空!
页: [1] 2 3
查看完整版本: nRF24L01软实现Spi,支持中断