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