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);
}
}
}
{:soso_e132:} 没人遇见过这个问题?{:soso_e141:} 本帖最后由 帕米 于 2015-12-2 00:28 编辑
擦,要不要这么 Bug. 这么多人用就没一个人发现。。。还大牛写的呢。还是 自己写驱动库靠谱。:L
官方的示例是写不进收发地址的。还是原来默认的0xE7E7E7E7E7. 所以怎么配地址都是无效。。。
Mirf.setRADDR(); Mirf.setTADDR(); 函数得往下放才行。
搞定,请各位帮忙验证验证。
#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]