极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 54908|回复: 42

nRF24L01软实现Spi,支持中断

[复制链接]
发表于 2013-10-14 20:41:50 | 显示全部楼层 |阅读模式
本帖最后由 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号中断.

首先是发送端

  1. #include "NRF24L01.h"

  2. #define TX_NAME  "32899"

  3. /* 声明nRF24L01 */
  4. nRF24L01 nrf24;

  5. /* 建立发送数据缓存,初始化为0 */
  6. char buf[26] = {0};

  7. void setup() {
  8.         Serial.begin(9600);
  9.     /* 初始化 nrf24 */         
  10.         nrf24.init();
  11.     /* 配置数据宽度,也就是一次收发的字节数,默认是32字节,这里设为1是为了测试 */
  12.     nrf24.payload = 1;
  13.     /* 配置地址 */
  14.         nrf24.setTADDR(TX_NAME);
  15.     /* 写入配置 */
  16.         nrf24.config();
  17.     /* 初始化发送数据 */
  18.         for(int i = 0; i < 26; i++){
  19.                 buf[i] = 97+i;
  20.         }
  21. }

  22. void loop() {
  23.         for(int i = 0; i < 26; i++){
  24.                 Serial.println("sending...");
  25.                 nrf24.send(&buf[i]);
  26.                 if(nrf24.verifySend() == true){
  27.                         Serial.println("Send completed!");
  28.                 } else {
  29.                         Serial.println("Failed to send!");
  30.                 }
  31.                 delay(3000);
  32.         }

  33. }
复制代码


接收端
  1. #include "NRF24L01.h"

  2. #define RX_NAME  "32899"

  3. /* 声明nRF24L01 */
  4. nRF24L01 nrf24;

  5. /* 建立接收数据缓存,初始化为0 */
  6. char buf;

  7. void setup() {
  8.         Serial.begin(9600);            
  9.         nrf24.init();
  10.         nrf24.payload = 1;
  11.         nrf24.setRADDR(RX_NAME);
  12.         nrf24.config();

  13.         /* 设定中断 */
  14.         attachInterrupt(0, readData, LOW) ;
  15. }

  16. void loop() {
  17.         Serial.println("Wait...");
  18.         delay(1000);

  19. }

  20. void readData (void) {
  21.         Serial.println("Interrupt!");
  22.         if(nrf24.dataReady()){
  23.                 Serial.println("Receiving the data!");
  24.                 nrf24.getData(&buf);
  25.                 Serial.print("Data -> ");
  26.                 Serial.print(buf);
  27.                 Serial.println(" ");
  28.         } else {
  29.                 Serial.println("NULL!");
  30.         }
  31. }
复制代码


[url=]NRF24L01.zip[/url]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-10-14 23:00:55 | 显示全部楼层
感谢LZ的分享, 正好最近买了nRF2401, 可拿来使用….
回复 支持 反对

使用道具 举报

发表于 2013-10-15 00:02:50 来自手机 | 显示全部楼层
这真是雪中送碳吖
回复 支持 反对

使用道具 举报

发表于 2013-10-15 02:42:21 | 显示全部楼层
NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-15 07:10:55 来自手机 | 显示全部楼层
szpapas 发表于 2013-10-15 02:42
NRF的IRQ 是否必须要接到 PIN 2, 通常是不接的?

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

使用道具 举报

发表于 2013-10-17 17:56:39 | 显示全部楼层
我买了差不多6块NRF24L01,跟最小系统一起调了几次都没调成功,现在放了差不多一年了。看到楼主的帖子,我又看到了点希望,有空再试试。
回复 支持 反对

使用道具 举报

发表于 2013-10-17 19:17:53 | 显示全部楼层
试了LZ的 “软SPI” 可以实现同一块Arduino接两个nRF24L01, 自发自收(没使用中断).
回复 支持 反对

使用道具 举报

发表于 2013-10-18 21:58:24 | 显示全部楼层
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示
  1. TX.cpp.o: In function `__static_initialization_and_destruction_0':
  2. E:\Arduino\ArduinoExe/TX.ino:7: undefined reference to `nRF24L01::nRF24L01()'
  3. TX.cpp.o: In function `loop':
  4. E:\Arduino\ArduinoExe/TX.ino:31: undefined reference to `nRF24L01::send(char*)'
  5. E:\Arduino\ArduinoExe/TX.ino:32: undefined reference to `nRF24L01::verifySend()'
  6. TX.cpp.o: In function `setup':
  7. E:\Arduino\ArduinoExe/TX.ino:15: undefined reference to `nRF24L01::init()'
  8. E:\Arduino\ArduinoExe/TX.ino:19: undefined reference to `nRF24L01::setTADDR(char*)'
  9. E:\Arduino\ArduinoExe/TX.ino:21: undefined reference to `nRF24L01::config()'
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-10-19 15:32:07 | 显示全部楼层
谢谢提供,最经被NRF24L01折腾死啦!
回复 支持 反对

使用道具 举报

发表于 2013-10-19 16:10:12 | 显示全部楼层
maxims 发表于 2013-10-18 21:58
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示

用022版本吧!
回复 支持 反对

使用道具 举报

发表于 2013-10-19 21:09:34 | 显示全部楼层
maxims 发表于 2013-10-18 21:58
请问楼主编译的ide版本是多少?
我是1.0.5版本的,编译出错,提示

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

使用道具 举报

发表于 2013-10-20 14:34:34 | 显示全部楼层
human2010 发表于 2013-10-19 21:09
我是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
回复 支持 反对

使用道具 举报

发表于 2013-10-20 22:56:23 | 显示全部楼层
maxims 发表于 2013-10-20 14:34
首先感谢论坛分享代码和经验的各位兄弟姐妹,让我们小白有了一个好的成长的环境。
其次,感谢nRF24L01软 ...

本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo
回复 支持 反对

使用道具 举报

发表于 2013-10-20 22:59:27 | 显示全部楼层
human2010 发表于 2013-10-20 22:56
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo

MEGA2560和Leonardo的接收与发送对换几次,都没用
回复 支持 反对

使用道具 举报

发表于 2013-10-21 10:47:58 来自手机 | 显示全部楼层
human2010 发表于 2013-10-20 22:56
本人新人,还是没找到原因,还请指点。我用的MEGA2560和Leonardo

leonardo作接收端,请用非中断方式!中断方式我估计引脚对不上或中断工作方式与uno不一样!
中断是引发了,但没读到数据,所以反复的显示数据为空!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 21:17 , Processed in 0.069074 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表