]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/rp2040/spi.py
Update orangepi4 board
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / rp2040 / spi.py
1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
2 #
3 # SPDX-License-Identifier: MIT
4 """SPI Class for RP2040"""
5 from machine import SPI as _SPI
6 from machine import Pin
7 from microcontroller.pin import spiPorts
8
9 # pylint: disable=protected-access, no-self-use
10 class SPI:
11     """Custom SPI Class for RP2040"""
12
13     MSB = _SPI.MSB
14
15     def __init__(self, clock, MOSI=None, MISO=None, *, baudrate=1000000):
16         self._frequency = baudrate
17         for portId, portSck, portMosi, portMiso in spiPorts:
18             if (
19                 (clock == portSck)
20                 and MOSI in (portMosi, None)  # Clock is required!
21                 and MISO in (portMiso, None)  # But can do with just output
22             ):  # Or just input
23                 mosiPin = Pin(portMosi.id) if MOSI else None
24                 misoPin = Pin(portMiso.id) if MISO else None
25                 self._spi = _SPI(
26                     portId,
27                     sck=Pin(portSck.id),
28                     mosi=mosiPin,
29                     miso=misoPin,
30                     baudrate=baudrate,
31                 )
32                 break
33         else:
34             raise ValueError(
35                 "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}".format(
36                     (clock, MOSI, MISO), spiPorts
37                 )
38             )
39
40     # pylint: disable=too-many-arguments,unused-argument
41     def init(
42         self,
43         baudrate=1000000,
44         polarity=0,
45         phase=0,
46         bits=8,
47         firstbit=_SPI.MSB,
48         sck=None,
49         mosi=None,
50         miso=None,
51     ):
52         """Initialize the Port"""
53         self._frequency = baudrate
54         self._spi.init(
55             baudrate=baudrate,
56             polarity=polarity,
57             phase=phase,
58             bits=bits,
59             firstbit=firstbit,
60         )
61
62     # pylint: enable=too-many-arguments
63
64     @property
65     def frequency(self):
66         """Return the current frequency"""
67         return self._frequency
68
69     def write(self, buf, start=0, end=None):
70         """Write data from the buffer to SPI"""
71         self._spi.write(buf)
72
73     def readinto(self, buf, start=0, end=None, write_value=0):
74         """Read data from SPI and into the buffer"""
75         self._spi.readinto(buf)
76
77     # pylint: disable=too-many-arguments
78     def write_readinto(
79         self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None
80     ):
81         """Perform a half-duplex write from buffer_out and then
82         read data into buffer_in
83         """
84         self._spi.write_readinto(
85             buffer_out,
86             buffer_in,
87             out_start=out_start,
88             out_end=out_end,
89             in_start=in_start,
90             in_end=in_end,
91         )
92
93     # pylint: enable=too-many-arguments