diff --git a/components/esp32/include/rom/uart.h b/components/esp32/include/rom/uart.h index 0a3e1aeb6..872244573 100644 --- a/components/esp32/include/rom/uart.h +++ b/components/esp32/include/rom/uart.h @@ -267,9 +267,11 @@ void uart_tx_flush(uint8_t uart_no); * here for compatibility. */ static inline void IRAM_ATTR uart_tx_wait_idle(uint8_t uart_no) { - while(REG_GET_FIELD(UART_STATUS_REG(uart_no), UART_ST_UTX_OUT)) { - ; - } + uint32_t status; + do { + status = READ_PERI_REG(UART_STATUS_REG(uart_no)); + /* either tx count or state is non-zero */ + } while ((status & (UART_ST_UTX_OUT_M | UART_TXFIFO_CNT_M)) != 0); } /** diff --git a/components/esp32/sleep_modes.c b/components/esp32/sleep_modes.c index da4a5f11a..f3bd071f3 100644 --- a/components/esp32/sleep_modes.c +++ b/components/esp32/sleep_modes.c @@ -159,7 +159,9 @@ static void IRAM_ATTR suspend_uarts() { for (int i = 0; i < 3; ++i) { REG_SET_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XOFF); - uart_tx_wait_idle(i); + while (REG_GET_FIELD(UART_STATUS_REG(i), UART_ST_UTX_OUT) != 0) { + ; + } } }