ILI9341 freeze with adafruit_ili9341 lib
danilinao opened this issue ยท 5 comments
When i'm try run this code:
import board
import busio
import displayio
import terminalio
import adafruit_ili9341
from adafruit_display_text import label
dc=board.GP5
rst=board.GP6
blk=board.GP7
cs=board.GP8
spi = busio.SPI(clock=board.GP2, MOSI=board.GP3, MISO=board.GP4)
displayio.release_displays()
display_bus = displayio.FourWire(spi, command = dc, chip_select=cs, reset=rst)
display = adafruit_ili9341.ILI9341(display_bus, width=320, height=240, rotation = 180)
splash = displayio.Group()
display.show(splash)
the emulator freezes and the following messages appear in the js console
Thanks for reporting! Can you please share the link to the relevant project on Wokwi?
Just updating that I managed to reproduce the issue, but still haven't had a chance to dig into it. It's on my radar, though.
reporting here beacuse it seems related:
I tried to run some micropython SPI code on the emulator, and found out that spi.write fails to write any any buffer of length longer than 32 (included). no data ever reaches the rp2040js's spi data callback, not even the first 32 bytes.
e.g given the firmware:
from machine import SPI
spi = SPI(0)
spi.write(b"0123456789abcdef0123456789abcde")
spi.write(b"0123456789abcdef0123456789abcdef")
the rp2040js spi callback will only be called for every byte in the first write.
investigating the micropython repo, I figured ports/rp2/machine_spi.c#machine_spi_transfer is the function responsible for actually calling the pico sdk spi_write_blocking func. Look at its code: if the input buffer length is >= 32, then data is sent to SPI via DMA (a valid optimization) which in rp2040js is not yet implement
good news are DMA already exists in rp2040js, it just doesn't seem wired into the SPI peripherial. Im looking into the fix ๐