Skip to content

PIO write delayed by i2c display update #10368

Open
@dmcomm

Description

@dmcomm

CircuitPython version and board name

Adafruit CircuitPython 9.2.7 on 2025-04-01; Raspberry Pi Pico W with rp2040

Code/REPL

import array
import time

import board
import digitalio
import displayio
import rp2pio
import busio
import i2cdisplaybus
import terminalio
import adafruit_displayio_ssd1306
import adafruit_pioasm
from adafruit_display_text.bitmap_label import Label

program = adafruit_pioasm.assemble("""
    pull
    mov osr ~ osr
    set pins 1 [8]
    set x 7
loop:
    out pins 1 [8]
    jmp x-- loop
    set pins 0 [7]
""")

displayio.release_displays()
i2c = busio.I2C(board.GP5, board.GP4)
display_bus = i2cdisplaybus.I2CDisplayBus(i2c, device_address=0x3c)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)

probe = digitalio.DigitalInOut(board.GP0)
probe.switch_to_output(value=True)

output = rp2pio.StateMachine(
    program,
    frequency=25_000,
    first_out_pin=board.GP16,
    first_set_pin=board.GP16,
)

groups = []
for text in ["Hello", "World"]:
    group = displayio.Group()
    label = Label(terminalio.FONT, text=text, color=0xFFFFFF, x=10, y=10)
    group.append(label)
    groups.append(group)

def send(data):
    start_time = time.monotonic()
    probe.value = True
    output.write(data)
    probe.value = False
    print((time.monotonic() - start_time) * 1000)

bytes_to_send = bytes([0] * 15)
i = 0
while True:
    display.root_group = groups[i]
    send(bytes_to_send)
    time.sleep(5)
    i = 1 - i

Behavior

Expecting write to take 60ms with these values, which it does if we remove the display update, but it intermittently reports over 100ms. Scope trace shows the transmission is finished before the delay. Setting frequency to higher numbers gives more extreme results but is harder to see the details.

As above:
Image

Without display update:
Image

With display update, frequency=200_000:
Image

Reverting c5c7d11 gives a similar amount of delay, but in the middle instead:
Image

Description

No response

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions