X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka.git/blobdiff_plain/4782c180b240d80a772f63ca81e0876f39a69c26..7c00779e475ef10923dc53fddb20ad23eae484af:/src/adafruit_blinka/microcontroller/rp2040/spi.py diff --git a/src/adafruit_blinka/microcontroller/rp2040/spi.py b/src/adafruit_blinka/microcontroller/rp2040/spi.py new file mode 100644 index 0000000..e876a38 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/rp2040/spi.py @@ -0,0 +1,88 @@ +"""SPI Class for RP2040""" +from machine import SPI as _SPI +from machine import Pin +from microcontroller.pin import spiPorts + +# pylint: disable=protected-access, no-self-use +class SPI: + """Custom SPI Class for RP2040""" + + def __init__(self, clock, MOSI=None, MISO=None, *, baudrate=1000000): + self._frequency = baudrate + for portId, portSck, portMosi, portMiso in spiPorts: + if ( + (clock == portSck) + and MOSI in (portMosi, None) # Clock is required! + and MISO in (portMiso, None) # But can do with just output + ): # Or just input + mosiPin = Pin(portMosi.id) if MOSI else None + misoPin = Pin(portMiso.id) if MISO else None + self._spi = _SPI( + portId, + sck=Pin(portSck.id), + mosi=mosiPin, + miso=misoPin, + baudrate=baudrate, + ) + break + else: + raise ValueError( + "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}".format( + (clock, MOSI, MISO), spiPorts + ) + ) + + # pylint: disable=too-many-arguments,unused-argument + def init( + self, + baudrate=1000000, + polarity=0, + phase=0, + bits=8, + firstbit=_SPI.MSB, + sck=None, + mosi=None, + miso=None, + ): + """Initialize the Port""" + self._frequency = baudrate + self._spi.init( + baudrate=baudrate, + polarity=polarity, + phase=phase, + bits=bits, + firstbit=firstbit, + ) + + # pylint: enable=too-many-arguments + + @property + def frequency(self): + """Return the current frequency""" + return self._frequency + + def write(self, buf, start=0, end=None): + """Write data from the buffer to SPI""" + self._spi.write(buf) + + def readinto(self, buf, start=0, end=None, write_value=0): + """Read data from SPI and into the buffer""" + self._spi.readinto(buf) + + # pylint: disable=too-many-arguments + def write_readinto( + self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None + ): + """Perform a half-duplex write from buffer_out and then + read data into buffer_in + """ + self._spi.write_readinto( + buffer_out, + buffer_in, + out_start=out_start, + out_end=out_end, + in_start=in_start, + in_end=in_end, + ) + + # pylint: enable=too-many-arguments