This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How does BLE + ESB receive?

Hello Nordic Engineer,

I'm a beginner

In this GitHub

If I add code after 473 lines

rx_payload.noack = true

what will the final result be?

Thanks

Parents
  • Hi Eric

    Which microcontroller are you using?

    If I add code after 473 lines

    rx_payload.noack = true

    Have you tried this yourself?
    If so, did it disable the ack in the rx payload as expected?

    Regards,
    Sigurd Hellesvik

  • Hi ,

    Can you answer this question, please?

    Thank you

  • Hi,

    Thank you for your reply

    I want to discuss the content of your reply in two parts

    Have in mind that when you are not using ACK, it is a chance that one or both devices will not receive the packet. 

    In my understanding, TX can send data to Rx

    If RX wants to send data to TX, it must use ACK

    RX can choose to turn off ack (do not send response to TX)

    TX can also choose to turn off ack (no response is received)

    Do I have a wrong understanding? (If I'm wrong, hope you can correct me)

    =========================

    So just to make sure I don't misunderstand the problem here, 
    are some packets received from the relay, 
    or are no packet received from the relay?

    "Relay" will only receive BLE data and send ESB_ ptx

    As for other Devices, they have the functions of TX and RX at the same time

    Thank you

  • eric_cheng said:
    RX can choose to turn off ack (do not send response to TX)

    This is not possible, it's only the TX that can control whether it want an ACK or not.

    eric_cheng said:
    TX can also choose to turn off ack (no response is received)

    Correct.

  • Thank you,

    TX can close or open ack, I understand this

    but for RX

    《rx_payload.noack = true;》What does this code do?

  • Calling rx_payload.noack in the callback irq handler will have no effect.

    If you don't want to receive an ack, then set this flag to true before calling nrf_esb_write_payload().

    Best regards,
    Kenneth

  • I don't quite understand the specific effect...

    But I turned them all off

    nrf_esb_config.selective_auto_ack = true;
    rx_payload.noack = true;

    =========================

    I describe my current approach

    Can you correct me if I'm doing something wrong?

    I used Timer1 to switch TX and RX In 《timer_event_handler》

    state = !state;
    
    if(state == true) 
    	{		
    		//memcpy(&nrf_esb_config, &tmp_config, sizeof(nrf_esb_config_t));
    		nrf_esb_config.payload_length     = 2; 
    		nrf_esb_config.protocol           = NRF_ESB_PROTOCOL_ESB_DPL;
    		nrf_esb_config.retransmit_delay   = 1000;
    		nrf_esb_config.bitrate            = NRF_ESB_BITRATE_2MBPS;
    		nrf_esb_config.event_handler      = nrf_esb_event_handler;
    		nrf_esb_config.mode               = NRF_ESB_MODE_PTX;
    		nrf_esb_config.tx_output_power		= NRF_ESB_TX_POWER_4DBM;
    		nrf_esb_config.selective_auto_ack = true;
    		nrf_esb_config.radio_irq_priority = 0; 
    	}
    	else
    	{
    		//memcpy(&nrf_esb_config, &tmp_config, sizeof(nrf_esb_config_t)); 
    		nrf_esb_config.payload_length     = 8;
    		nrf_esb_config.protocol           = NRF_ESB_PROTOCOL_ESB_DPL;
    		nrf_esb_config.bitrate            = NRF_ESB_BITRATE_2MBPS;
    		nrf_esb_config.mode               = NRF_ESB_MODE_PRX;
    		nrf_esb_config.event_handler      = nrf_esb_event_handler;
    		nrf_esb_config.selective_auto_ack = true;
    		nrf_esb_config.radio_irq_priority = 0;
    	}

    I don't know if it is correct to use timer to change TX and RX?

    Thank you

Reply
  • I don't quite understand the specific effect...

    But I turned them all off

    nrf_esb_config.selective_auto_ack = true;
    rx_payload.noack = true;

    =========================

    I describe my current approach

    Can you correct me if I'm doing something wrong?

    I used Timer1 to switch TX and RX In 《timer_event_handler》

    state = !state;
    
    if(state == true) 
    	{		
    		//memcpy(&nrf_esb_config, &tmp_config, sizeof(nrf_esb_config_t));
    		nrf_esb_config.payload_length     = 2; 
    		nrf_esb_config.protocol           = NRF_ESB_PROTOCOL_ESB_DPL;
    		nrf_esb_config.retransmit_delay   = 1000;
    		nrf_esb_config.bitrate            = NRF_ESB_BITRATE_2MBPS;
    		nrf_esb_config.event_handler      = nrf_esb_event_handler;
    		nrf_esb_config.mode               = NRF_ESB_MODE_PTX;
    		nrf_esb_config.tx_output_power		= NRF_ESB_TX_POWER_4DBM;
    		nrf_esb_config.selective_auto_ack = true;
    		nrf_esb_config.radio_irq_priority = 0; 
    	}
    	else
    	{
    		//memcpy(&nrf_esb_config, &tmp_config, sizeof(nrf_esb_config_t)); 
    		nrf_esb_config.payload_length     = 8;
    		nrf_esb_config.protocol           = NRF_ESB_PROTOCOL_ESB_DPL;
    		nrf_esb_config.bitrate            = NRF_ESB_BITRATE_2MBPS;
    		nrf_esb_config.mode               = NRF_ESB_MODE_PRX;
    		nrf_esb_config.event_handler      = nrf_esb_event_handler;
    		nrf_esb_config.selective_auto_ack = true;
    		nrf_esb_config.radio_irq_priority = 0;
    	}

    I don't know if it is correct to use timer to change TX and RX?

    Thank you

Children
Related