Sometimes RF 2.4G Tx without a NRF_RADIO_EVENT_END event

Hi there,

I'm working on nrf52840 & NCS 2.0.0.  Sometime I can not get a NRF_RADIO_EVENT_END event so the while loop under the radio_tx function will be stuck.

Is there any suggestions?

void radio_tx(uint8_t channel, uint8_t pattern, uint8_t *packet)
{
    radio_disable();
    
    radio_config(pattern);
    nrf_radio_mode_set(NRF_RADIO, NRF_RADIO_MODE_BLE_1MBIT);
    
    nrf_radio_shorts_enable(NRF_RADIO, 
                NRF_RADIO_SHORT_READY_START_MASK |
                NRF_RADIO_SHORT_END_DISABLE_MASK);

    nrf_radio_packetptr_set(NRF_RADIO, packet);

    nrf_radio_txpower_set(NRF_RADIO, RADIO_TXPOWER_TXPOWER_Pos4dBm);
    
    nrf_radio_frequency_set(NRF_RADIO, CHAN_TO_FREQ(channel));

    nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_END);
    nrf_radio_event_clear(NRF_RADIO, NRF_RADIO_EVENT_READY);

    //nrf_radio_int_enable(NRF_RADIO, NRF_RADIO_INT_END_MASK);
    // printk("NRF_RADIO_INT_END_MASK\n");

    nrf_radio_task_trigger(NRF_RADIO, NRF_RADIO_TASK_TXEN);

    while(!nrf_radio_event_check(NRF_RADIO, NRF_RADIO_EVENT_END)) {
        // wait for transmit tx packet
    }
}


static void radio_config(uint8_t pattern)
{
    uint8_t playload_length;
    nrf_radio_packet_conf_t packet_conf;

    nrf_radio_modecnf0_set(NRF_RADIO, true, RADIO_MODECNF0_DTX_Center);

    nrf_radio_txaddress_set(NRF_RADIO, 0);
    nrf_radio_rxaddresses_set(NRF_RADIO, 1);

    switch (pattern)
    {
    case TRANSMIT_PATTERN_SHORT :
        nrf_radio_crc_configure(NRF_RADIO, RADIO_CRCCNF_LEN_Two, NRF_RADIO_CRC_ADDR_INCLUDE, 0x880083);
        nrf_radio_prefix0_set(NRF_RADIO, 0xA0);
        nrf_radio_base0_set(NRF_RADIO, 0x38393A3B);
        playload_length = 28;
        break;
    
    case TRANSMIT_PATTERN_LONG :
        nrf_radio_crc_configure(NRF_RADIO, RADIO_CRCCNF_LEN_Two, NRF_RADIO_CRC_ADDR_INCLUDE, 0x47CF56);
        nrf_radio_prefix0_set(NRF_RADIO, 0xA0);
        nrf_radio_base0_set(NRF_RADIO, 0x5C5D5E5F);
        playload_length = 249;
        break;

    case TRANSMIT_PATTERN_OTA :
        nrf_radio_crc_configure(NRF_RADIO, RADIO_CRCCNF_LEN_Two, NRF_RADIO_CRC_ADDR_INCLUDE, 0x47CF56);
        nrf_radio_prefix0_set(NRF_RADIO, 0xBB);
        nrf_radio_base0_set(NRF_RADIO, 0xC5D5E5F5);
        playload_length = 249;
        break;

    default:
        break;
    }
    nrf_radio_crcinit_set(NRF_RADIO, 0xffff);

    memset(&packet_conf, 0, sizeof(packet_conf));
/*** PCNF0 ***/ 
    packet_conf.lflen = 0;
    packet_conf.s0len = 0;
    packet_conf.s1len = 0;
    packet_conf.s1incl = 0;
    packet_conf.cilen = 0;
    packet_conf.plen = NRF_RADIO_PREAMBLE_LENGTH_8BIT;
    packet_conf.crcinc = 0;
    packet_conf.termlen =0;

/*** PCNF1 ***/
    packet_conf.maxlen = playload_length;
    packet_conf.statlen = playload_length;
    packet_conf.balen = 4;
    packet_conf.big_endian = false;
    packet_conf.whiteen = true; 

    nrf_radio_packet_configure(NRF_RADIO, &packet_conf);
}
radio

 

Related