搜索
bottom↓
回复: 15

nrf24l01读出来的值全是0x00,求大神!!!!

[复制链接]

出0入0汤圆

发表于 2013-3-18 21:31:34 | 显示全部楼层 |阅读模式
nrf24l01寄存器开始读出是默认值,但后来读出来的数据都是0x00,写了寄存器还是一样,我用LM3S9B96驱动的
下面是程序

#ifndef _NRF24L01_H_
#define _NRF24L01_H_
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/interrupt.h"

#define  NRF_PERIPH      SYSCTL_PERIPH_GPIOH
#define  NRF_BASE        GPIO_PORTH_BASE   

#define  NRF_CE_PIN      GPIO_PIN_2    //RX/TX模式选择端
#define  NRF_CSN_PIN     GPIO_PIN_3     //SPI片选端//就是SS
#define  NRF_SCLK_PIN           GPIO_PIN_4    //SPI时钟端
#define  NRF_MOSI_PIN           GPIO_PIN_5    //SPI主机输出从机输入端
#define  NRF_MISO_PIN           GPIO_PIN_6    //SPI主机输r出从机输出端
#define  NRF_IRQ_PIN     GPIO_PIN_7     //可屏蔽中断端

#define  NRF_CE_SET      HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CE_PIN  << 2))
#define  NRF_IRQ_READ    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_IRQ_PIN << 2))
#define  NRF_CSN_SET     HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CSN_PIN << 2))
#define  NRF_MOSI_SET    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MOSI_PIN<< 2))
#define  NRF_MISO_READ   HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MISO_PIN<< 2))
#define  NRF_SCLK_SET    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_SCLK_PIN<< 2))
#define  Delay(X)        SysCtlDelay(X)


/***************************************************************************************************************/
#include "NRF24L01.h"

unsigned char TxAddr[]={0x34,0x43,0x10,0x10,0x01};//transmit address
/*****************status flag****************************************/
volatile unsigned char sta;   
/*sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;*/

/*****************************SPI time sequence******************************/
unsigned char NRFSPI(unsigned char date)
{
    unsigned char i;
           for(i=0;i<8;i++)          // circle eight times
           {
          if(date&0x80)
            NRF_MOSI_SET=0xff;
             date<<=1;             // 低一位移位到最高位
             NRF_SCLK_SET=0xff;
          if(NRF_MISO_READ)               // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
             date|=0x01;               // 读MISO到byte最低位
             NRF_SCLK_SET=0;                    // SCK set low
           }
    return(date);                  
}
/**********************NRF24L01 initialization *******************************/
void NRF24L01Int()
{
        Delay(2);//让系统什么都不干
        NRF_CE_SET=0; //待机模式1   
        NRF_CSN_SET=0xff;  
         NRF_SCLK_SET=0;
        //NRF_IRQ_READ=0xff;         
}
/*****************SPI read a byte in register*********************************/
unsigned char NRFReadReg(unsigned char RegAddr)
{
   unsigned char BackDate;
   NRF_CSN_SET=0;//enable SPI
   NRFSPI(RegAddr);//writing address of register to register
   BackDate=NRFSPI(0x00);//writing a command to register
   NRF_CSN_SET=0xff;
   return(BackDate);
}
/*****************SPI a byte to register*********************************/
unsigned char NRFWriteReg(unsigned char RegAddr,unsigned char date)
{
   unsigned char BackDate;
   NRF_CSN_SET=0;//启动时序
   BackDate=NRFSPI(RegAddr);//写入地址
   NRFSPI(date);//写入值
   NRF_CSN_SET=0xff;
   return(BackDate);
}
/*****************SPI read a value from RXFIFO register ********************************/
unsigned char NRFReadRxDate(unsigned char RegAddr,unsigned char *RxDate,unsigned char DateLen)
{  //寄存器地址//读取数据存放变量//读取数据长度//用于接收
    unsigned char BackDate,i;
        NRF_CSN_SET=0;//启动时序
        BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址
        for(i=0;i<DateLen;i++) //读取数据
          {
             RxDate[i]=NRFSPI(0);
          }
    NRF_CSN_SET=0xff;
   return(BackDate);
}
/*****************SPI write values to TXFIFO register**********************************/
unsigned char NRFWriteTxDate(unsigned char RegAddr,unsigned char *TxDate,unsigned char DateLen)
{ //寄存器地址//写入数据存放变量//读取数据长度//用于发送
   unsigned char BackDate,i;
   NRF_CSN_SET=0;
   BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址
   for(i=0;i<DateLen;i++)//写入数据
     {
            NRFSPI(*TxDate++);
           }   
   NRF_CSN_SET=0xff;
   return(BackDate);
}
/*****************NRF is set model of transmitting and send data******************************/
void NRFSetTxMode(unsigned char *TxDate)
{//发送模式
    NRF_CE_SET=0;
           NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+接收地址使能指令+接收地址+地址宽度
        NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
        NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据
        /******下面有关寄存器配置**************/
          NRFWriteReg(W_REGISTER+EN_AA,0x01);       // 使能接收通道0自动应答
          NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);   // 使能接收通道0
          NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  // 自动重发延时等待250us+86us,自动重发10次
          NRFWriteReg(W_REGISTER+RF_CH,0x40);         // 选择射频通道0x40
          NRFWriteReg(W_REGISTER+RF_SETUP,0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
        NRFWriteReg(W_REGISTER+CONFIG,0x0e);      // CRC使能,16位CRC校验,上电  
        NRF_CE_SET=0xff;
        Delay(5);//保持10us秒以上
}
/*****************NRF设置为接收模式并接收数据******************************/
//主要接收模式
void NRFSetRXMode()
{
        NRF_CE_SET=0;  
          NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);  // 接收设备接收通道0使用和发送设备相同的发送地址
          NRFWriteReg(W_REGISTER+EN_AA,0x01);               // 使能接收通道0自动应答
          NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);           // 使能接收通道0
          NRFWriteReg(W_REGISTER+RF_CH,0x40);                 // 选择射频通道0x40
          NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);  // 接收通道0选择和发送通道相同有效数据宽度
          NRFWriteReg(W_REGISTER+RF_SETUP,0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/
          NRFWriteReg(W_REGISTER+CONFIG,0x0f);              // CRC使能,16位CRC校验,上电,接收模式
          NRF_CE_SET = 0xff;
        Delay(5);//保持10us秒以上     
}
/****************************检测应答信号******************************/
unsigned char CheckACK()
{  //用于发射
        sta=NRFReadReg(R_REGISTER+STATUS);                    // 返回状态寄存器
        if((0x20&sta)||(0x10&sta)) //发送完毕中断TX_DS||MAX_RT 5 4
        {
           NRFWriteReg(W_REGISTER+STATUS,0xff);  // 清除TX_DS或MAX_RT中断标志
           NRF_CSN_SET=0;
           NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!  
       NRF_CSN_SET=0xff;
           return(0);
        }
        else
           return(1);
}
/******************判断是否接收收到数据,接到就从RX取出*********************/
//用于接收模式
unsigned char NRFRevDate(unsigned char *RevDate)
{
            unsigned char RevFlags=0;
         sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器
     if(0x40&sta)                                // 判断是否接收到数据RX_DR6
         {
            NRF_CE_SET=0;                         //SPI使能
                NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// 从RXFIFO读取数据
                RevFlags=1;           //读取数据完成标志
          }
         NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
         return(RevFlags);
}

int main(void)
{     unsigned char temp=0;
            SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                                          SYSCTL_XTAL_8MHZ);
            SysCtlPeripheralEnable(NRF_PERIPH);
            SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
                     GPIOPinTypeGPIOOutput(NRF_BASE, NRF_SCLK_PIN | NRF_CE_PIN  | NRF_CSN_PIN |
                              NRF_MOSI_PIN | NRF_SCLK_PIN);
            GPIOPinTypeGPIOInput(NRF_BASE,NRF_MISO_PIN);            
            NRF24L01Int();
           //temp= NRFWriteReg(W_REGISTER+CONFIG,0x0e);
            temp=NRFReadReg(0x00);//这里写寄存器地址,读出来总是0x00
                     while(temp);
}




出0入0汤圆

发表于 2013-3-19 23:29:31 | 显示全部楼层
代码好长啊。。。

出0入0汤圆

发表于 2013-3-20 10:25:12 | 显示全部楼层


unsigned char NRF24L01_Check(void)//检测24L01是否存在 0:失败  1:成功
{       
        unsigned char BackDate;
        unsigned char i,buf[5]={0xa5,0xa5,0xa5,0xa5,0xa5};        
        NRFWriteTxDate(W_REGISTER+TX_ADDR,buf,5);//写入5个字节的地址.
        NRFReadRxDate(TX_ADDR,buf,5);//读出写入的地址

        for(i=0;i<5;i++)//检测24L01错误       
                {
                 if(buf[i]!=0xa5)
                        {
                         BackDate=0;
                         break;
                         }                                                                   
                 else
                    {BackDate=1;}//检测到24L01
                }                        
        return BackDate;         
}

出0入0汤圆

发表于 2013-3-20 19:24:32 | 显示全部楼层
我的MFRC500读出来全是0X05......................................

出0入0汤圆

 楼主| 发表于 2013-3-24 21:31:31 | 显示全部楼层
解决了,谢谢你们

出0入0汤圆

发表于 2013-3-30 16:23:03 | 显示全部楼层
我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。
——我是在一个正确的程序上稍做的修改,但是就是不行,串口观察这些数据,就都是0x00.
您已经解决,不知可否给解释解释,帮帮吗?多谢。

出0入0汤圆

 楼主| 发表于 2013-3-31 14:14:50 | 显示全部楼层
zerolee18 发表于 2013-3-30 16:23
我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。

你把SPI代码发来看看

出0入0汤圆

发表于 2013-3-31 17:01:41 | 显示全部楼层
ele-madman 发表于 2013-3-31 14:14
你把SPI代码发来看看

你好,现在在吗??好的,我把程序传给你,马上。
我现在已经得到了另外一个程序,并做了修改已经顺利调好。
第一个,也就是0x00的还是没有想明白,你给看看,多请教了。
我是改的坛子里的一个收发一体一对一的程序,把它改成一个发射,一个接受。
我主要是改了主函数的部分,但是最后没调通。你给看看。多谢。

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-3-31 21:37:35 | 显示全部楼层
本帖最后由 ele-madman 于 2013-3-31 21:50 编辑
zerolee18 发表于 2013-3-31 17:01
你好,现在在吗??好的,我把程序传给你,马上。
我现在已经得到了另外一个程序,并做了修改已经顺利调 ...


你看下
uint SPI_RW(uint uchar)
{
        uint bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
                uchar = (uchar << 1);           // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                uchar |= MISO;                         // capture current MISO bit
                SCK = 0;                              // ..then set SCK low again
           }
    return(uchar);                             // return read uchar
}
这里改下试试,,,,MOSI = (uchar & 0x80) ? 1 : 0;    //你MOSI是位定义

出0入0汤圆

发表于 2013-3-31 22:45:39 | 显示全部楼层
ele-madman 发表于 2013-3-31 21:37
你看下
uint SPI_RW(uint uchar)
{

我现在没有权限,不能够直接对话,要不给个QQ号呗,在线聊聊。
并且最近在做一些东西,其中就有一块是无线通讯的2401,
希望交流交流,不吝赐教。

出0入0汤圆

 楼主| 发表于 2013-4-2 19:43:48 来自手机 | 显示全部楼层
zerolee18 发表于 2013-3-31 22:45
我现在没有权限,不能够直接对话,要不给个QQ号呗,在线聊聊。
并且最近在做一些东西,其中就有一块是无 ...

无线模块我只是照着例程条通的,,,要深入的话就无能为力了,,,到是很希望多交流QQ:390157155

出0入0汤圆

发表于 2013-4-10 21:46:17 | 显示全部楼层
你好,你们的nrf24l01的输出口输出脉冲的幅值是多少,我的是2.8伏,所以一直读不出来它的内部寄存器的值,(我的单片是5伏的,2.8伏达不到高电平的要求)

出0入0汤圆

发表于 2013-4-17 15:56:48 | 显示全部楼层
你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~

出0入0汤圆

 楼主| 发表于 2013-4-17 18:23:42 | 显示全部楼层
wbdos 发表于 2013-4-17 15:56
你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~

已发送

出0入0汤圆

发表于 2013-4-22 17:25:03 | 显示全部楼层
charlieholy 发表于 2013-3-20 19:24
我的MFRC500读出来全是0X05......................................

0x05 是  SPI模式的问题,调好,立马搞定

出0入0汤圆

 楼主| 发表于 2013-4-24 17:41:25 | 显示全部楼层
本帖最后由 ele-madman 于 2013-4-24 20:51 编辑



nrf24l01代码

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-11 20:30

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

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