单片机/MCU论坛
直播中

周龙

6年用户 24经验值
私信 关注

51单片机NRF24L01发送端发送失败,求助

本帖最后由 awellpoint 于 2018-11-4 07:53 编辑

问题:使用stc89c52+NRF24L01向STM32f103发送数据失败,按照网上调试经验,先屏蔽自动应答,自动重发,撇开接收端,单独调试发送端,判断发送中断,数据还是发送不出去。
现象:初始时判读模块是否存在,读写TX_ADDR寄存器相等,证明spi读写时序无问题,单次发送STATUS寄存器为0x0e,FIFO_STATUS寄存器为0x01;TX_DS未中断置1,TX_FIFO为还有数据。
发送模式和发送函数代码:
void NRF24L01_TX_Mode(void)
{                                                                                                                 
//        NRF24L01_CE=0;            
          NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
          NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK         


          NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答   
          NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
          NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
          NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
          NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
          NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断
        
        //调试时失能应答重发 这样发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送
        NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);     //使能通道0的自动应答   
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址
        NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次  
               
//        NRF24L01_CE=1;//CE为高,10us后启动发送
}





>u8 NRF24L01_TxPacket(u8 *txbuf)
{
  u8 sta=0,fifosta=0;
        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff);

        NRF24L01_CE=0;
  NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
         NRF24L01_CE=1;
        Delay10us();//NRF24L01_CE=1 10u后启动发送        

        sta=NRF24L01_Read_Reg(NRF_READ_REG+STATUS);  //读取状态寄存器的值(读出来为0x0e)
        
        Lcd1602_WriteString(2,1,"STA:0x");        
        Lcd1602_WriteChar(2,7,(sta/16>9)?(sta/16+'A'):(sta/16+'0'));
        Lcd1602_WriteChar(2,8,(sta%16>9)?(sta%16-10+'A'):(sta%16+'0'));
        ledport=sta;
        
        Lcd1602_WriteString(2,10,"FO:0x");
        fifosta=NRF24L01_Read_Reg(NRF_READ_REG+NRF_FIFO_STATUS);(FIFO状态寄存器读出来为0x01)
        Lcd1602_WriteChar(2,15,(fifosta/16>9)?(fifosta/16+'A'):(fifosta/16+'0'));
        Lcd1602_WriteChar(2,16,(fifosta%16>9)?(fifosta%16-10+'A'):(fifosta%16+'0'));
        ledport=fifosta;
        
        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
        if(sta&MAX_TX)//达到最大重发次数
        {
                NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
                return MAX_TX;
        }
        if(sta&TX_OK)//发送完成
        {
                return TX_OK;
        }
        
        return 0xff;//其他原因发送失败
}

已退回10积分

更多回帖

发帖
×
20
完善资料,
赚取积分