]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
Merge pull request #527 from coloradocarlos/main
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / rp2040_u2if / spi.py
1 """SPI Classes for RP2040s with u2if firmware"""
2 from .rp2040_u2if import rp2040_u2if
3
4 # pylint: disable=protected-access, no-self-use
5 class SPI:
6     """SPI Base Class for RP2040 u2if"""
7
8     MSB = 0
9
10     def __init__(self, index, *, baudrate=100000):
11         self._index = index
12         self._frequency = baudrate
13         rp2040_u2if.spi_set_port(self._index)
14         rp2040_u2if.spi_configure(self._frequency)
15
16     # pylint: disable=too-many-arguments,unused-argument
17     def init(
18         self,
19         baudrate=1000000,
20         polarity=0,
21         phase=0,
22         bits=8,
23         firstbit=MSB,
24         sck=None,
25         mosi=None,
26         miso=None,
27     ):
28         """Initialize the Port"""
29         self._frequency = baudrate
30         rp2040_u2if.spi_set_port(self._index)
31         rp2040_u2if.spi_configure(self._frequency)
32
33     # pylint: enable=too-many-arguments
34
35     @property
36     def frequency(self):
37         """Return the current frequency"""
38         return self._frequency
39
40     def write(self, buf, start=0, end=None):
41         """Write data from the buffer to SPI"""
42         rp2040_u2if.spi_write(buf, start=start, end=end)
43
44     def readinto(self, buf, start=0, end=None, write_value=0):
45         """Read data from SPI and into the buffer"""
46         rp2040_u2if.spi_readinto(buf, start=start, end=end, write_value=write_value)
47
48     # pylint: disable=too-many-arguments
49     def write_readinto(
50         self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None
51     ):
52         """Perform a half-duplex write from buffer_out and then
53         read data into buffer_in
54         """
55         rp2040_u2if.spi_write_readinto(
56             buffer_out,
57             buffer_in,
58             out_start=out_start,
59             out_end=out_end,
60             in_start=in_start,
61             in_end=in_end,
62         )
63
64     # pylint: enable=too-many-arguments
65
66
67 class SPI_Pico(SPI):
68     """SPI Class for Pico u2if"""
69
70     def __init__(self, clock, *, baudrate=100000):
71         index = None
72         if clock.id == 18:
73             index = 0
74         if clock.id == 10:
75             index = 1
76         if index is None:
77             raise ValueError("No SPI port on specified pin.")
78         super().__init__(index, baudrate=baudrate)
79
80
81 class SPI_Feather(SPI):
82     """SPI Class for Feather u2if"""
83
84     def __init__(self, clock, *, baudrate=100000):
85         index = None
86         if clock.id == 18:
87             index = 0
88         if index is None:
89             raise ValueError("No SPI port on specified pin.")
90         super().__init__(index, baudrate=baudrate)
91
92
93 class SPI_QTPY(SPI):
94     """SPI Class for QT Py u2if"""
95
96     def __init__(self, clock, *, baudrate=100000):
97         index = None
98         if clock.id == 6:
99             index = 0
100         if index is None:
101             raise ValueError("No SPI port on specified pin.")
102         super().__init__(index, baudrate=baudrate)
103
104
105 class SPI_ItsyBitsy(SPI):
106     """SPI Class for ItsyBitsy u2if"""
107
108     def __init__(self, clock, *, baudrate=100000):
109         index = None
110         if clock.id == 18:
111             index = 0
112         if index is None:
113             raise ValueError("No SPI port on specified pin.")
114         super().__init__(index, baudrate=baudrate)
115
116
117 class SPI_MacroPad(SPI):
118     """SPI Class for MacroPad u2if"""
119
120     def __init__(self, clock, *, baudrate=100000):
121         index = None
122         if clock.id == 26:
123             index = 1
124         if index is None:
125             raise ValueError("No SPI port on specified pin.")
126         super().__init__(index, baudrate=baudrate)