tonghan2009 发表于 2018-11-16 20:43:58

nrf24l01+ 自动应答失败


目前调试24L01+,非自动应答可以收到数据,但自动应答时,一直出现达到最大重发次数,但接收方有收到数据。
发送端:
oid ANO_NRF_TX_MODE(void)
{

      ANO_SPI_CE_L();
      
      ANO_NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);               //写TX节点地址
      ANO_NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);      //写RX节点地址,使能ACK
      
      ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);                                                                                                         //使能通道0的自动应答 0X01
      ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);                                                                                        //使能通道0的接收地址 0X01
      ANO_NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1A);                                                                                        //设置自动重发间隔时间:500us;最大自动重发次数:10次 2M波特率下 0X1a
      ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40);                                                                                                                //设置RF通道为CHANAL   必须一致
      ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);                                                                                                 //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 必须一致
      ANO_NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);                                                                //选择通道0的有效数据宽度
      ANO_NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);                  // IRQ收发完成中断开启,16位CRC,主发送
      ANO_SPI_CE_H();
      delay_us(10);
}

接收端配置:
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;         
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
         
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+RF_CH,40);             //设置RF通信频率                  
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度            
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式

NRF24L01_CE = 1; //CE为高,进入接收模式

mzy2364 发表于 2018-11-16 20:59:33

看看发送数据函数

tonghan2009 发表于 2018-11-17 08:50:19

mzy2364 发表于 2018-11-16 20:59
看看发送数据函数

u8 ANO_NRF_TxPacket(uint8_t *tx_buf)
{               
        u8 sta=0;   //寄存器调试代码用变量
       
        SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)   
        ANO_SPI_CE_L();               //StandBy I模式       
        ANO_NRF_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
        ANO_NRF_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                        // 装载数据       
        ANO_SPI_CE_H();               //置高CE,激发数据发送
        while(NRF24L01_IRQ!=0);//等待发送完成
       
        sta=ANO_NRF_Read_Reg(NRFRegSTATUS);//读取状态寄存器的值               
        ANO_NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,sta); //清除TX_DS或MAX_RT中断标志
        if(sta&MAX_TX)//达到最大重发次数
        {
                ANO_LED1_BULING();
                ANO_NRF_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
                return MAX_TX;
        }
        if(sta&TX_OK)//发送完成
        {
                return TX_OK;
        }
        return 0xff;//其他原因发送失败
}

tonghan2009 发表于 2018-11-17 08:52:30

tonghan2009 发表于 2018-11-17 08:50
u8 ANO_NRF_TxPacket(uint8_t *tx_buf)
{               
        u8 sta=0;   //寄存器调试代码用变量


发送的用STM32F103 接收用STM32F407,这样对SPI读写速度是不是有要求,不过我都设置了8分频了

党国特派员 发表于 2018-12-3 17:39:01

2.4G 干扰太多了。是会出现这种情况。
页: [1]
查看完整版本: nrf24l01+ 自动应答失败