极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29833|回复: 21

关于NRF24L01无线通讯问题详解???

[复制链接]
发表于 2013-10-20 23:11:59 | 显示全部楼层 |阅读模式
本人新人一名,最近几天刚接接触NRF24L01,于是想搞个四驱遥控车玩玩。
结果被NRF24L01折腾了一周的时间,无结果啊?难道我理解问题?
还请个位前辈多多指点,在此先感谢大家了!!!

以下是我统计的其他高人的分享,但无法使用,求解!
首先,我的感谢他们的无私奉献!!!{:soso_e183:}
http://www.geek-workshop.com/for ... thread&tid=1393      作者:L.anrist
http://www.geek-workshop.com/for ... thread&tid=1184      作者:Muller_r
http://www.geek-workshop.com/thread-7492-1-1.html                                 作者:keyosa
http://www.geek-workshop.com/thread-7498-1-1.html                                 作者:yxwzyyk
http://www.geek-workshop.com/for ... thread&tid=1131      作者:pww999

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-10-20 23:32:30 | 显示全部楼层
图片为http://www.geek-workshop.com/for ... thread&tid=1131提供程序测试结果


以下是未接NRF24L01模块的结果

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-20 23:34:42 | 显示全部楼层
接收端就是无反应,唉{:soso_e150:}!
回复 支持 反对

使用道具 举报

发表于 2013-10-21 10:41:26 来自手机 | 显示全部楼层
请查看一下我的贴子
回复 支持 反对

使用道具 举报

发表于 2013-10-21 11:00:24 | 显示全部楼层
本帖最后由 mxhhaixin 于 2013-10-21 11:04 编辑

试试这个。使用Mirf.h,根据库自带的例子改编而来。不停的发送“Hello,nRF24L01!”。注意接线,别接错了。我也用nRF24L01做了个遥控车,摇杆扩展板和你的一样。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-21 14:55:05 | 显示全部楼层
发送端程序如下:

#include "NRF24L01.h"

#define TX_ADR_WIDTH    5   // 定义发送寄存器地址宽度
#define TX_PLOAD_WIDTH  32  // 定义发送数据宽度

unsigned char TX_ADDRESS[TX_ADR_WIDTH]  =
{
  0x34,0x43,0x10,0x10,0x01//定义发送的寄存器地址
};
unsigned char txBuf[TX_PLOAD_WIDTH] =
{
  0x11,0xa1,0x12         //定义发送的数据
};
//********************NRF24L01引脚配置***********************
#define CE       9
#define CSN      10
#define SCK      13
#define MOSI     11
#define MISO     12
#define IRQ      8
//********************初始化********************************
void setup()
{
  pinMode(CE,  OUTPUT);
  pinMode(SCK, OUTPUT);
  pinMode(CSN, OUTPUT);
  pinMode(MOSI, OUTPUT);
  pinMode(MISO, INPUT);
  pinMode(IRQ, INPUT);
  
  NRF24L01_init();

  Serial.begin(9600);
}
//********************执行程序**************************
void loop()
{
  SPI_RW_Reg(WRITE_REG+STATUS,0xFF); //状态寄存器清零
  
  unsigned char status=SPI_Read(STATUS);//读状态寄存器值(查看状态寄存器是否清零)
  Serial.print("restart:");            
  Serial.println(status,HEX);//测试值为:E/FF
  
  delay(1000);
  int i=digitalRead(IRQ);//读数字IRQ引脚(查看数据是否发送完成,TX_DS是否产生中断,IQO置1)              
  Serial.print("re IRQ:");
  Serial.println(i);//测试值为:1
  
  SPI_Write_Buf(WR_TX_PLOAD,txBuf,TX_PLOAD_WIDTH);//发送数据(测试发送是否正常,未设置CONFIG)
  status=SPI_Read(FIFO_STATUS);//读FIFO状态寄存器值(查看TX_EMPTY寄存器是否为0)
  Serial.print("Reload over:");
  Serial.println(status,HEX);//测试值为:1/FF
  
  delay(2000);
  nRF24L01_TxPacket(txBuf);//发送数据
  status=SPI_Read(FIFO_STATUS);//读FIFO状态寄存器值(查看TX_EMPTY寄存器是否为0)
  Serial.print("fashe over FIFO STATUS=:");
  Serial.println(status,HEX);//测试值为:11/FF
  
  i=digitalRead(IRQ);//再次读数字IRQ引脚(查看数据是否发送完成,TX_DS是否产生中断,IQO置1)
  Serial.print("over IRQ:");
  Serial.println(i);//测试值为:1
  
  status=SPI_Read(FIFO_STATUS);

  status=SPI_Read(STATUS);//再次读状态寄存器值(查看状态寄存器值,TX_DS是否产生中断,数据发送完成)
  Serial.print("overSTATUS:");
  Serial.println(status,HEX);//测试值为:2E/FF
  delay(2000);
}

//********************NRF24L01初始化*************************
void NRF24L01_init(void)
{
  delay(1);
  digitalWrite(CE, 0);//芯片运行禁止
  digitalWrite(CSN,1);//寄存器读写禁止
  digitalWrite(SCK,0);//时钟初始状态
  digitalWrite(IRQ,1);//中断复位
  
  SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写入发送端寄存器地址
  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 写入接收端寄存器地址

  SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                            // 数据通道0自动ACK应答禁止(一般为允许)
  SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                        // 接收数据通道0允许
  SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);                       // 自动重发禁止
  SPI_RW_Reg(WRITE_REG + RF_CH, 40);                              // 设置通道工作为2.4GHZ,收发必须一致
  SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                         // 设置发射速率为1MHZ,发射功率为最大值0dB
  //SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                         // IRQ收发完成中断响应,16位CRC,发射模式
}

//********************发送tx_buf中的数据*************************
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
  digitalWrite(CE,0);                                            //StandBy I模式        
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);            // 装载发送数据        
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                          // IRQ收发完成中断响应,16位CRC,发射模式(PRIM_RX=0,
  digitalWrite(CE,1);                                            //置高CE,激发数据发送
  delay(1);
}

/**************************************************
* Function: SPI_RW();
* 模拟SPI写时序
* Description:
* Writes one unsigned char to nRF24L01, and return the unsigned char read
* from nRF24L01 during write, according to SPI protocol
**************************************************/
unsigned char SPI_RW(unsigned char Byte)
{
  unsigned char i;
  for(i=0;i<8;i++)                      // output 8-bit
  {
    if(Byte&0x80)
    {
      digitalWrite(MOSI, 1);
    }
    else
    {
      digitalWrite(MOSI, 0);
    }
    digitalWrite(SCK, 1);
    Byte <<= 1;                         // shift next bit into MSB..
    if(digitalRead(MISO) == 1)
    {
      Byte |= 1;                               // capture current MISO bit
    }
    digitalWrite(SCK, 0);
  }
  return(Byte);                           // return read unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_RW_Reg();
* 读写寄存器
* Description:
* Writes value 'value' to register 'reg'
/**************************************************/
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
  unsigned char status;

  digitalWrite(CSN, 0);                   // CSN low, init SPI transaction
  status = SPI_RW(reg);                   // select register
  SPI_RW(value);                          // ..and write value to it..
  digitalWrite(CSN, 1);                   // CSN high again

  return(status);                   // return nRF24L01 status unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_Read();
* 读寄存器
* Description:
* Read one unsigned char from nRF24L01 register, 'reg'
/**************************************************/
unsigned char SPI_Read(unsigned char reg)
{
  unsigned char reg_val;

  digitalWrite(CSN, 0);           // CSN low, initialize SPI communication...
  SPI_RW(reg);                   // Select register to read from..
  reg_val = SPI_RW(0);           // ..then read register value
  digitalWrite(CSN, 1);          // CSN high, terminate SPI communication

  return(reg_val);               // return register value
}
/**************************************************/

/**************************************************
* Function: SPI_Read_Buf();
* 读数据
* Description:
* Reads 'unsigned chars' #of unsigned chars from register 'reg'
* Typically used to read RX payload, Rx/Tx address
/**************************************************/
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  unsigned char status,i;

  digitalWrite(CSN, 0);                  // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);                   // Select register to write to and read status unsigned char

  for(i=0;i<bytes;i++)
  {
    pBuf = SPI_RW(0);    // Perform SPI_RW to read unsigned char from nRF24L01
  }

  digitalWrite(CSN, 1);                   // Set CSN high again

  return(status);                  // return nRF24L01 status unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_Write_Buf();
* 写数据
* Description:
* Writes contents of buffer '*pBuf' to nRF24L01
* Typically used to write TX payload, Rx/Tx address
/**************************************************/
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  unsigned char status,i;

  digitalWrite(CSN, 0);                  // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);             // Select register to write to and read status unsigned char
  for(i=0;i<bytes; i++)             // then write all unsigned char in buffer(*pBuf)
  {
    SPI_RW(*pBuf++);
  }
  digitalWrite(CSN, 1);                   // Set CSN high again
  return(status);                  // return nRF24L01 status unsigned char
}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-21 15:05:16 | 显示全部楼层
mxhhaixin 发表于 2013-10-21 11:00
试试这个。使用Mirf.h,根据库自带的例子改编而来。不停的发送“Hello,nRF24L01!”。注意接线,别接错了。我 ...

硬件SPI接口?先学习一下!
回复 支持 反对

使用道具 举报

发表于 2013-10-21 16:39:41 来自手机 | 显示全部楼层
human2010 发表于 2013-10-21 14:55
发送端程序如下:

#include "NRF24L01.h"

亲,IRQ中断用的是硬件中断,请接回芯片自带的中断口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-21 16:58:10 | 显示全部楼层
maxims 发表于 2013-10-21 16:39
亲,IRQ中断用的是硬件中断,请接回芯片自带的中断口

我的意识是AVR自带SPI,还是软件模拟SPI?谢谢!
回复 支持 反对

使用道具 举报

发表于 2013-10-21 17:41:53 来自手机 | 显示全部楼层
本帖最后由 mxhhaixin 于 2013-10-21 17:43 编辑
human2010 发表于 2013-10-21 15:05
硬件SPI接口?先学习一下!


是硬件SPI接口。Arduino上自带硬件SPI接口。
回复 支持 反对

使用道具 举报

发表于 2013-10-21 18:46:18 | 显示全部楼层
human2010 发表于 2013-10-21 16:58
我的意识是AVR自带SPI,还是软件模拟SPI?谢谢!

如果你发现引用了SPI.h的,就应该是硬件SPI,如果是软件SPI,就没有这个头文件。IRQ中断,是用的硬件中断,所以申明引脚功能的时候都没有定义到IRQ的脚。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-21 19:48:01 | 显示全部楼层
mxhhaixin 发表于 2013-10-21 17:41
是硬件SPI接口。Arduino上自带硬件SPI接口。

谢谢!我的IO对应的不是硬件SPI接口,也不想跳线了。或许以后可以用用,先收藏吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-21 19:56:15 | 显示全部楼层
maxims 发表于 2013-10-21 18:46
如果你发现引用了SPI.h的,就应该是硬件SPI,如果是软件SPI,就没有这个头文件。IRQ中断,是用的硬件中断 ...

恕我愚昧!我定义了IRQ,并且该引脚的线,也对应接上了。按道理来说用硬件中断,是没问题的啊!
难道我理解有误?望指点!初学者见笑!
回复 支持 反对

使用道具 举报

发表于 2013-10-21 22:27:19 | 显示全部楼层
human2010 发表于 2013-10-21 19:56
恕我愚昧!我定义了IRQ,并且该引脚的线,也对应接上了。按道理来说用硬件中断,是没问题的啊!
难道我理 ...

硬件中断,肯定有硬件的引脚,那么就固定到某个引脚上了的。你是没有办法再定义了。
就像mcu芯片一样,硬件定义电源和地引脚,晶体引脚,PWM,模拟端口,都是一些固定的引脚,你在怎么定义端口,也最多只能是复用端口,而不可以把这个硬件已经固定了的脚挪个顺序来用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-22 09:12:15 | 显示全部楼层
maxims 发表于 2013-10-21 22:27
硬件中断,肯定有硬件的引脚,那么就固定到某个引脚上了的。你是没有办法再定义了。
就像mcu芯片一样,硬 ...

可能我描述有问题,您说的我明白!
我现在用的是软件模拟SPI接口与NRF24L01通讯。
我说的中断是指NRF24L01的硬件IRQ引脚,当它连接AVR单片机。
我要使用此功能,在单片机程序中肯定是要先定义,在使用咯!

可能您以为我所说的是单片中断,是吧!
感谢您的细心回答!先学习了!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 20:08 , Processed in 0.059766 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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