nrf24l01通信读取寄存器都为0

2019-07-18 16:06发布

我先把SPI输入输出短路,可以收到发送的数据,又用GPIO模拟SPI发送,nrf24l01是可以发送数据的,可是用硬件SPI控制nrf24l01就出现问题,给nrf寄存器写值时,可以返回一些值,这应该说明SPI是通的吧?但是一用SPI_Read读取写入的值就发现,就返回0x00,这到底是怎么回事啊??各位大神帮帮忙!!

部分程序如下:
//****************************************************************************************
//*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{   
    Delay_us(1200); //1.2ms???
         CE=0;    // chip enable
         CSN=1;   // Spi disable
         //SCK=0;   // Spi clock line init high
        //check=SPI_Read(READ_REG+STATUS);
        st=SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
        check=SPI_Read(READ_REG+STATUS);  
        
        st=SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址,频道0
        check=SPI_Read_Buf(READ_REG+RX_ADDR_P0, RX_ADDRESS1, RX_ADR_WIDTH);
//        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许        
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动        禁止ACK应答,debug
//        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  禁止接收地址只有频道0,debug
//        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //设置重发时间间隔:500us+86us,最大自动重发次数:10次
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发,debug
        st=SPI_RW_Reg(WRITE_REG + RF_CH, 40);                //   设置信道工作为2.4GHZ,收发必须一致
        check=SPI_Read(READ_REG+RF_CH);
        st=SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);                   //设置发射速率为2MHZ,发射功率为最大值0dB
        check=SPI_Read(READ_REG+RF_SETUP);
}
uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        
        CSN = 0;
        Delay_us(1);               // CSN low, initialize SPI communication...
        SPI_RW(reg);            // Select register to read from..
        reg_val = SPI_RW(0x0);    // ..then read registervalue
        CSN = 1;                // CSN high, terminate SPI communication
        return(reg_val);        // return register value
}




//****************************************************************************************************/
//*功能:NRF24L01读写寄存器函数
//写数据value到reg寄存器
//****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
        uchar status;
        
        CSN = 0;
        Delay_us(1);                  // CSN low, init SPI transaction
        status = SPI_RW(reg);      // select register
        st=SPI_RW(value);           // ..and write value to it..
        CSN = 1;                   // CSN high again        
        return(status);            // return nRF24L01 status uchar
}




//****************************************************************************************************/
//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
//*功能: 用于读数据,reg:为寄存器地址pBuf:为待读出数据地址,uchars:读出数据的个数
//****************************************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar  *pBuf, uchar uchars)
{
        uchar status,uchar_ctr;
        
        CSN = 0;
        Delay_us(1);                                   // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);                       // Select register to write to and read status uchar
        
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
                {
                        pBuf[uchar_ctr] = SPI_RW(0);
                        Delay_us(1);
                }
        
        CSN = 1;   
        return(status);                    // return nRF24L01 status uchar
}



//*********************************************************************************************************
//*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
//*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写数据个数
//*********************************************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uchar status,uchar_ctr;
        
        CSN = 0;
        Delay_us(1);            //SPI使能
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
                {
                        st=SPI_RW(*pBuf++);
                //        Delay_us(1);
                }
        CSN = 1;           //关闭SPI

        return(status);    //
}


void InitSpi(void)
{
   // Initialize SPI-A:
        //configure control register
   SpiaRegs.SPICCR.all= 0x07;        //进入初始状态,数据在上升沿输出,自测禁止,8位数据模式
   //configure operation register
   SpiaRegs.SPICTL.all= 0x06;        //clock开始为低电平,master,enable transmit,disable interrupt
   //set SPI BaudRate
   SpiaRegs.SPIBRR =0x0;             //baudrate=LSPCLK/4=4.6875MHZ
   SpiaRegs.SPICCR.all= 0x87;        //退出初始状态,准备发送

   //tbd...

}

unsigned int Spi_TxReady(void)
{
        unsigned int i;
        if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1)
        {
                i=0;
                bufflag0++;
        }
        else
        {
                i=1;
                bufflag1++;
        }
        return(i);
}

unsigned int Spi_RxReady(void)
{
        unsigned int i;
        if(SpiaRegs.SPISTS.bit.INT_FLAG==1)
        {
                i=1;
        }
        else
        {
                i=0;
        }
        return(i);
}

uchar SPI_RW(uchar uuchar)
{
        if(Spi_TxReady()==1)              //TxBuff未满,SPITXBUF不用初始化为0?
        {
                SpiaRegs.SPITXBUF=(((unsigned char)uuchar<<8)+0x00); //数据写入SPI发送缓冲区
                //spitxbuf++;
        }
        while(Spi_TxReady()!=1);

//        GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;

        while(Spi_RxReady()!=1);                //RXBUFF已接受完一个字
//        while(Spi_RxReady()==1)            
//        {
                        out=SpiaRegs.SPIDAT;
                                uuchar=(out&0xff);
//        }

    return(uuchar);                             // return read uchar
        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
candicezjm
2019-07-18 17:54
今天下午用示波器对比一下用GPIO口模拟SPI和SPI的输入输出波形,发现MOSI都是一样的,但是当输入寄存器地址是SPI的SOMI相比于模拟SPI落后一个时钟输出,并且用reg_read(0)时,硬件SPI读得都是0,我用GPIO模拟SPI是可以通信的,为什么硬件SPI就不行了呢?到底是哪出问题了,各位大神帮帮忙!!还有,用硬件SPI时,MOSI输出寄存器地址和读/写寄存器值时,中间相比于GPIO口模拟SPI有较长的时间间隔,这个有问题吗?PS:附件是对比波形图

本帖子中包含更多资源

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

x

一周热门 更多>