This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nrf24l01 playload datarate

When I have a test using nRF24l01+ with STM32, I can only get a playload datarate no more than 450kbps using nRF24l01+ 2M mode. How can increase the playload data rate and what is the maximum for the playload data rate? Thanks.

Parents
  • Hi,

    Thanks for you feedback. 1)The auto ACK NOT enable.I used maximum payload size (32). 2)In the testing, when a packer(32bytes) sent, 300-400us will wait for sending the next.It will take more than 500us to send a single packet.If this were is no wait, the receiver can not get correct packets. 3)The radio capability for the throughput is 2Mbps. In my testing, the sending throughput is much lower the capability .

    I also have a test for the EN_AA enabled, Looks the throughput is no more than 500kbps.

    In my testing, looks the receiver can not get the data immediately if keep a low error packet rate. The configuration as below: FOR TX: NRF24L01_CE=0;
    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

    NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x00); 
    NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); 
    //NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);
    NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x0);
    
    NRF24L01_Write_Reg(WRITE_REG+RF_CH,120);  
    //NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);
    NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); 
    //NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e); 
    NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x02); 
    NRF24L01_CE=1;
    

    FOR RX: NRF24L01_CE=0;
    NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

    NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x00);    
    NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);
    //NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x00);
    NRF24L01_Write_Reg(WRITE_REG+RF_CH,120);	  	  
    NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
    NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);
    //NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
    NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x03);
    NRF24L01_CE = 1; 
    

    Is there any unreasonable configuration?

    Thanks Yong

  • I have a testing as below:

    define MAX_TX 0x10 define TX_OK 0x20 define RX_OK 0x40

    u8 NRF24L01_TxPacketContinous(u8 txbuf[8][32],u8 packetNum) { u8 sta,i; u8 outPut[20];

    //NRF24L01_CE=0;
    //NRF24L01_CE=1; //always in 1
    for(i = 0 ; i < packetNum; i ++){
    	while(1){
            sta=NRF24L01_Read_Reg(STATUS);  //get status	
            if(!(sta&0x1)) //TX FIFO not full
            {
    		    NRF24L01_Write_Buf(WR_TX_PLOAD,&txbuf[i][0],TX_PLOAD_WIDTH);//write data to FIFO
    		    break;
            }
    	}
    while(NRF24L01_IRQ!=0);
    }
    while(1){
      sta=NRF24L01_Read_Reg(STATUS);  //get status	 
      if(sta&0x20) //send comlete
      {
        break;
      }
    }
    NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);
    if(sta&MAX_TX)
    {
    	NRF24L01_Write_Reg(FLUSH_TX,0xff);
    	llprintf("tran failed\n");
    	return MAX_TX; 
    }
    if(sta&TX_OK)//SEND COMPLETED
    {
    	return TX_OK;
    }
    
    return 0xff;//OTHER ERROR
    

    } But it not well.Looks some packet lost or can not be received correctly. Thanks. Yong

Reply
  • I have a testing as below:

    define MAX_TX 0x10 define TX_OK 0x20 define RX_OK 0x40

    u8 NRF24L01_TxPacketContinous(u8 txbuf[8][32],u8 packetNum) { u8 sta,i; u8 outPut[20];

    //NRF24L01_CE=0;
    //NRF24L01_CE=1; //always in 1
    for(i = 0 ; i < packetNum; i ++){
    	while(1){
            sta=NRF24L01_Read_Reg(STATUS);  //get status	
            if(!(sta&0x1)) //TX FIFO not full
            {
    		    NRF24L01_Write_Buf(WR_TX_PLOAD,&txbuf[i][0],TX_PLOAD_WIDTH);//write data to FIFO
    		    break;
            }
    	}
    while(NRF24L01_IRQ!=0);
    }
    while(1){
      sta=NRF24L01_Read_Reg(STATUS);  //get status	 
      if(sta&0x20) //send comlete
      {
        break;
      }
    }
    NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);
    if(sta&MAX_TX)
    {
    	NRF24L01_Write_Reg(FLUSH_TX,0xff);
    	llprintf("tran failed\n");
    	return MAX_TX; 
    }
    if(sta&TX_OK)//SEND COMPLETED
    {
    	return TX_OK;
    }
    
    return 0xff;//OTHER ERROR
    

    } But it not well.Looks some packet lost or can not be received correctly. Thanks. Yong

Children
No Data
Related