diff --git a/tests/extmod/machine_i2s_rate.py b/tests/extmod/machine_i2s_rate.py index d2cd1ae105..bf4b7235a9 100644 --- a/tests/extmod/machine_i2s_rate.py +++ b/tests/extmod/machine_i2s_rate.py @@ -9,28 +9,28 @@ except ImportError: import time, sys # Configure pins based on the board. +# A board must have at least one instance to test, both TX and RX mode. if "pyboard" in sys.platform: - i2s_id = 2 - sck_pin = Pin("Y6") - ws_pin = Pin("Y5") - sd_tx_pin = sd_rx_pin = Pin("Y8") + i2s_instances = ((2, Pin("Y6"), Pin("Y5"), Pin("Y8"), Pin("Y8")),) elif "rp2" in sys.platform: - i2s_id = 1 - sck_pin = Pin(0) - ws_pin = Pin(1) - sd_tx_pin = sd_rx_pin = Pin(2) + i2s_instances = ( + (0, Pin(0), Pin(1), Pin(2), Pin(2)), + (1, Pin(0), Pin(1), Pin(2), Pin(2)), + ) elif "mimxrt" in sys.platform: - i2s_id = 1 - sck_pin = Pin(26) - ws_pin = Pin(27) - sd_tx_pin = Pin(7) - sd_rx_pin = Pin(8) + i2s_instances = ( + (1, Pin("D26"), Pin("D27"), Pin("D7"), Pin("D8")), + (2, Pin("D4"), Pin("D3"), Pin("D2"), None), + ) TEST_BYTES = b"01234567" RATE = 11025 # frames/sec -def test(mode, sd_pin, bits_per_sample, frame_format): +def test(i2s_id, sck_pin, ws_pin, sd_pin, mode, bits_per_sample, frame_format): + if sd_pin is None: + return + i2s = I2S( i2s_id, sck=sck_pin, @@ -48,16 +48,16 @@ def test(mode, sd_pin, bits_per_sample, frame_format): else: channels = 2 bits_per_frame = bits_per_sample * channels - buf_len_250ms = bits_per_frame // 8 * RATE // 4 + buf_len_200ms = bits_per_frame // 8 * RATE // 5 # Create test data and preload I2S buffers. if mode == I2S.TX: mode_str = "TX" - data = TEST_BYTES * (buf_len_250ms // len(TEST_BYTES)) + data = TEST_BYTES * (buf_len_200ms // len(TEST_BYTES)) i2s.write(data) else: mode_str = "RX" - data = bytearray(len(TEST_BYTES) * (buf_len_250ms // len(TEST_BYTES))) + data = bytearray(len(TEST_BYTES) * (buf_len_200ms // len(TEST_BYTES))) i2s.readinto(data) # Time how long it takes to read/write 2 lots of data. @@ -72,15 +72,27 @@ def test(mode, sd_pin, bits_per_sample, frame_format): i2s.deinit() - # Print out test result, time should be in range of 500ms. - print(mode_str, bits_per_sample, channels, abs(dt - 500) <= 4) + # Time should be in range of 400ms. + time_in_range = abs(dt - 400) <= 4 + + # Print out test result if requested, or if time not in range. + if print_results or not time_in_range: + print(mode_str, bits_per_sample, channels, time_in_range) -test(I2S.TX, sd_tx_pin, 16, I2S.MONO) -test(I2S.TX, sd_tx_pin, 16, I2S.STEREO) -test(I2S.TX, sd_tx_pin, 32, I2S.MONO) -test(I2S.TX, sd_tx_pin, 32, I2S.STEREO) -test(I2S.RX, sd_rx_pin, 16, I2S.MONO) -test(I2S.RX, sd_rx_pin, 16, I2S.STEREO) -test(I2S.RX, sd_rx_pin, 32, I2S.MONO) -test(I2S.RX, sd_rx_pin, 32, I2S.STEREO) +print_results = True + +for i2s_id, sck_pin, ws_pin, sd_tx_pin, sd_rx_pin in i2s_instances: + test(i2s_id, sck_pin, ws_pin, sd_tx_pin, I2S.TX, 16, I2S.MONO) + test(i2s_id, sck_pin, ws_pin, sd_tx_pin, I2S.TX, 16, I2S.STEREO) + test(i2s_id, sck_pin, ws_pin, sd_tx_pin, I2S.TX, 32, I2S.MONO) + test(i2s_id, sck_pin, ws_pin, sd_tx_pin, I2S.TX, 32, I2S.STEREO) + test(i2s_id, sck_pin, ws_pin, sd_rx_pin, I2S.RX, 16, I2S.MONO) + test(i2s_id, sck_pin, ws_pin, sd_rx_pin, I2S.RX, 16, I2S.STEREO) + test(i2s_id, sck_pin, ws_pin, sd_rx_pin, I2S.RX, 32, I2S.MONO) + test(i2s_id, sck_pin, ws_pin, sd_rx_pin, I2S.RX, 32, I2S.STEREO) + + # For any remaining tests, don't print the results if they pass. + # This is to have the same output on all boards regardless of + # how many I2S instances they test. + print_results = False