]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/nova/spi.py
Shift address 1 bit to the left to support 7-bit addressing
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / nova / spi.py
1 class SPI:
2     MSB = 0
3     PAYLOAD_MAX_LENGTH = 64
4
5     def __init__(self, clock):
6         from adafruit_blinka.microcontroller.nova import Connection
7         self._nova = Connection.getInstance()
8         self._nova.setOperationMode(0, 'SPI')
9         self._nova.setClockSPI(0, clock)
10         self._nova.setModeSPI(0, 0)
11         self._nova.setIOpinMode(0, 'DOUT')
12         self._nova.setIOpinMode(1, 'DOUT')
13         self._nova.beginSPI(0)
14
15         # Cpol and Cpha set by mode
16         # Mode  Cpol Cpha
17         #  0     0    0
18         #  1     0    1
19         #  2     1    0
20         #  3     1    1
21
22     def init(self, baudrate=100000, polarity=0, phase=0, bits=8,
23                   firstbit=MSB, sck=None, mosi=None, miso=None):
24         #print("baudrate: " + str(baudrate))
25         #print("mode: " + str((polarity<<1) | (phase)))
26         self._nova.setClockSPI(0, baudrate)
27         self._nova.setModeSPI(0, (polarity<<1) | (phase))
28
29     @staticmethod
30     def getSpiReceivedData(lineOutput):
31         return (lineOutput.split('RXD ')[1])
32
33     @property
34     def frequency(self):
35         return self._nova.getClockSPI(0).split('CLK ')[1]
36
37     def write(self, buf, start=0, end=None):
38         end = end if end else len(buf)
39         chunks, rest = divmod(end - start, self.PAYLOAD_MAX_LENGTH)
40         for i in range(chunks):
41             chunk_start = start + i * self.PAYLOAD_MAX_LENGTH
42             chunk_end = chunk_start + self.PAYLOAD_MAX_LENGTH
43             buffer_data = buf[chunk_start:chunk_end]
44             self._nova.clearBuffer(0)
45             self._nova.writeToBuffer(0, 0, buffer_data)
46             self._nova.transferBufferSPI(0, chunk_end - chunk_start + 1)
47         if rest:
48             buffer_data = buf[-1*rest:]
49             self._nova.clearBuffer(0)
50             self._nova.writeToBuffer(0, 0, buffer_data)
51             self._nova.transferBufferSPI(0, rest)
52
53     def readinto(self, buf, start=0, end=None, write_value=0):
54         end = end if end else len(buf)
55         for i in range(start, end):
56             buf[start+i] = int(self.getSpiReceivedData(self._nova.transferSPI(0, write_value)), 16)
57
58     def write_readinto(self, buffer_out, buffer_in,  out_start=0, out_end=None, in_start=0, in_end=None):
59         out_end = out_end if out_end else len(buffer_out)
60         in_end = in_end if in_end else len(buffer_in)
61         readlen = in_end-in_start
62         writelen = out_end-out_start
63         if readlen > writelen:
64             # resize out and pad with 0's
65             tmp = bytearray(buffer_out)
66             tmp.extend([0] * (readlen - len(buffer_out)))
67             buffer_out = tmp
68         i = 0
69         for data_out in buffer_out:
70             data_in = int(self.getSpiReceivedData(self._nova.transferSPI(0, data_out)), 16)
71             if i < readlen:
72                 buffer_in[in_start+i] = data_in
73             i += 1