micropython-micro-gui icon indicating copy to clipboard operation
micropython-micro-gui copied to clipboard

Sharp Display SPI RP2040

Open wingfieldworks opened this issue 2 years ago • 4 comments

It seems that there is an issue initializing the SPI in the sharp driver on the RP2040. I've tried switching to SoftSPI for the SPI.LSB with no success.

I'm not too experienced with MicroPython so I may looking in the wrong spot.

Possibly adding a setup example for the Sharp displays could help.

wingfieldworks avatar May 01 '23 22:05 wingfieldworks

SPI on RP2040 works: I have used it extensively with various displays. I recommend specifying the pins to use as the defaults are undocumented. Please could you post your hardware_setup.py.

peterhinch avatar May 02 '23 08:05 peterhinch

from machine import Pin, SPI, freq
import gc

from drivers.sharp.sharp import SHARP as SSD
freq(250_000_000)  # RP2 overclock
# Create and export an SSD instance
pcs = Pin(2, Pin.OUT, value=1)
spi = SPI(0, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
gc.collect()  # Precaution before instantiating framebuf
ssd = SSD(spi, pcs)

from gui.core.ugui import Display
# Create and export a Display instance
# Define control buttons
nxt = Pin(19, Pin.IN, Pin.PULL_UP)  # Move to next control
sel = Pin(16, Pin.IN, Pin.PULL_UP)  # Operate current control
prev = Pin(18, Pin.IN, Pin.PULL_UP)  # Move to previous control
increase = Pin(20, Pin.IN, Pin.PULL_UP)  # Increase control's value
decrease = Pin(17, Pin.IN, Pin.PULL_UP)  # Decrease control's value
display = Display(ssd, nxt, sel, prev, increase, decrease, 4)  # Encoder

I receive an error

NotImplementedError: LSB

from machine import Pin, SoftSPI, freq
import gc

from drivers.sharp.sharp import SHARP as SSD
freq(250_000_000)  # RP2 overclock
# Create and export an SSD instance
pcs = Pin(2, Pin.OUT, value=1)
spi = SoftSPI(sck=Pin(6), mosi=Pin(7), miso=Pin(4), baudrate=2_000_000, firstbit=machine.SoftSPI.LSB)
gc.collect()  # Precaution before instantiating framebuf
ssd = SSD(spi, pcs)

from gui.core.ugui import Display
# Create and export a Display instance
# Define control buttons
nxt = Pin(19, Pin.IN, Pin.PULL_UP)  # Move to next control
sel = Pin(16, Pin.IN, Pin.PULL_UP)  # Operate current control
prev = Pin(18, Pin.IN, Pin.PULL_UP)  # Move to previous control
increase = Pin(20, Pin.IN, Pin.PULL_UP)  # Increase control's value
decrease = Pin(17, Pin.IN, Pin.PULL_UP)  # Decrease control's value
display = Display(ssd, nxt, sel, prev, increase, decrease, 4)  # Encoder

When replacing with SoftSpi to try and get around the LSB I get

ValueError:firstbit must be MSB

wingfieldworks avatar May 02 '23 19:05 wingfieldworks

I can replicate this. You have indeed found a bug in the RP2 implementation of SPI. The Sharp displays require LSB-first implementation of SPI and, as you have discovered, this is unsupported. (My testing was with STM, before RP2 was available).

I will raise an issue.

peterhinch avatar May 03 '23 09:05 peterhinch

I'm afraid we're in the hands of the maintainers now.

peterhinch avatar May 03 '23 09:05 peterhinch