@@ -1072,7 +1072,7 @@ static void initialize_fifos(void)
10721072 }
10731073}
10741074
1075- static void tx_fifo_remove_last (void )
1075+ static void tx_fifo_remove_first (void )
10761076{
10771077 if (tx_fifo .count == 0 ) {
10781078 return ;
@@ -1332,7 +1332,7 @@ static void on_timer_compare1_tx_noack(void)
13321332 esb_ppi_for_wait_for_rx_clear ();
13331333
13341334 interrupt_flags |= INT_TX_SUCCESS_MSK ;
1335- tx_fifo_remove_last ();
1335+ tx_fifo_remove_first ();
13361336
13371337 if (tx_fifo .count == 0 ) {
13381338 esb_state = ESB_STATE_PTX_TXIDLE ;
@@ -1349,7 +1349,7 @@ static void on_radio_disabled_tx_noack(void)
13491349 esb_ppi_for_txrx_clear (false, false);
13501350
13511351 interrupt_flags |= INT_TX_SUCCESS_MSK ;
1352- tx_fifo_remove_last ();
1352+ tx_fifo_remove_first ();
13531353
13541354 if (tx_fifo .count == 0 ) {
13551355 esb_state = ESB_STATE_IDLE ;
@@ -1440,7 +1440,7 @@ static void on_radio_disabled_tx_wait_for_ack(void)
14401440 interrupt_flags |= INT_TX_SUCCESS_MSK ;
14411441 last_tx_attempts = esb_cfg .retransmit_count - retransmits_remaining + 1 ;
14421442
1443- tx_fifo_remove_last ();
1443+ tx_fifo_remove_first ();
14441444
14451445 if ((esb_cfg .protocol != ESB_PROTOCOL_ESB ) && (rx_pdu -> type .dpl_pdu .length > 0 )) {
14461446 if (rx_fifo_push_rfbuf (
@@ -2100,15 +2100,31 @@ int esb_init(const struct esb_config *config)
21002100
21012101int esb_suspend (void )
21022102{
2103- if (esb_state != ESB_STATE_IDLE ) {
2104- return - EBUSY ;
2103+ if (esb_state == ESB_STATE_IDLE ) {
2104+ return - EALREADY ;
2105+ }
2106+ on_radio_disabled = NULL ;
2107+
2108+ /* Stop radio */
2109+ nrf_radio_shorts_disable (NRF_RADIO , 0xFFFFFFFF );
2110+ nrf_radio_int_disable (NRF_RADIO , 0xFFFFFFFF );
2111+
2112+ nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
2113+ nrf_radio_task_trigger (NRF_RADIO , NRF_RADIO_TASK_DISABLE );
2114+
2115+ while (!nrf_radio_event_check (NRF_RADIO , NRF_RADIO_EVENT_DISABLED )) {
2116+ /* wait for register to settle */
21052117 }
21062118
2107- /* Clear PPI */
2119+ /* Stop timer */
2120+ nrf_timer_shorts_disable (esb_timer .p_reg , 0xFFFFFFFF );
2121+ nrf_timer_int_disable (esb_timer .p_reg , 0xFFFFFFFF );
2122+
21082123 esb_ppi_disable_all ();
2124+ esb_fem_reset ();
21092125
2110- esb_state = ESB_STATE_IDLE ;
21112126 errata_216_off ();
2127+ esb_state = ESB_STATE_IDLE ;
21122128
21132129 return 0 ;
21142130}
@@ -2313,34 +2329,20 @@ int esb_stop_rx(void)
23132329 return - EINVAL ;
23142330 }
23152331
2316- on_radio_disabled = NULL ;
2317-
2318- esb_ppi_for_txrx_clear (true, false);
2319- esb_fem_reset ();
2320-
2321- nrf_radio_shorts_disable (NRF_RADIO , 0xFFFFFFFF );
2322- nrf_radio_int_disable (NRF_RADIO , 0xFFFFFFFF );
2323-
2324- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
2325- nrf_radio_task_trigger (NRF_RADIO , NRF_RADIO_TASK_DISABLE );
2326-
2327- while (!nrf_radio_event_check (NRF_RADIO , NRF_RADIO_EVENT_DISABLED )) {
2328- /* wait for register to settle */
2329- }
2330-
2331- nrf_radio_event_clear (NRF_RADIO , NRF_RADIO_EVENT_DISABLED );
2332-
2333- esb_state = ESB_STATE_IDLE ;
2334- errata_216_off ();
2335-
2336- return 0 ;
2332+ return esb_suspend ();
23372333}
23382334
23392335int esb_flush_tx (void )
23402336{
23412337 if (!esb_initialized ) {
23422338 return - EACCES ;
23432339 }
2340+ if (esb_state != ESB_STATE_IDLE ) {
2341+ return - EBUSY ;
2342+ }
2343+ if (tx_fifo .count == 0 ) {
2344+ return 0 ;
2345+ }
23442346
23452347 unsigned int key = irq_lock ();
23462348
@@ -2367,14 +2369,17 @@ int esb_pop_tx(void)
23672369 if (!esb_initialized ) {
23682370 return - EACCES ;
23692371 }
2372+ if (esb_state != ESB_STATE_IDLE ) {
2373+ return - EBUSY ;
2374+ }
23702375 if (tx_fifo .count == 0 ) {
23712376 return - ENODATA ;
23722377 }
23732378
23742379 unsigned int key = irq_lock ();
23752380
2376- if (++ tx_fifo .back >= CONFIG_ESB_TX_FIFO_SIZE ) {
2377- tx_fifo .back = 0 ;
2381+ if (++ tx_fifo .front >= CONFIG_ESB_TX_FIFO_SIZE ) {
2382+ tx_fifo .front = 0 ;
23782383 }
23792384 tx_fifo .count -- ;
23802385
0 commit comments