Andrew--W 2023-05-01 16:24
浏览 23
已结题

NRF24L01配置动态负载数据长度就无法正常收发

我的STM32和NRF24L01配置了FEATURE和DYNPD以后就不能正常收发了,并且在上位机上测试是能够接收数据的,但是发送机还是判定为发送失败,但是下载程序到接收机上面,接收机却接收不到数据
这是接收机的接收模式配置

void NRF_RX_Mode(void)

{
    NRF_CE_LOW();    
    
     SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
     SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址
    
   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 

   SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE,0x06);     //使能动态负载(收发数据)长度
    
   SPI_NRF_WriteReg(NRF_WRITE_REG+DYNPD,0x01);       //使能通道0动态负载长度    

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);      //设置RF通信频率    

   SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
    
//        SPI_NRF_WriteReg(FLUSH_RX,NOP);

   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 

/*CE拉高,进入接收模式*/    
  NRF_CE_HIGH();
}

这是发送机的发送配置

void NRF_TX_Mode(void)
{  
    NRF_CE_LOW();        

   SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址 

   SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK   

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
    
     SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE,0x06);     //使能动态负载(收发数据)长度
//    
   SPI_NRF_WriteReg(NRF_WRITE_REG+DYNPD,0x01);       //使能通道0动态负载长度    

   SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);       //设置RF通道为CHANAL

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    
   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断

/*CE拉高,进入发送模式*/    
  NRF_CE_HIGH();
    Delay_us(50); //CE要拉高一段时间才进入发送模式
}

希望大家帮我看看配置方面是否有问题

void EXTI9_5_IRQHandler(void)
{
    u8 status;
    //判断是否是线路9引起的中断
    if(EXTI_GetITStatus(EXTI_Line9) != RESET)                    //RF有中断了           
    {
        if(NRF_Read_IRQ() == 0)
        { 
          status = SPI_NRF_ReadReg(STATUS);        //读状态寄存器完了判断是哪种中断状态 
            
          if(status & RX_DR)                //bit6:数据接收中断                             
          {
                    NRF_CE_LOW();
                    SPI_NRF_WriteBuf(W_ACK_PAYLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到ACK TX BUF
                    NRF_Rx_Dat(rxbuf);//读取数据
                    NRF_CE_HIGH();
                    sta=1;
          }
          else if(status & TX_DS)            //TX发送完成中断
                {
                    NRF_CE_LOW();
                    SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器     
                    NRF_CE_HIGH();                    
                                        
                } 
                else if(status & MAX_RT)            //TX发送完成中断
                {
                    NRF_CE_LOW();
                    SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器 
                    NRF_CE_HIGH();
                } 
                SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,status); 
      } 
        
        EXTI_ClearITPendingBit(EXTI_Line9);                       //清除中断线9
  } 
}

这是接收机的中断处理函数,我要实现的是ACK带负载数据和主机通讯,我是参考其他人的,大家帮忙看看哪里有问题

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 5月9日
    • 创建了问题 5月1日

    悬赏问题

    • ¥200 csgo2的viewmatrix值是否还有别的获取方式
    • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
    • ¥15 请把下列每一行代码完整地读懂并注释出来
    • ¥15 pycharm运行main文件,显示没有conda环境
    • ¥15 易优eyoucms关于二级栏目调用的问题
    • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
    • ¥15 为什么eclipse不能再下载了?
    • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
    • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
    • ¥15 特定网页无法访问,已排除网页问题