当前位置: 代码迷 >> Wireless >> nrf24l01通信读取寄存器都为0,该怎么处理
  详细解决方案

nrf24l01通信读取寄存器都为0,该怎么处理

热度:403   发布时间:2016-04-28 09:35:09.0
nrf24l01通信读取寄存器都为0
我先把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