]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/nova/spi.py
Merge pull request #307 from luke-iqt/master
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / nova / spi.py
1 """SPI Class for Binho Nova"""
2 from adafruit_blinka.microcontroller.nova import Connection
3
4
5 class SPI:
6     """Custom SPI Class for Binho Nova"""
7
8     MSB = 0
9     PAYLOAD_MAX_LENGTH = 64
10
11     def __init__(self, clock):
12         self._nova = Connection.getInstance()
13         self._nova.setNumericalBase(10)
14         self._nova.setOperationMode(0, "SPI")
15         self._nova.setClockSPI(0, clock)
16         self._nova.setModeSPI(0, 0)
17         self._nova.setIOpinMode(0, "DOUT")
18         self._nova.setIOpinMode(1, "DOUT")
19         self._nova.beginSPI(0)
20
21         # Cpol and Cpha set by mode
22         # Mode  Cpol Cpha
23         #  0     0    0
24         #  1     0    1
25         #  2     1    0
26         #  3     1    1
27
28     # pylint: disable=too-many-arguments,unused-argument
29     def init(
30         self,
31         baudrate=100000,
32         polarity=0,
33         phase=0,
34         bits=8,
35         firstbit=MSB,
36         sck=None,
37         mosi=None,
38         miso=None,
39     ):
40         """Initialize the Port"""
41         # print("baudrate: " + str(baudrate))
42         # print("mode: " + str((polarity<<1) | (phase)))
43         self._nova.setClockSPI(0, baudrate)
44         self._nova.setModeSPI(0, (polarity << 1) | (phase))
45
46     # pylint: enable=too-many-arguments,unused-argument
47
48     @staticmethod
49     def get_received_data(lineOutput):
50         """Return any received data"""
51         return lineOutput.split("RXD ")[1]
52
53     @property
54     def frequency(self):
55         """Return the current frequency"""
56         return self._nova.getClockSPI(0).split("CLK ")[1]
57
58     def write(self, buf, start=0, end=None):
59         """Write data from the buffer to SPI"""
60         end = end if end else len(buf)
61         chunks, rest = divmod(end - start, self.PAYLOAD_MAX_LENGTH)
62         for i in range(chunks):
63             chunk_start = start + i * self.PAYLOAD_MAX_LENGTH
64             chunk_end = chunk_start + self.PAYLOAD_MAX_LENGTH
65             buffer_data = buf[chunk_start:chunk_end]
66             self._nova.clearBuffer(0)
67             self._nova.writeToBuffer(0, 0, buffer_data)
68             self._nova.transferBufferSPI(0, chunk_end - chunk_start + 1)
69         if rest:
70             buffer_data = buf[-1 * rest :]
71             self._nova.clearBuffer(0)
72             self._nova.writeToBuffer(0, 0, buffer_data)
73             self._nova.transferBufferSPI(0, rest)
74
75     def readinto(self, buf, start=0, end=None, write_value=0):
76         """Read data from SPI and into the buffer"""
77         end = end if end else len(buf)
78         for i in range(start, end):
79             buf[start + i] = int(
80                 self.get_received_data(self._nova.transferSPI(0, write_value))
81             )
82
83     # pylint: disable=too-many-arguments
84     def write_readinto(
85         self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None
86     ):
87         """Perform a half-duplex write from buffer_out and then
88         read data into buffer_in
89         """
90         out_end = out_end if out_end else len(buffer_out)
91         in_end = in_end if in_end else len(buffer_in)
92         readlen = in_end - in_start
93         writelen = out_end - out_start
94         if readlen > writelen:
95             # resize out and pad with 0's
96             tmp = bytearray(buffer_out)
97             tmp.extend([0] * (readlen - len(buffer_out)))
98             buffer_out = tmp
99         i = 0
100         for data_out in buffer_out:
101             data_in = int(self.get_received_data(self._nova.transferSPI(0, data_out)))
102             if i < readlen:
103                 buffer_in[in_start + i] = data_in
104             i += 1
105
106     # pylint: enable=too-many-arguments