94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
"""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"""
|
|
|
|
MSB = _SPI.MSB
|
|
|
|
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
|