110
110
#define DMA_BUFFER_SIZE MBED_CONF_NORDIC_UART_DMA_SIZE
111
111
#define NUMBER_OF_BANKS 2
112
112
113
- /**
114
- * Default timer delay for callbacks.
115
- */
116
- #define CALLBACK_DELAY_US 100
117
-
118
113
/**
119
114
* Use RTC2 for idle timeouts.
120
115
* Each channel is dedicated to one particular task.
130
125
/**
131
126
* SWI IRQ numbers
132
127
*/
133
- #define UARTE0_SWI_TX_0_IRQ SWI2_EGU2_IRQn
134
- #define UARTE0_SWI_RX_0_IRQ SWI3_EGU3_IRQn
135
- #define UARTE1_SWI_TX_0_IRQ SWI4_EGU4_IRQn
136
- #define UARTE1_SWI_RX_0_IRQ SWI5_EGU5_IRQn
128
+ #define UARTE0_SWI_TX_IRQ SWI2_EGU2_IRQn
129
+ #define UARTE0_SWI_RX_IRQ SWI3_EGU3_IRQn
130
+ #define UARTE1_SWI_TX_IRQ SWI4_EGU4_IRQn
131
+ #define UARTE1_SWI_RX_IRQ SWI5_EGU5_IRQn
137
132
138
133
/***
139
134
* _______ _ __
@@ -433,8 +428,8 @@ static void nordic_nrf5_uart_swi_rx_1(void)
433
428
*/
434
429
static void nordic_nrf5_uart_event_handler_endtx (int instance )
435
430
{
436
- /* Disable TXDRDY event again. */
437
- nordic_nrf5_uart_register [instance ]-> INTEN &= ~NRF_UARTE_INT_TXDRDY_MASK ;
431
+ /* Disable ENDTX event again. */
432
+ nordic_nrf5_uart_register [instance ]-> INTEN &= ~NRF_UARTE_INT_ENDTX_MASK ;
438
433
439
434
/* Release mutex. As the owner this call is safe. */
440
435
nordic_nrf5_uart_state [instance ].tx_in_progress = 0 ;
@@ -519,12 +514,12 @@ static void nordic_swi_tx_trigger(int instance)
519
514
{
520
515
if (instance == 0 ) {
521
516
522
- NVIC_SetPendingIRQ (UARTE0_SWI_TX_0_IRQ );
517
+ NVIC_SetPendingIRQ (UARTE0_SWI_TX_IRQ );
523
518
}
524
519
#if UART1_ENABLED
525
520
else if (instance == 1 ) {
526
521
527
- NVIC_SetPendingIRQ (UARTE1_SWI_TX_0_IRQ );
522
+ NVIC_SetPendingIRQ (UARTE1_SWI_TX_IRQ );
528
523
}
529
524
#endif
530
525
}
@@ -538,11 +533,11 @@ static void nordic_swi_rx_trigger(int instance)
538
533
{
539
534
if (instance == 0 ) {
540
535
541
- NVIC_SetPendingIRQ (UARTE0_SWI_RX_0_IRQ );
536
+ NVIC_SetPendingIRQ (UARTE0_SWI_RX_IRQ );
542
537
}
543
538
else if (instance == 1 ) {
544
539
545
- NVIC_SetPendingIRQ (UARTE1_SWI_RX_0_IRQ );
540
+ NVIC_SetPendingIRQ (UARTE1_SWI_RX_IRQ );
546
541
}
547
542
}
548
543
@@ -716,33 +711,14 @@ static void nordic_nrf5_uart_event_handler(int instance)
716
711
nordic_nrf5_uart_event_handler_rxdrdy (instance );
717
712
}
718
713
719
- /* Tx single character has been sent. */
720
- if (nrf_uarte_event_check (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_TXDRDY )) {
721
-
722
- nrf_uarte_event_clear (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_TXDRDY );
723
-
724
- /* In non-async transfers this will generate an interrupt if callback and mask is set. */
725
- if (!nordic_nrf5_uart_state [instance ].tx_asynch ) {
726
-
727
- /* Use SWI to de-prioritize callback. */
728
- nordic_swi_tx_trigger (instance );
729
- }
730
- }
731
-
732
- #if DEVICE_SERIAL_ASYNCH
733
714
/* Tx DMA buffer has been sent. */
734
715
if (nrf_uarte_event_check (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_ENDTX ))
735
716
{
736
717
nrf_uarte_event_clear (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_ENDTX );
737
718
738
- /* Call async event handler in async mode. */
739
- if (nordic_nrf5_uart_state [instance ].tx_asynch ) {
740
-
741
- /* Use SWI to de-prioritize callback. */
742
- nordic_swi_tx_trigger (instance );
743
- }
719
+ /* Use SWI to de-prioritize callback. */
720
+ nordic_swi_tx_trigger (instance );
744
721
}
745
- #endif
746
722
}
747
723
748
724
/**
@@ -1029,24 +1005,24 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
1029
1005
NRF_RTC_INT_COMPARE1_MASK );
1030
1006
1031
1007
/* Enable RTC2 IRQ. Priority is set to lowest so that the UARTE ISR can interrupt it. */
1032
- nrf_drv_common_irq_enable (RTC2_IRQn , APP_IRQ_PRIORITY_LOWEST );
1008
+ nrf_drv_common_irq_enable (RTC2_IRQn , APP_IRQ_PRIORITY_HIGHEST );
1033
1009
1034
1010
/* Start RTC2. According to the datasheet the added power consumption is neglible so
1035
1011
* the RTC2 will run forever.
1036
1012
*/
1037
1013
nrf_rtc_task_trigger (NRF_RTC2 , NRF_RTC_TASK_START );
1038
1014
1039
1015
/* Enable interrupts for SWI. */
1040
- NVIC_SetVector (UARTE0_SWI_TX_0_IRQ , (uint32_t ) nordic_nrf5_uart_swi_tx_0 );
1041
- NVIC_SetVector (UARTE0_SWI_RX_0_IRQ , (uint32_t ) nordic_nrf5_uart_swi_rx_0 );
1042
- nrf_drv_common_irq_enable (UARTE0_SWI_TX_0_IRQ , APP_IRQ_PRIORITY_LOWEST );
1043
- nrf_drv_common_irq_enable (UARTE0_SWI_RX_0_IRQ , APP_IRQ_PRIORITY_LOWEST );
1016
+ NVIC_SetVector (UARTE0_SWI_TX_IRQ , (uint32_t ) nordic_nrf5_uart_swi_tx_0 );
1017
+ NVIC_SetVector (UARTE0_SWI_RX_IRQ , (uint32_t ) nordic_nrf5_uart_swi_rx_0 );
1018
+ nrf_drv_common_irq_enable (UARTE0_SWI_TX_IRQ , APP_IRQ_PRIORITY_LOWEST );
1019
+ nrf_drv_common_irq_enable (UARTE0_SWI_RX_IRQ , APP_IRQ_PRIORITY_LOWEST );
1044
1020
1045
1021
#if UART1_ENABLED
1046
- NVIC_SetVector (UARTE1_SWI_TX_0_IRQ , (uint32_t ) nordic_nrf5_uart_swi_tx_1 );
1047
- NVIC_SetVector (UARTE1_SWI_RX_0_IRQ , (uint32_t ) nordic_nrf5_uart_swi_rx_1 );
1048
- nrf_drv_common_irq_enable (UARTE1_SWI_TX_0_IRQ , APP_IRQ_PRIORITY_LOWEST );
1049
- nrf_drv_common_irq_enable (UARTE1_SWI_RX_0_IRQ , APP_IRQ_PRIORITY_LOWEST );
1022
+ NVIC_SetVector (UARTE1_SWI_TX_IRQ , (uint32_t ) nordic_nrf5_uart_swi_tx_1 );
1023
+ NVIC_SetVector (UARTE1_SWI_RX_IRQ , (uint32_t ) nordic_nrf5_uart_swi_rx_1 );
1024
+ nrf_drv_common_irq_enable (UARTE1_SWI_TX_IRQ , APP_IRQ_PRIORITY_LOWEST );
1025
+ nrf_drv_common_irq_enable (UARTE1_SWI_RX_IRQ , APP_IRQ_PRIORITY_LOWEST );
1050
1026
#endif
1051
1027
1052
1028
/* Initialize FIFO buffer for UARTE0. */
@@ -1411,21 +1387,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
1411
1387
1412
1388
uart_object -> mask &= ~type ;
1413
1389
}
1414
-
1415
- /* Enable TXDRDY event. */
1416
- if ((type == NORDIC_TX_IRQ ) && enable ) {
1417
-
1418
- /* Clear Tx ready event and enable Tx ready interrupts. */
1419
- nrf_uarte_event_clear (nordic_nrf5_uart_register [uart_object -> instance ], NRF_UARTE_EVENT_TXDRDY );
1420
- nordic_nrf5_uart_register [uart_object -> instance ]-> INTEN |= NRF_UARTE_INT_TXDRDY_MASK ;
1421
-
1422
- /* Disable TXDRDY event. */
1423
- } else if ((type == NORDIC_TX_IRQ ) && !enable ) {
1424
-
1425
- /* Disable Tx ready interrupts and clear Tx ready event. */
1426
- nordic_nrf5_uart_register [uart_object -> instance ]-> INTEN &= ~NRF_UARTE_INT_TXDRDY_MASK ;
1427
- nrf_uarte_event_clear (nordic_nrf5_uart_register [uart_object -> instance ], NRF_UARTE_EVENT_TXDRDY );
1428
- }
1429
1390
}
1430
1391
1431
1392
/** Get character. This is a blocking call, waiting for a character
@@ -1503,26 +1464,15 @@ void serial_putc(serial_t *obj, int character)
1503
1464
/* Take ownership and configure UART if necessary. */
1504
1465
nordic_nrf5_serial_configure (obj );
1505
1466
1506
- /**
1507
- * The UARTE module can generate two different Tx events: TXDRDY when each character has
1508
- * been transmitted and ENDTX when the entire buffer has been sent.
1509
- *
1510
- * For the blocking serial_putc, TXDRDY interrupts are enabled and only used for the
1511
- * single character TX IRQ callback handler.
1512
- */
1513
-
1514
1467
/* Arm Tx DMA buffer. */
1515
1468
nordic_nrf5_uart_state [instance ].tx_data = character ;
1516
1469
nrf_uarte_tx_buffer_set (nordic_nrf5_uart_register [instance ],
1517
1470
& nordic_nrf5_uart_state [instance ].tx_data ,
1518
1471
1 );
1519
1472
1520
- /* Clear TXDRDY event and enable TXDRDY interrupts. */
1521
- nrf_uarte_event_clear (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_TXDRDY );
1522
- nordic_nrf5_uart_register [instance ]-> INTEN |= NRF_UARTE_INT_TXDRDY_MASK ;
1523
-
1524
- /* Clear ENDTX event. */
1473
+ /* Clear ENDTX event and enable interrupts. */
1525
1474
nrf_uarte_event_clear (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_ENDTX );
1475
+ nordic_nrf5_uart_register [instance ]-> INTEN |= NRF_UARTE_INT_ENDTX_MASK ;
1526
1476
1527
1477
/* Trigger DMA transfer. */
1528
1478
nrf_uarte_task_trigger (nordic_nrf5_uart_register [instance ],
@@ -1680,16 +1630,6 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
1680
1630
nordic_nrf5_uart_state [instance ].tx_asynch = true;
1681
1631
nordic_nrf5_serial_configure (obj );
1682
1632
1683
- /**
1684
- * The UARTE module can generate two different Tx events: TXDRDY when each
1685
- * character has been transmitted and ENDTX when the entire buffer has been sent.
1686
- *
1687
- * For the async serial_tx_async, TXDRDY interrupts are disabled completely. ENDTX
1688
- * interrupts are enabled and used to signal the completion of the async transfer.
1689
- *
1690
- * The ENDTX interrupt is diabled immediately after it is fired in the ISR.
1691
- */
1692
-
1693
1633
/* Clear Tx event and enable Tx interrupts. */
1694
1634
nrf_uarte_event_clear (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_ENDTX );
1695
1635
nordic_nrf5_uart_register [instance ]-> INTEN |= NRF_UARTE_INT_ENDTX_MASK ;
0 commit comments