From 921cee92a5c49b37b0b018cdba09226e063bebff Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 16 Aug 2024 23:07:12 +1000 Subject: [PATCH] tests/extmod: Add test for machine.UART.IRQ_TXIDLE. The test checks whether the message created by the IRQ handler appears about at the end of the data sent by UART. Supported MCUs resp. boards: - RP2040 - MIMXRT1xxx - Adafruit ItsyBitsy M0 - Adafruit ItsyBitsy M4 - NRF52 (Arduino Nano Connect 33 BLE) Signed-off-by: Damien George --- tests/extmod/machine_uart_irq_txidle.py | 76 +++++++++++++++++++++ tests/extmod/machine_uart_irq_txidle.py.exp | 12 ++++ 2 files changed, 88 insertions(+) create mode 100644 tests/extmod/machine_uart_irq_txidle.py create mode 100644 tests/extmod/machine_uart_irq_txidle.py.exp diff --git a/tests/extmod/machine_uart_irq_txidle.py b/tests/extmod/machine_uart_irq_txidle.py new file mode 100644 index 0000000000000..3e69bb43141aa --- /dev/null +++ b/tests/extmod/machine_uart_irq_txidle.py @@ -0,0 +1,76 @@ +# Test machine.UART.IRQ_TXIDLE firing after a transmission. +# Does not require any external connections. + +try: + from machine import UART + + UART.IRQ_TXIDLE +except (ImportError, AttributeError): + print("SKIP") + raise SystemExit + +import time, sys + +# Configure pins based on the target. +if "rp2" in sys.platform: + uart_id = 0 + tx_pin = "GPIO0" + rx_pin = "GPIO1" + min_window = 1 +elif "samd" in sys.platform and "ItsyBitsy M0" in sys.implementation._machine: + uart_id = 0 + tx_pin = "D1" + rx_pin = "D0" + # For SAMD delay_ms has to be used for the trailing window, and the + # mininmal time is 11 ms to allow for scheduling. + min_window = 11 +elif "samd" in sys.platform and "ItsyBitsy M4" in sys.implementation._machine: + uart_id = 3 + tx_pin = "D1" + rx_pin = "D0" + min_window = 11 +elif "mimxrt" in sys.platform: + uart_id = 1 + tx_pin = None + min_window = 0 +elif "nrf" in sys.platform: + uart_id = 0 + tx_pin = None + min_window = 0 +else: + print("Please add support for this test on this platform.") + raise SystemExit + + +def irq(u): + print("IRQ_TXIDLE:", u.irq().flags() == u.IRQ_TXIDLE) + + +text = "Hello World" * 20 + +# Test that the IRQ is called after the write has completed. +for bits_per_s in (2400, 9600, 115200): + if tx_pin is None: + uart = UART(uart_id, bits_per_s) + else: + uart = UART(uart_id, bits_per_s, tx=tx_pin, rx=rx_pin) + + uart.irq(irq, uart.IRQ_TXIDLE) + + # The IRQ_TXIDLE shall trigger after the message has been sent. Thus + # the test marks a time window close to the expected of the sending + # and the time at which the IRQ should have been fired. + # It is just a rough estimation of 10 characters before and + # 20 characters after the data's end, unless there is a need to + # wait a minimal time, like for SAMD devices. + + bits_per_char = 10 # 1(startbit) + 8(bits) + 1(stopbit) + 0(parity) + start_time_us = (len(text) - 10) * bits_per_char * 1_000_000 // bits_per_s + window_ms = max(min_window, 20 * bits_per_char * 1_000 // bits_per_s + 1) + + print("write", bits_per_s) + uart.write(text) + time.sleep_us(start_time_us) + print("ready") + time.sleep_ms(window_ms) + print("done") diff --git a/tests/extmod/machine_uart_irq_txidle.py.exp b/tests/extmod/machine_uart_irq_txidle.py.exp new file mode 100644 index 0000000000000..2da51d10faada --- /dev/null +++ b/tests/extmod/machine_uart_irq_txidle.py.exp @@ -0,0 +1,12 @@ +write 2400 +ready +IRQ_TXIDLE: True +done +write 9600 +ready +IRQ_TXIDLE: True +done +write 115200 +ready +IRQ_TXIDLE: True +done