@@ -237,14 +237,14 @@ struct esb_radio_pdu {
237237 * guide for more information.
238238 */
239239struct esb_address {
240- uint8_t base_addr_p0 [4 ]; /* Base address for pipe 0, in big endian. */
240+ uint8_t base_addr_p0 [4 ]; /* Base address for pipe 0, in big endian. */
241241 uint8_t base_addr_p1 [4 ]; /* Base address for pipe 1-7, in big endian. */
242- uint8_t pipe_prefixes [8 ]; /* Address prefix for pipe 0 to 7. */
243- uint8_t num_pipes ; /* Number of pipes available. */
244- uint8_t addr_length ; /* Length of the address plus the prefix. */
245- uint8_t rx_pipes_enabled ; /* Bitfield for enabled pipes. */
246- uint8_t rf_channel ; /* Channel to use (between 0 and 100). */
247- atomic_t rf_channel_flags ; /* Flags for setting the channel. */
242+ uint8_t pipe_prefixes [8 ]; /* Address prefix for pipe 0 to 7. */
243+ uint8_t num_pipes ; /* Number of pipes available. */
244+ uint8_t addr_length ; /* Length of the address plus the prefix. */
245+ uint8_t rx_pipes_enabled ; /* Bitfield for enabled pipes. */
246+ uint8_t rf_channel ; /* Channel to use (between 0 and 100). */
247+ atomic_t rf_channel_flags ; /* Flags for setting the channel. */
248248};
249249
250250static nrfx_timer_t esb_timer = ESB_NRFX_TIMER_INSTANCE ;
@@ -355,8 +355,8 @@ static void on_radio_disabled_tx_noack(void);
355355static void on_radio_disabled_tx (void );
356356static void on_radio_disabled_tx_wait_for_ack (void );
357357static void on_radio_disabled_rx (void );
358- static void on_radio_disabled_rx_ack (void );
359- static void on_radio_end_tx_noack (void );
358+ static void on_radio_disabled_rx_send_ack (void );
359+ static void on_timer_compare1_tx_noack (void );
360360
361361/* Function to do bytewise bit-swap on an unsigned 32-bit value */
362362static uint32_t bytewise_bit_swap (const uint8_t * input )
@@ -1139,7 +1139,7 @@ static bool rx_fifo_push_rfbuf(uint8_t pipe, uint8_t pid)
11391139
11401140static void esb_timer_handler (nrf_timer_event_t event_type , void * context )
11411141{
1142- if (nrf_timer_int_enable_check ( esb_timer . p_reg , NRF_TIMER_INT_COMPARE1_MASK ) ) {
1142+ if (event_type == NRF_TIMER_EVENT_COMPARE1 ) {
11431143 if (on_timer_compare1 != NULL ) {
11441144 on_timer_compare1 ();
11451145 }
@@ -1236,9 +1236,7 @@ static void start_tx_transaction(void)
12361236
12371237 memcpy (pdu -> data , current_payload -> data , current_payload -> length );
12381238
1239- /* Handling ack if noack is set to false or if
1240- * selective auto ack is turned off
1241- */
1239+ /* Handling ack if noack is set to false or if selective auto ack is turned off */
12421240 if (ack ) {
12431241 if (fast_switching ) {
12441242 nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common );
@@ -1269,10 +1267,10 @@ static void start_tx_transaction(void)
12691267 /* Configure PPI to start the timer when transmission ends */
12701268 esb_ppi_for_wait_for_rx_set ();
12711269
1272- on_timer_compare1 = on_radio_end_tx_noack ;
1270+ on_timer_compare1 = on_timer_compare1_tx_noack ;
12731271 on_radio_disabled = NULL ;
12741272 is_tx_idle = ((esb_state == ESB_STATE_PTX_TXIDLE ) ||
1275- (esb_state == ESB_STATE_PTX_TX ));
1273+ (esb_state == ESB_STATE_PTX_TX ));
12761274 esb_state = ESB_STATE_PTX_TX ;
12771275 } else {
12781276 nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common |
@@ -1327,10 +1325,10 @@ static void set_evt_interrupt(void)
13271325 }
13281326}
13291327
1330- static void on_radio_end_tx_noack (void )
1328+ static void on_timer_compare1_tx_noack (void )
13311329{
13321330 /* Timer compare is cleared by PPI - we still need to disable Interrupt flag */
1333- nrf_timer_int_disable (esb_timer .p_reg , nrf_timer_compare_int_get ( NRF_TIMER_CC_CHANNEL1 ) );
1331+ nrf_timer_int_disable (esb_timer .p_reg , NRF_TIMER_INT_COMPARE1_MASK );
13341332 esb_ppi_for_wait_for_rx_clear ();
13351333
13361334 interrupt_flags |= INT_TX_SUCCESS_MSK ;
@@ -1463,89 +1461,129 @@ static void on_radio_disabled_tx_wait_for_ack(void)
14631461 set_evt_interrupt ();
14641462 start_tx_transaction ();
14651463 }
1466- } else {
1467- if ( retransmits_remaining -- == 0 ) {
1464+ } else if ( retransmits_remaining -- == 0 ) {
1465+ /* All retransmits are expended, and the TX operation is suspended */
14681466#if NRF_TIMER_HAS_SHUTDOWN
1469- nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_SHUTDOWN );
1467+ nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_SHUTDOWN );
14701468#else
1471- nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_STOP );
1472- nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_CLEAR );
1469+ nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_STOP );
1470+ nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_CLEAR );
14731471#endif
14741472
1475- /* All retransmits are expended, and the TX operation is
1476- * suspended
1477- */
1478- last_tx_attempts = esb_cfg .retransmit_count + 1 ;
1479- interrupt_flags |= INT_TX_FAILED_MSK ;
1473+ last_tx_attempts = esb_cfg .retransmit_count + 1 ;
1474+ interrupt_flags |= INT_TX_FAILED_MSK ;
14801475
1481- esb_state = ESB_STATE_IDLE ;
1482- errata_216_off ();
1483- set_evt_interrupt ();
1484- } else {
1485- bool radio_started = true;
1476+ esb_state = ESB_STATE_IDLE ;
1477+ errata_216_off ();
1478+ set_evt_interrupt ();
1479+ } else {
1480+ /* There are still more retransmits left, TX mode should
1481+ * be entered again as soon as the system timer reaches
1482+ * CC[1].
1483+ */
14861484
1487- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_READY );
1485+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_READY );
14881486
1489- /* There are still more retransmits left, TX mode should
1490- * be entered again as soon as the system timer reaches
1491- * CC[1].
1492- */
1493- if (fast_switching ) {
1494- nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common );
1495- nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
1496- nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
1497- } else {
1498- nrf_radio_shorts_set (NRF_RADIO ,
1499- (radio_shorts_common | NRF_RADIO_SHORT_DISABLED_RXEN_MASK ));
1500- }
1501- update_rf_payload_format (current_payload -> length );
1487+ if (fast_switching ) {
1488+ nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common );
1489+ nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
1490+ nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
1491+ } else {
1492+ nrf_radio_shorts_set (NRF_RADIO ,
1493+ (radio_shorts_common | NRF_RADIO_SHORT_DISABLED_RXEN_MASK ));
1494+ }
1495+ update_rf_payload_format (current_payload -> length );
15021496
1503- nrf_radio_packetptr_set (NRF_RADIO , tx_payload_buffer );
1497+ nrf_radio_packetptr_set (NRF_RADIO , tx_payload_buffer );
15041498
1505- on_radio_disabled = on_radio_disabled_tx ;
1506- esb_state = ESB_STATE_PTX_TX_ACK ;
1499+ on_radio_disabled = on_radio_disabled_tx ;
1500+ esb_state = ESB_STATE_PTX_TX_ACK ;
15071501
1508- update_radio_tx_power ();
1502+ update_radio_tx_power ();
15091503
1510- /* Transmission is armed on TIMER's CC1. */
1511- esb_fem_for_tx_retry ();
1512- esb_ppi_for_retransmission_set ();
1504+ /* Transmission is armed on TIMER's CC1. */
1505+ esb_fem_for_tx_retry ();
1506+ esb_ppi_for_retransmission_set ();
15131507
1514- /* Check if PPI worked. If not we are to late with retransmission but it is
1515- * ok to start retransmission here.
1516- */
1517- if (nrf_timer_event_check (esb_timer .p_reg , NRF_TIMER_EVENT_COMPARE1 )) {
1518- radio_started =
1519- (nrf_radio_state_get (NRF_RADIO ) == NRF_RADIO_STATE_TXRU ) ||
1508+ /* Check if PPI worked. If not we are to late with retransmission but it is
1509+ * ok to start retransmission here.
1510+ */
1511+ bool radio_started = true;
1512+
1513+ if (nrf_timer_event_check (esb_timer .p_reg , NRF_TIMER_EVENT_COMPARE1 )) {
1514+ radio_started = (nrf_radio_state_get (NRF_RADIO ) == NRF_RADIO_STATE_TXRU ) ||
15201515 (nrf_radio_event_check (NRF_RADIO , NRF_RADIO_EVENT_READY ));
1521- } else {
1522- /* Resume timer in case of CRC errors. */
1523- nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_START );
1524- }
1516+ } else {
1517+ /* Resume timer in case of CRC errors. */
1518+ nrf_timer_task_trigger (esb_timer .p_reg , NRF_TIMER_TASK_START );
1519+ }
15251520
1526- if (!radio_started ) {
1527- /* Clear retransmission configuration. */
1528- esb_fem_for_tx_retry_clear ();
1529- esb_ppi_for_retransmission_clear ();
1530-
1531- /* Start radio here. */
1532- esb_ppi_for_txrx_set (false, true);
1533- esb_fem_for_tx_set (true);
1534-
1535- radio_start ();
1536- } else if (nrf54h_errata_216 ()) {
1537- uint16_t ramp_up = esb_cfg .use_fast_ramp_up ?
1538- TX_FAST_RAMP_UP_TIME_US : TX_RAMP_UP_TIME_US ;
1539- int32_t min_time = esb_cfg .retransmit_delay - ramp_up -
1540- wait_for_ack_timeout_us - ADDR_EVENT_LATENCY_US ;
1541- if (min_time > ERRATA_216_MIN_TIME_TO_DISABLE_US ) {
1542- errata_216_off ();
1543- }
1521+ if (!radio_started ) {
1522+ /* Clear retransmission configuration. */
1523+ esb_fem_for_tx_retry_clear ();
1524+ esb_ppi_for_retransmission_clear ();
1525+
1526+ /* Start radio here. */
1527+ esb_ppi_for_txrx_set (false, true);
1528+ esb_fem_for_tx_set (true);
1529+
1530+ radio_start ();
1531+ } else if (nrf54h_errata_216 ()) {
1532+ uint16_t ramp_up = esb_cfg .use_fast_ramp_up ? TX_FAST_RAMP_UP_TIME_US
1533+ : TX_RAMP_UP_TIME_US ;
1534+ int32_t min_time = esb_cfg .retransmit_delay - ramp_up -
1535+ wait_for_ack_timeout_us - ADDR_EVENT_LATENCY_US ;
1536+ if (min_time > ERRATA_216_MIN_TIME_TO_DISABLE_US ) {
1537+ errata_216_off ();
15441538 }
15451539 }
15461540 }
15471541}
15481542
1543+ static void start_rx_listening (void )
1544+ {
1545+ nrf_radio_int_disable (NRF_RADIO , 0xFFFFFFFF );
1546+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
1547+
1548+ if (esb_cfg .mode == ESB_MODE_MONITOR ) {
1549+ nrf_radio_shorts_set (NRF_RADIO , RADIO_SHORTS_MONITOR );
1550+ nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
1551+ nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
1552+ on_radio_disabled = NULL ;
1553+ } else {
1554+ if (fast_switching ) {
1555+ nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common );
1556+ nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
1557+ nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
1558+ } else {
1559+ nrf_radio_shorts_set (NRF_RADIO , (radio_shorts_common |
1560+ NRF_RADIO_SHORT_DISABLED_TXEN_MASK ));
1561+ }
1562+
1563+ on_radio_disabled = on_radio_disabled_rx ;
1564+ nrf_radio_int_enable (NRF_RADIO , NRF_RADIO_INT_DISABLED_MASK );
1565+ }
1566+
1567+ esb_state = ESB_STATE_PRX ;
1568+
1569+ nrf_radio_rxaddresses_set (NRF_RADIO , esb_addr .rx_pipes_enabled );
1570+ nrf_radio_frequency_set (NRF_RADIO , (RADIO_BASE_FREQUENCY + esb_addr .rf_channel ));
1571+ atomic_clear_bit (& esb_addr .rf_channel_flags , RF_CHANNEL_UPDATE_FLAG );
1572+ nrf_radio_packetptr_set (NRF_RADIO , rx_payload_buffer );
1573+
1574+ NVIC_ClearPendingIRQ (ESB_RADIO_IRQ_NUMBER );
1575+ irq_enable (ESB_RADIO_IRQ_NUMBER );
1576+
1577+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_ADDRESS );
1578+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_PAYLOAD );
1579+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
1580+
1581+ esb_ppi_for_txrx_set (true, false);
1582+ esb_fem_for_rx_set ();
1583+
1584+ radio_start ();
1585+ }
1586+
15491587static void clear_events_restart_rx (void )
15501588{
15511589 esb_fem_lna_reset ();
@@ -1574,8 +1612,7 @@ static void clear_events_restart_rx(void)
15741612 radio_start ();
15751613}
15761614
1577- static void on_radio_disabled_rx_dpl (bool retransmit_payload ,
1578- struct pipe_info * pipe_info )
1615+ static void prepare_ack_pdu_dpl (bool retransmit_payload , struct pipe_info * pipe_info )
15791616{
15801617 struct esb_radio_pdu * tx_pdu = (struct esb_radio_pdu * )tx_payload_buffer ;
15811618 struct esb_radio_pdu * rx_pdu = (struct esb_radio_pdu * )rx_payload_buffer ;
@@ -1658,7 +1695,7 @@ static void on_radio_disabled_rx(void)
16581695
16591696 switch (esb_cfg .protocol ) {
16601697 case ESB_PROTOCOL_ESB_DPL :
1661- on_radio_disabled_rx_dpl (retransmit_payload , pipe_info );
1698+ prepare_ack_pdu_dpl (retransmit_payload , pipe_info );
16621699 break ;
16631700
16641701 case ESB_PROTOCOL_ESB :
@@ -1685,7 +1722,7 @@ static void on_radio_disabled_rx(void)
16851722 (radio_shorts_common | NRF_RADIO_SHORT_DISABLED_RXEN_MASK ));
16861723 }
16871724
1688- on_radio_disabled = on_radio_disabled_rx_ack ;
1725+ on_radio_disabled = on_radio_disabled_rx_send_ack ;
16891726 } else {
16901727 clear_events_restart_rx ();
16911728 }
@@ -1702,7 +1739,7 @@ static void on_radio_disabled_rx(void)
17021739 }
17031740}
17041741
1705- static void on_radio_disabled_rx_ack (void )
1742+ static void on_radio_disabled_rx_send_ack (void )
17061743{
17071744 esb_fem_for_ack_rx ();
17081745
@@ -1733,7 +1770,7 @@ static void on_radio_end_monitor(void)
17331770 }
17341771}
17351772
1736- static void fast_switchinng_set_channel (uint8_t channel )
1773+ static void fast_switching_set_channel (uint8_t channel )
17371774{
17381775 * (volatile uint32_t * )((uint8_t * )(NRF_RADIO ) + 0x70C ) &= ~(1 << 31 );
17391776 nrf_radio_frequency_set (NRF_RADIO , (RADIO_BASE_FREQUENCY + channel ));
@@ -1791,7 +1828,7 @@ static void radio_irq_handler(void)
17911828 nrf_radio_event_check (NRF_RADIO , NRF_RADIO_EVENT_RXREADY )) {
17921829 nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_RXREADY );
17931830 if (atomic_test_and_clear_bit (& esb_addr .rf_channel_flags , RF_CHANNEL_UPDATE_FLAG )) {
1794- fast_switchinng_set_channel (esb_addr .rf_channel );
1831+ fast_switching_set_channel (esb_addr .rf_channel );
17951832 }
17961833 }
17971834#endif /* defined(CONFIG_ESB_FAST_CHANNEL_SWITCHING) */
@@ -2197,11 +2234,9 @@ int esb_write_payload(const struct esb_payload *payload)
21972234
21982235 irq_unlock (key );
21992236
2200- if (esb_cfg .mode == ESB_MODE_PTX &&
2201- esb_cfg .tx_mode == ESB_TXMODE_AUTO &&
2237+ if (esb_cfg .mode == ESB_MODE_PTX && esb_cfg .tx_mode == ESB_TXMODE_AUTO &&
22022238 (esb_state == ESB_STATE_IDLE ||
2203- (IS_ENABLED (CONFIG_ESB_NEVER_DISABLE_TX ) ?
2204- esb_state == ESB_STATE_PTX_TXIDLE : 0 ))) {
2239+ (IS_ENABLED (CONFIG_ESB_NEVER_DISABLE_TX ) && esb_state == ESB_STATE_PTX_TXIDLE ))) {
22052240 start_tx_transaction ();
22062241 }
22072242
@@ -2267,46 +2302,7 @@ int esb_start_rx(void)
22672302 return - EBUSY ;
22682303 }
22692304
2270- nrf_radio_int_disable (NRF_RADIO , 0xFFFFFFFF );
2271- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
2272-
2273- if (esb_cfg .mode == ESB_MODE_MONITOR ) {
2274- nrf_radio_shorts_set (NRF_RADIO , RADIO_SHORTS_MONITOR );
2275- nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
2276- nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
2277- on_radio_disabled = NULL ;
2278- } else {
2279- if (fast_switching ) {
2280- nrf_radio_shorts_set (NRF_RADIO , radio_shorts_common );
2281- nrf_radio_event_clear (NRF_RADIO , ESB_RADIO_EVENT_END );
2282- nrf_radio_int_enable (NRF_RADIO , ESB_RADIO_INT_END_MASK );
2283- } else {
2284- nrf_radio_shorts_set (NRF_RADIO , (radio_shorts_common |
2285- NRF_RADIO_SHORT_DISABLED_TXEN_MASK ));
2286- }
2287-
2288- on_radio_disabled = on_radio_disabled_rx ;
2289- nrf_radio_int_enable (NRF_RADIO , NRF_RADIO_INT_DISABLED_MASK );
2290- }
2291-
2292- esb_state = ESB_STATE_PRX ;
2293-
2294- nrf_radio_rxaddresses_set (NRF_RADIO , esb_addr .rx_pipes_enabled );
2295- nrf_radio_frequency_set (NRF_RADIO , (RADIO_BASE_FREQUENCY + esb_addr .rf_channel ));
2296- atomic_clear_bit (& esb_addr .rf_channel_flags , RF_CHANNEL_UPDATE_FLAG );
2297- nrf_radio_packetptr_set (NRF_RADIO , rx_payload_buffer );
2298-
2299- NVIC_ClearPendingIRQ (ESB_RADIO_IRQ_NUMBER );
2300- irq_enable (ESB_RADIO_IRQ_NUMBER );
2301-
2302- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_ADDRESS );
2303- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_PAYLOAD );
2304- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
2305-
2306- esb_ppi_for_txrx_set (true, false);
2307- esb_fem_for_rx_set ();
2308-
2309- radio_start ();
2305+ start_rx_listening ();
23102306
23112307 return 0 ;
23122308}
@@ -2521,7 +2517,7 @@ int esb_set_rf_channel(uint32_t channel)
25212517 if (esb_state != ESB_STATE_IDLE ) {
25222518 if (IS_ENABLED (CONFIG_ESB_FAST_CHANNEL_SWITCHING )) {
25232519 if (esb_state == ESB_STATE_PRX ) {
2524- fast_switchinng_set_channel (channel );
2520+ fast_switching_set_channel (channel );
25252521 } else {
25262522 atomic_set_bit (& esb_addr .rf_channel_flags , RF_CHANNEL_UPDATE_FLAG );
25272523 }
0 commit comments