ele-madman 发表于 2013-3-18 21:31:34

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

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"

#defineNRF_PERIPH      SYSCTL_PERIPH_GPIOH
#defineNRF_BASE      GPIO_PORTH_BASE   

#defineNRF_CE_PIN      GPIO_PIN_2    //RX/TX模式选择端
#defineNRF_CSN_PIN   GPIO_PIN_3   //SPI片选端//就是SS
#defineNRF_SCLK_PIN           GPIO_PIN_4    //SPI时钟端
#defineNRF_MOSI_PIN           GPIO_PIN_5    //SPI主机输出从机输入端
#defineNRF_MISO_PIN           GPIO_PIN_6    //SPI主机输r出从机输出端
#defineNRF_IRQ_PIN   GPIO_PIN_7   //可屏蔽中断端

#defineNRF_CE_SET      HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CE_PIN<< 2))
#defineNRF_IRQ_READ    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_IRQ_PIN << 2))
#defineNRF_CSN_SET   HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CSN_PIN << 2))
#defineNRF_MOSI_SET    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MOSI_PIN<< 2))
#defineNRF_MISO_READ   HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MISO_PIN<< 2))
#defineNRF_SCLK_SET    HWREG(NRF_BASE + GPIO_O_DATA + (NRF_SCLK_PIN<< 2))
#defineDelay(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=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);
}




crazy_bin 发表于 2013-3-19 23:29:31

代码好长啊。。。

fangjikun 发表于 2013-3-20 10:25:12



unsigned char NRF24L01_Check(void)//检测24L01是否存在 0:失败1:成功
{       
        unsigned char BackDate;
        unsigned char i,buf={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!=0xa5)
                        {
                       BackDate=0;
                       break;
                       }                                                                 
               else
                  {BackDate=1;}//检测到24L01
                }                      
        return BackDate;       
}

charlieholy 发表于 2013-3-20 19:24:32

我的MFRC500读出来全是0X05......................................

ele-madman 发表于 2013-3-24 21:31:31

解决了,谢谢你们

zerolee18 发表于 2013-3-30 16:23:03

我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。
——我是在一个正确的程序上稍做的修改,但是就是不行,串口观察这些数据,就都是0x00.
您已经解决,不知可否给解释解释,帮帮吗?多谢。

ele-madman 发表于 2013-3-31 14:14:50

zerolee18 发表于 2013-3-30 16:23 static/image/common/back.gif
我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。


你把SPI代码发来看看

zerolee18 发表于 2013-3-31 17:01:41

ele-madman 发表于 2013-3-31 14:14 static/image/common/back.gif
你把SPI代码发来看看

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

ele-madman 发表于 2013-3-31 21:37:35

本帖最后由 ele-madman 于 2013-3-31 21:50 编辑

zerolee18 发表于 2013-3-31 17:01 static/image/common/back.gif
你好,现在在吗??好的,我把程序传给你,马上。
我现在已经得到了另外一个程序,并做了修改已经顺利调 ...

你看下
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是位定义

zerolee18 发表于 2013-3-31 22:45:39

ele-madman 发表于 2013-3-31 21:37 static/image/common/back.gif
你看下
uint SPI_RW(uint uchar)
{


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

ele-madman 发表于 2013-4-2 19:43:48

zerolee18 发表于 2013-3-31 22:45
我现在没有权限,不能够直接对话,要不给个QQ号呗,在线聊聊。
并且最近在做一些东西,其中就有一块是无 ...

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

zhangji 发表于 2013-4-10 21:46:17

你好,你们的nrf24l01的输出口输出脉冲的幅值是多少,我的是2.8伏,所以一直读不出来它的内部寄存器的值,(我的单片是5伏的,2.8伏达不到高电平的要求)

wbdos 发表于 2013-4-17 15:56:48

你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~

ele-madman 发表于 2013-4-17 18:23:42

wbdos 发表于 2013-4-17 15:56 static/image/common/back.gif
你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~

已发送

achieveIEEE 发表于 2013-4-22 17:25:03

charlieholy 发表于 2013-3-20 19:24 static/image/common/back.gif
我的MFRC500读出来全是0X05......................................

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

ele-madman 发表于 2013-4-24 17:41:25

本帖最后由 ele-madman 于 2013-4-24 20:51 编辑



nrf24l01代码
页: [1]
查看完整版本: nrf24l01读出来的值全是0x00,求大神!!!!