]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
Add check to ODroid n2 to make sure i2c matches expected ports
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / rp2040_u2if / spi.py
1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
2 #
3 # SPDX-License-Identifier: MIT
4 """SPI Classes for RP2040s with u2if firmware"""
5 from .rp2040_u2if import rp2040_u2if
6
7
8 # pylint: disable=protected-access, no-self-use
9 class SPI:
10     """SPI Base Class for RP2040 u2if"""
11
12     MSB = 0
13
14     def __init__(self, index, *, baudrate=100000):
15         self._index = index
16         self._frequency = baudrate
17         rp2040_u2if.spi_set_port(self._index)
18         rp2040_u2if.spi_configure(self._frequency)
19
20     # pylint: disable=too-many-arguments,unused-argument
21     def init(
22         self,
23         baudrate=1000000,
24         polarity=0,
25         phase=0,
26         bits=8,
27         firstbit=MSB,
28         sck=None,
29         mosi=None,
30         miso=None,
31     ):
32         """Initialize the Port"""
33         self._frequency = baudrate
34         rp2040_u2if.spi_set_port(self._index)
35         rp2040_u2if.spi_configure(self._frequency)
36
37     # pylint: enable=too-many-arguments
38
39     @property
40     def frequency(self):
41         """Return the current frequency"""
42         return self._frequency
43
44     def write(self, buf, start=0, end=None):
45         """Write data from the buffer to SPI"""
46         rp2040_u2if.spi_write(buf, start=start, end=end)
47
48     def readinto(self, buf, start=0, end=None, write_value=0):
49         """Read data from SPI and into the buffer"""
50         rp2040_u2if.spi_readinto(buf, start=start, end=end, write_value=write_value)
51
52     # pylint: disable=too-many-arguments
53     def write_readinto(
54         self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None
55     ):
56         """Perform a half-duplex write from buffer_out and then
57         read data into buffer_in
58         """
59         rp2040_u2if.spi_write_readinto(
60             buffer_out,
61             buffer_in,
62             out_start=out_start,
63             out_end=out_end,
64             in_start=in_start,
65             in_end=in_end,
66         )
67
68     # pylint: enable=too-many-arguments
69
70
71 class SPI_Pico(SPI):
72     """SPI Class for Pico u2if"""
73
74     def __init__(self, clock, *, baudrate=100000):
75         index = None
76         if clock.id == 18:
77             index = 0
78         if clock.id == 10:
79             index = 1
80         if index is None:
81             raise ValueError("No SPI port on specified pin.")
82         super().__init__(index, baudrate=baudrate)
83
84
85 class SPI_Feather(SPI):
86     """SPI Class for Feather u2if"""
87
88     def __init__(self, clock, *, baudrate=100000):
89         index = None
90         if clock.id == 18:
91             index = 0
92         if index is None:
93             raise ValueError("No SPI port on specified pin.")
94         super().__init__(index, baudrate=baudrate)
95
96
97 class SPI_Feather_CAN(SPI):
98     """SPI Class for Feather EPD u2if"""
99
100     def __init__(self, clock, *, baudrate=100000):
101         index = None
102         if clock.id == 14:
103             index = 1
104         if index is None:
105             raise ValueError("No SPI port on specified pin.")
106         super().__init__(index, baudrate=baudrate)
107
108
109 class SPI_Feather_EPD(SPI):
110     """SPI Class for Feather EPD u2if"""
111
112     def __init__(self, clock, *, baudrate=100000):
113         index = None
114         if clock.id == 22:
115             index = 0
116         if clock.id == 14:
117             index = 1
118         if index is None:
119             raise ValueError("No SPI port on specified pin.")
120         super().__init__(index, baudrate=baudrate)
121
122
123 class SPI_Feather_RFM(SPI):
124     """SPI Class for Feather EPD u2if"""
125
126     def __init__(self, clock, *, baudrate=100000):
127         index = None
128         if clock.id == 14:
129             index = 1
130         if index is None:
131             raise ValueError("No SPI port on specified pin.")
132         super().__init__(index, baudrate=baudrate)
133
134
135 class SPI_QTPY(SPI):
136     """SPI Class for QT Py u2if"""
137
138     def __init__(self, clock, *, baudrate=100000):
139         index = None
140         if clock.id == 6:
141             index = 0
142         if index is None:
143             raise ValueError("No SPI port on specified pin.")
144         super().__init__(index, baudrate=baudrate)
145
146
147 class SPI_ItsyBitsy(SPI):
148     """SPI Class for ItsyBitsy u2if"""
149
150     def __init__(self, clock, *, baudrate=100000):
151         index = None
152         if clock.id == 18:
153             index = 0
154         if index is None:
155             raise ValueError("No SPI port on specified pin.")
156         super().__init__(index, baudrate=baudrate)
157
158
159 class SPI_MacroPad(SPI):
160     """SPI Class for MacroPad u2if"""
161
162     def __init__(self, clock, *, baudrate=100000):
163         index = None
164         if clock.id == 26:
165             index = 1
166         if index is None:
167             raise ValueError("No SPI port on specified pin.")
168         super().__init__(index, baudrate=baudrate)
169
170
171 class SPI_KB2040(SPI):
172     """SPI Class for KB2040 u2if"""
173
174     def __init__(self, clock, *, baudrate=100000):
175         index = None
176         if clock.id == 18:
177             index = 0
178         if index is None:
179             raise ValueError("No SPI port on specified pin.")
180         super().__init__(index, baudrate=baudrate)