@@ -348,31 +348,38 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
348348{
349349 UART_T * uart_base = (UART_T * ) NU_MODBASE (obj -> serial .uart );
350350
351- // First, disable flow control completely.
352- uart_base -> INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk );
353-
354- if ((type == FlowControlRTS || type == FlowControlRTSCTS ) && rxflow != NC ) {
351+ if (rxflow != NC ) {
355352 // Check if RTS pin matches.
356353 uint32_t uart_rts = pinmap_peripheral (rxflow , PinMap_UART_RTS );
357354 MBED_ASSERT (uart_rts == obj -> serial .uart );
358355 // Enable the pin for RTS function
359356 pinmap_pinout (rxflow , PinMap_UART_RTS );
360-
357+
361358 // NOTE: Added in M480. Before configuring RTSACTLV, disable TX/RX.
362359 uart_base -> FUNCSEL |= UART_FUNCSEL_TXRXDIS_Msk ;
363360 while (uart_base -> FIFOSTS & UART_FIFOSTS_TXRXACT_Msk );
364361 // nRTS pin output is low level active
365362 uart_base -> MODEM |= UART_MODEM_RTSACTLV_Msk ;
366363 // NOTE: Added in M480. After configuring RTSACTLV, re-enable TX/RX.
367364 uart_base -> FUNCSEL &= ~UART_FUNCSEL_TXRXDIS_Msk ;
368-
365+ // Configure RTS trigger level to 8 bytes
369366 uart_base -> FIFO = (uart_base -> FIFO & ~UART_FIFO_RTSTRGLV_Msk ) | UART_FIFO_RTSTRGLV_8BYTES ;
370367
371- // Enable RTS
372- uart_base -> INTEN |= UART_INTEN_ATORTSEN_Msk ;
368+ if (type == FlowControlRTS || type == FlowControlRTSCTS ) {
369+ // Enable RTS
370+ uart_base -> INTEN |= UART_INTEN_ATORTSEN_Msk ;
371+ } else {
372+ // Disable RTS
373+ uart_base -> INTEN &= ~UART_INTEN_ATORTSEN_Msk ;
374+ /* Drive nRTS pin output to low-active. Allow the peer to be able to send data
375+ * even though its CTS is still enabled. */
376+ uart_base -> MODEM &= ~UART_MODEM_RTS_Msk ;
377+ }
373378 }
374379
375- if ((type == FlowControlCTS || type == FlowControlRTSCTS ) && txflow != NC ) {
380+ /* If CTS is disabled, we don't need to configure CTS. But to be consistent with
381+ * RTS code above, we still configure CTS. */
382+ if (txflow != NC ) {
376383 // Check if CTS pin matches.
377384 uint32_t uart_cts = pinmap_peripheral (txflow , PinMap_UART_CTS );
378385 MBED_ASSERT (uart_cts == obj -> serial .uart );
@@ -387,8 +394,13 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
387394 // NOTE: Added in M480. After configuring CTSACTLV, re-enable TX/RX.
388395 uart_base -> FUNCSEL &= ~UART_FUNCSEL_TXRXDIS_Msk ;
389396
390- // Enable CTS
391- uart_base -> INTEN |= UART_INTEN_ATOCTSEN_Msk ;
397+ if (type == FlowControlCTS || type == FlowControlRTSCTS ) {
398+ // Enable CTS
399+ uart_base -> INTEN |= UART_INTEN_ATOCTSEN_Msk ;
400+ } else {
401+ // Disable CTS
402+ uart_base -> INTEN &= ~UART_INTEN_ATOCTSEN_Msk ;
403+ }
392404 }
393405}
394406
0 commit comments