• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术讨论 > nrf24l01新手,求解答

nrf24l01新手,求解答

录入:edatop.com     点击:
最近写了个程序,不知道是硬件接错还是什么,就是没发送成功
我的nrf24l01是10个引脚的。
硬件:电源稳了3.3V的,接到1个VCC上,另一个vcc悬空
      地也是接了一个地。另一个地悬空
其他端口全接单片机的I/O口上面
程序方面:
-----------------------------------------24l01.h--------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
sbit MOSI=P2^4;
sbit MISO=P2^2;
sbit CSN=P2^5;
sbit SCK=P2^1;
sbit CE=P2^0;
sbit IRQ=P2^3;
uchar sta;
#define READ_REG        0x00          // 读寄存器指令        //
#define WRITE_REG       0x20         // 写寄存器指令
#define RD_RX_PLOAD     0x61          // 读取接收数据指令
#define WR_TX_PLOAD     0xA0          // 写待发数据指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令 //
#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令 //
#define REUSE_TX_PL     0xE3          // 定义重复装载数据指令        //
#define NOP             0xFF          // 保留         //
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置  //
#define SETUP_RETR      0x04  // 自动重发功能设置 //
#define RF_CH           0x05  // 工作频率设置        //
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能 //
#define CD              0x09  // 地址检测   //        
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址        //
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址        //
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址  //
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址        //
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址        //
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道0接收数据长度         //
#define RX_PW_P2        0x13  // 接收频道0接收数据长度         //
#define RX_PW_P3        0x14  // 接收频道0接收数据长度         //
#define RX_PW_P4        0x15  // 接收频道0接收数据长度         //
#define RX_PW_P5        0x16  // 接收频道0接收数据长度         //
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置          //
#define sjcd    8                          //数据长度(个数)
#define dzcd        5                          //地址长度(个数)
uchar TX_address[dzcd]={0x01,0x02,0x10,0x10,0x01};
uchar RX_address[dzcd]={0x01,0x02,0x10,0x10,0x01};       
uchar sbuf[4]={0x01,0x02,0x04,0x08};
uchar jbuf[4]={0x07,0x0b,0x0d,0x0e};
void delay(uint x)
{  uint j,i;
        for(j=0;j<x;j++)
        for(i=0;i<120;i++);
}
uchar RTX_sj(uchar dat)//写数据和数据
{        uchar i;  
        for(i=0;i<8;i++)
        { MOSI=(dat&0x80);
          SCK=1;
          dat<<=1;
          dat|=MISO;
          SCK=0;
        }
        return(dat);
}
uchar RTX_zl(uchar com,uchar *shuju,uchar x)//写指令(寄存器),数据,数据个数
{   uchar i;
        CSN=0;
        RTX_sj(com);
        for(i=0;i<x;i++)
        sta=RTX_sj(shuju[i]);
        CSN=1;
        return(sta);       
}
void XTR_zj(uchar com,uchar *shuju,uchar x)
{       
        uchar i;
        CSN=0;
        RTX_sj(com);
        for(i=0;i<x;i++)       
        shuju[i]=RTX_sj(shuju[i]);
        CSN=1;
}
void rm()
{  CE=0;
   RTX_zl(WRITE_REG+CONFIG,0x0f,1);
   RTX_zl(WRITE_REG+RX_ADDR_P0,RX_address,5);
   RTX_zl(WRITE_REG+EN_RXADDR,0x01,1);
   RTX_zl(WRITE_REG+EN_AA,0x01,1);
   RTX_zl(WRITE_REG+RF_CH,40,1);
   RTX_zl(WRITE_REG+RF_SETUP,0x07,1);
   RTX_zl(WRITE_REG+RX_PW_P0,4,1);
   CE=1;
}
void tm(uchar *qq)
{          CE=0;
        RTX_zl(WRITE_REG+TX_ADDR,TX_address,5);
        RTX_zl(WRITE_REG+CONFIG,0x0e,1);
        RTX_zl(WRITE_REG+SETUP_RETR,0x0a,1);
    RTX_zl(WRITE_REG+RX_ADDR_P0,RX_address,5);
        RTX_zl(WRITE_REG+EN_RXADDR,0x01,1);
        RTX_zl(WRITE_REG+EN_AA,0x01,1);
        RTX_zl(WRITE_REG+RF_CH,40,1);
        RTX_zl(WRITE_REG+RF_SETUP,0x07,1);
    RTX_zl(WRITE_REG+WR_TX_PLOAD,qq,4);
        CE=1;
}
void init_12l01()
{  CSN=1;
   SCK=0;
   CE=0;
   IRQ=1;
   CE = 0;
   rm();
}
-------------------------------------reg52.h------------------------------------------------------------------
#include <reg52.h>
#include <12l01.h>
sbit b=P3^7;
uchar a,i;
void main()
{        init_12l01();
        delay(5);
         while(1)
        {        if(b==0)
                {tm(sbuf);}
                a=RTX_zl(WRITE_REG+STATUS,0,1);
                if((a&0x70)!=0)
                {XTR_zj(RD_RX_PLOAD,jbuf,4);
                 while(1)
                 {        for(i=0;i<4;i++)
                         {P1=~jbuf[i];delay(500);}
                 }
                }
        }
   
}
无法发送与接收,不知道怎么办?是不是Nrf24l01坏了?

要确认硬件是否跑起来?电源管脚都要接,晶振是否起振?可以拿示波器测一下。

已经解决。

你好,NRF24L01是Nordic的芯片,我公司是Nordic13年代理商,请问你的联系方式是什么,期待我们有合作机会,以下是我的联系方式:
深圳市蓝科迅通科技有限公司(Nordic代理)
莫先生  Mobile:13823642805
Tel:0755-26804969
Skype:nrf600
MSN:nrf600@hotmail.com
E-mail:nrf600@freqchina.com

小编说下主要是什么问题,

发送初始化写错了、、、。

RTX_zl(WRITE_REG+WR_TX_PLOAD,qq,4);
这句改成
RTX_zl(WR_TX_PLOAD,qq,4);

请问下,这里是指什么意思
{tm(sbuf);}
a=RTX_zl(WRITE_REG+STATUS,0,1);
                if((a&0x70)!=0)
                {XTR_zj(RD_RX_PLOAD,jbuf,4);
请问是不是这样:
{tm(sbuf);}//把subf的数据发送出去
a=RTX_zl(WRITE_REG+STATUS,0,1);//把接受到得最后一个数据给sta
                if((a&0x70)!=0)//如果a=0x70
                {XTR_zj(RD_RX_PLOAD,jbuf,4);//这个不知道

检查晶振还真的没有波形啊,晶振没波形可以吗

学习学习,very good

上一篇:Bluetooth和Wlan的传输距离问题
下一篇:2.4G无线充电能否用于防盗?

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图