帕米 发表于 2015-11-30 12:03:20

nRF24L01 为什么接收地址与发送地址不一样同样可以收到数据呢?

本帖最后由 帕米 于 2015-12-2 00:01 编辑

最近实验一下 nRF24l01 模块。发现了一个奇怪的事情。。 不管发送端是什么地址。还是接收端是什么地址,只要信道相同都能收到数据。

用的库是 https://github.com/maniacbug/RF24 https://github.com/aaronds/arduino-nrf24l01

D2引脚和GND 插个LED, 每隔500ms发送端,发送一次数据。D2 电平反一次。接收端同步。D2引脚电平。USART 输出接收到的数据。

注意以下配置引脚。
MISO -> 12
MOSI -> 11
SCK -> 13
CE -> 8
CSN -> 10

LED+ -> 2
LED- -> GND

就如下:发送端地址是 "pami1", 接收端地址是 "12345" ,按理说因该是收不到数据的。可是结果能收到数据。
不管是山寨的 NRF24L01, 还是 SI24R1 ,还是 原装的 nRF24L01。结果都一样。还是这个地址我理解错了?

发送端代码:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup() {
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setTADDR((byte *)"pami1");   // 配置发送地址
//Mirf.setTADDR((byte *)"serv1");
Mirf.cePin = 8;   // CE PIN
Mirf.csnPin = 10; // CSN PIN
Mirf.channel= 23; // NRF24 通道
Mirf.payload = 16;// 数据长度
Mirf.config();

pinMode(2, OUTPUT);   // LED + 用于查看发射状态
}

void loop() {
char data = {'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F'}; //"1234567890ABCDEF";
digitalWrite(2, HIGH);
Mirf.send((byte *)&data); // 发送数据
while(Mirf.isSending());// 等待发送完成
delay(500);

char data1 = {'0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'};
digitalWrite(2, LOW);
Mirf.send((byte *)&data1);
while(Mirf.isSending());
delay(500);
}

接收端代码:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char data = "1234567890abcde";

void setup() {
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"12345"); // 配置接收地址
//irf.setRADDR((byte *)"serv1");
Mirf.cePin = 8;   // CE PIN
Mirf.csnPin = 10; // CSN PIN
Mirf.channel= 23; // NRF24 通道
Mirf.payload = 16;// 数据长度
Mirf.config();

pinMode(2, OUTPUT);   // LED + 用于查看接收状态
Serial.println(data);
}

void loop() {
if(Mirf.dataReady()) {// 检测是否收到数据
      Mirf.getData((byte *)&data);

      Serial.println(data);
      if(data == '1') {
      digitalWrite(2, HIGH);
      }else if(data == '0') {
      digitalWrite(2, LOW);
      }
}
}

帕米 发表于 2015-12-1 20:47:21

{:soso_e132:} 没人遇见过这个问题?{:soso_e141:}

帕米 发表于 2015-12-2 00:16:44

本帖最后由 帕米 于 2015-12-2 00:28 编辑

擦,要不要这么 Bug. 这么多人用就没一个人发现。。。还大牛写的呢。还是 自己写驱动库靠谱。:L
官方的示例是写不进收发地址的。还是原来默认的0xE7E7E7E7E7. 所以怎么配地址都是无效。。。
Mirf.setRADDR(); Mirf.setTADDR(); 函数得往下放才行。


帕米 发表于 2015-12-2 00:23:01

搞定,请各位帮忙验证验证。

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup() {
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
//Mirf.setTADDR((uint8_t *)"alex1"); // 1 Set Tx Addr, bug Error
Mirf.cePin = 8;   // CE PIN
Mirf.csnPin = 10; // CSN PIN
Mirf.channel= 23; // NRF24 通道
Mirf.payload = 16;// 数据长度

Mirf.setTADDR((uint8_t *)"pami1");// 2 Set Tx Addr, OK Right
Mirf.config();

pinMode(2, OUTPUT);

testReadAddress();
}

void testReadAddress() {
Serial.println("Read nRF24L01 Address REG: ");
char address;
Mirf.readRegister(TX_ADDR,(uint8_t *)&address, 5);
Serial.println(address);    // print address char

// print address hex
for(int i=0; i< 5; i++) {
    Serial.print("0x");
    Serial.print(address,HEX);
    Serial.print(", ");
}
Serial.println();
}

void loop() {
char data = {'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F'}; //"1234567890ABCDEF";
digitalWrite(2, HIGH);
Mirf.send((byte *)&data); // 发送数据
while(Mirf.isSending());// 等待发送完成
delay(250);

char data1 = {'0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'};
digitalWrite(2, LOW);
Mirf.send((byte *)&data1);
while(Mirf.isSending());
delay(250);
}
页: [1]
查看完整版本: nRF24L01 为什么接收地址与发送地址不一样同样可以收到数据呢?