搜索
bottom↓
回复: 4

nrf24L01老是调不通,是电源的问题吗?

[复制链接]

出0入0汤圆

发表于 2013-7-31 21:33:17 | 显示全部楼层 |阅读模式
下面的是发送程序:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint bdata sta;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
//按键定义
sbit qian=P3^2;
sbit hou=P3^3;
sbit zuo=P3^4;
sbit you=P3^5;
//sbit a=P3^4;
//sbit b=P3^5;
//sbit c=P3^6;
//sbit back=P3^5;       
//NRF24L01端口定义
sbit  MISO =P2^1;
sbit  MOSI =P2^2;
sbit SCK =P2^3;
sbit CE  =P2^4;
sbit CSN =P2^5;
sbit IRQ =P2^6;

uchar TxBuf[20]={0};
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5    // 本机地址宽度设置
#define RX_ADR_WIDTH    5    // 接收方地址宽度设置
#define TX_PLOAD_WIDTH  20   // 4字节数据长度
#define RX_PLOAD_WIDTH  20   // 4字节数据长度
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#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栈入栈出状态寄存器设置
//函数申明
void delay(uchar t);  //延迟函数
void init_nRF24L01(void); //NRF24L01初始化函数
uchar SPI_RW(uchar byte); //NRF24L01的SPI写时序函数
uchar SPI_RW_Reg(uchar reg,uchar value); //寄存器访问函数
uchar SPI_Read(uchar reg); //读取寄存器值函数
//void Set_RX_Mode(void); //数据接收配置函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes); //接收缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes); //发射缓冲区访问函数
uchar nRF24L01_RxPacket(uchar *rx_buf); //数据读取后放缓冲区函数
void nRF24L01_TxPacket(uchar *tx_buf); //发送缓冲区数据函数
void UART_init(void);//串口初始化函数
uchar Keyscan(void); //按键检测函数
//****************函数编写**************************
//长延时函数
void delay(uchar t)
{
   uchar i;
   for(i=0;i<t;i++);
   for(i=0;i<t;i++);

}
//指令函数
void inerdelay(uchar n)
{
        for(;n>0;n--)
                _nop_();
}
//NRF24L01初始化函数
void init_nRF24L01(void)
{
        inerdelay(100);
        CE=0;  //芯片使能
        CSN=1;  
        SCK=0;
        SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
        SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
    SPI_RW_Reg(WRITE_REG+EN_RXADDR ,0X01);
        //SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X00);
        SPI_RW_Reg(WRITE_REG+RF_CH,0);
        SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
        SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07 );
        SPI_RW_Reg(WRITE_REG+CONFIG ,0X0E );
}
//NRF24L01的SPI写时序函数
uchar SPI_RW(uchar byte)
{
        uchar bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++)
        {
                MOSI=(byte&0x80);
                byte=(byte<<1);
                SCK=1;
                byte|=MISO;
                SCK=0;
        }
        return(byte);
}
// 寄存器访问函数
uchar SPI_RW_Reg(uchar reg,uchar value)
{
        uchar status;
        CSN=0;
        status=SPI_RW(reg);
        SPI_RW(value);
        CSN=1;
        return(status);
}
//读取寄存器值函数
uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        CSN=0;
        SPI_RW(reg);
        reg_val=SPI_RW(0);
        CSN=1;
        return(reg_val);
}                                                       
//接收缓冲区访问函数
/*uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
        uchar status,byte_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                pBuf[byte_ctr]=SPI_RW(0);
        CSN=1;
        return(status);
}                                                           */
//发射缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
        uchar status,byte_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                SPI_RW(*pBuf++);
        CSN=1;
        return (status);
}
//数据接收配置函数
/*void Set_RX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
        CE=1;
        inerdelay(130);   
}
//数据读取后放缓冲区函数
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
        uchar revale=0;
        sta=SPI_Read(STATUS);
        if(RX_DR)
        {
                CE=0;
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
                revale=1;
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);
        return revale;
}                                                 */
//发送缓冲区数据函数
void nRF24L01_TxPacket(uchar *tx_buf)
{
        CE=0;
        SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
        SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
        CE=1;
        inerdelay(10);
}
//****************************主函数**********************//
void main(void)
{
        uchar num;
        init_nRF24L01(); //NRF24L01初始化
        TxBuf[0]=0xff;
        nRF24L01_TxPacket(TxBuf);
        delay(6000);
        while(1)
        {
                num=0xf6;
                TxBuf[0]=num;
            nRF24L01_TxPacket(TxBuf);
                P1=SPI_Read(STATUS);
                delay(10000);
                SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
                delay(8000);

/*          if(qian==0)   
          {
                 while(!qian)                                       
                 {
                    num=0xfa;
                        TxBuf[0]=num;
                        nRF24L01_TxPacket(TxBuf);
                    P1=SPI_Read(STATUS);
            delay(10000);
            SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
            delay(8000)        ;
                 }
          }                 
          else if(hou==0)
          {
                 while(!hou)
                 {
                        num=0xf5;
                        TxBuf[0]=num;
                        nRF24L01_TxPacket(TxBuf);
                        P1=SPI_Read(STATUS);
                        delay(10000);
                        SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
                        delay(8000)        ;
                 }
          }
          else if(zuo==0)
          {
                 while(!zuo)
                 {
                        num=0xf9;
                        TxBuf[0]=num;
                    nRF24L01_TxPacket(TxBuf);
                        P1=SPI_Read(STATUS);
                        delay(10000);
                        SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
                        delay(8000)        ;                                            
                   }
          }       
          else if(you==0)
          {
                 while(!you)
                 {
                        num=0xf6;
                        TxBuf[0]=num;
                    nRF24L01_TxPacket(TxBuf);
                        P1=SPI_Read(STATUS);
                        delay(10000);
                        SPI_RW_Reg(WRITE_REG+STATUS,0Xff);
                        delay(8000)        ;
                   }
          }                          */
          TxBuf[0]=0xff;
      num=0xff;                       
        }
}



这个是接收程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//uchar N=0;
//uchar T=50;
sbit  MISO =P2^1;
sbit  MOSI =P2^2;
sbit SCK =P2^3;
sbit CE  =P2^4;
sbit CSN =P2^5;
sbit IRQ =P2^6;

uchar RxBuf[20]={0};
uchar bdata sta;

sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;

//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5    // 本机地址宽度设置
#define RX_ADR_WIDTH    5    // 接收方地址宽度设置
#define TX_PLOAD_WIDTH  20   // 4字节数据长度
#define RX_PLOAD_WIDTH  20  // 4字节数据长度
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x10,0x10,0x10,0x01}; //接收地址
/* #define TX_ADR_WIDTH    5    // 本机地址宽度设置
#define RX_ADR_WIDTH    5    // 接收方地址宽度设置
#define TX_PLOAD_WIDTH  20   // 4字节数据长度
#define RX_PLOAD_WIDTH  20   // 4字节数据长度 */
//***************************************NRF24L01寄存器指令*******************************************************
#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栈入栈出状态寄存器设置
//函数声明
void delay(uchar t);  //延迟函数
void init_nRF24L01(void); //NRF24L01初始化函数
uchar SPI_RW(uchar byte); //NRF24L01的SPI写时序函数
uchar SPI_RW_Reg(uchar reg,uchar value); //寄存器访问函数
uchar SPI_Read(uchar reg); //读取寄存器值函数
void Set_RX_Mode(void); //数据接收配置函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes); //接收缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes); //发射缓冲区访问函数
uchar nRF24L01_RxPacket(uchar *rx_buf); //数据读取后放缓冲区函数
void nRF24L01_TxPacket(uchar *tx_buf); //发送缓冲区数据函数
void UART_init(void);//串口初始化函数
uchar Keyscan(void); //按键检测函数
//****************函数编写**************************
//长延时函数
void delay(uchar t)
{
        uchar i;
        for(i=0;i<t;i++);
        for(i=0;i<t;i++);
}
//指令函数
void inerdelay(uchar n)
{
        for(;n>0;n--)
                _nop_();
}
//NRF24L01初始化函数
void init_nRF24L01(void)
{
        inerdelay(100);
        CE=0;  //芯片使能
        CSN=1;  
        SCK=0;
        SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
        SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
    SPI_RW_Reg(WRITE_REG+EN_RXADDR ,0X01);
        SPI_RW_Reg(WRITE_REG+RF_CH,0);
        SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
        SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07 );
        SPI_RW_Reg(WRITE_REG+CONFIG ,0X0f );
}
//NRF24L01的SPI写时序函数
uchar SPI_RW(uchar byte)
{
        uchar bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++)
        {
                MOSI=(byte&0x80);
                byte=(byte<<1);
                SCK=1;
                byte|=MISO;
                SCK=0;
        }
        return(byte);
}
// 寄存器访问函数
uchar SPI_RW_Reg(uchar reg,uchar value)
{
        uchar status;
        CSN=0;
        status=SPI_RW(reg);
        SPI_RW(value);
        CSN=1;
        return(status);
}
//读取寄存器值函数
uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        CSN=0;
        SPI_RW(reg);
        reg_val=SPI_RW(0);
        CSN=1;
        return(reg_val);
}
//接收缓冲区访问函数
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
        uchar status,byte_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                pBuf[byte_ctr]=SPI_RW(0);
        CSN=1;
        return(status);
}
//发射缓冲区访问函数
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
        uchar status,byte_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                SPI_RW(*pBuf++);
        CSN=1;
        return (status);
}
//数据接收配置函数
void Set_RX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
        CE=1;
        inerdelay(130);   
}
//数据读取后放缓冲区函数
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
        uchar revale=0;
        sta=SPI_Read(STATUS);
        if(RX_DR)
        {
                CE=0;
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
                revale=1;
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);
        return revale;
}
//发送缓冲区数据函数
/*void nRF24L01_TxPacket(uchar *tx_buf)
{
        CE=0;
        SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
        SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
        CE=1;
        inerdelay(10);
}                          */
void main()
{         
    init_nRF24L01() ;
//        P1=0x00;
        while(1)
        {
           Set_RX_Mode();
           P1=SPI_Read(STATUS);
           if(nRF24L01_RxPacket(RxBuf))
           {
                  P1=RxBuf[0];
                  delay(6400);
           }
           delay(6400);       
        }
}

问题:
1.第一个发射程序中取status状态寄存器中的值给P1口(即led灯,共阳),上电后发现灯不亮,但是弄一下电源引脚(即nrf的VCC),则有时亮P1端的5,6,7脚,有时就全亮,有时就亮0,4,5,6,7脚,为什么啊,是电源不稳定吗?按照数据手册中的来看的话,正常的应该是亮0,4,5,6,7脚,但是为什么会有时亮其他的情况呢?重新上电后又出现一开始的情况,即灯不亮,弄一下能亮,但是不稳定。
2.接收程序一上电,灯就全亮(也是共阳极的),这又是为什么呢?
这个nrf弄了很久了,很烦啊。上来论坛问问。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-31 22:57:27 | 显示全部楼层
是不是引脚虚焊?检查电源电压没问题,用示波器分别查看MOSI跟MISO引脚

出0入4汤圆

发表于 2013-7-31 23:06:45 | 显示全部楼层
一定要用线性的稳压电压。

出0入0汤圆

 楼主| 发表于 2013-8-1 00:10:28 | 显示全部楼层
wajlh 发表于 2013-7-31 23:06
一定要用线性的稳压电压。

电源我用的是9号电池(9V),加AMS117-3.3V电压模块,发觉没用啊。我也隐约觉得是不是跟电源有关系啊,但是不确定。主要是我用的是3.3V的稳压模块了,还不行吗?

出0入0汤圆

发表于 2013-8-1 08:26:56 | 显示全部楼层
程序写的好乱,有没有和单片机共地啊。你可以从最基本的程序调试起来吧,先验证对了,再进一步加入自己的应用。
给你个我根据网上找的改的测试程序,你改下端口试试看啊

本帖子中包含更多资源

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

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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