]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/nova/spi.py
d92d2d7698eaf877d6468a5d6191302b9012e3b0
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / nova / spi.py
1 #from adafruit_blinka.microcontroller.nova.pin import Pin
2
3 class SPI:
4     PAYLOAD_MAX_LENGTH = 64
5
6     def __init__(self, clock):
7         from binhoHostAdapter import binhoHostAdapter
8         from binhoHostAdapter import binhoUtilities
9
10         utilities = binhoUtilities.binhoUtilities()
11         devices = utilities.listAvailableDevices()
12
13         if len(devices) > 0:
14             self._nova = binhoHostAdapter.binhoHostAdapter(devices[0])
15             self._nova.setOperationMode(0, 'SPI')
16             self._nova.setClockSPI(0, clock)
17             self._nova.setModeSPI(0, 0)
18             self._nova.setIOpinMode(0, 'DOUT')
19             self._nova.setIOpinValue(0, 'HIGH')
20             self._nova.beginSPI(0)
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         else:
29             raise RuntimeError('No Binho host adapter found!')
30
31     def init(self, baudrate=100000, polarity=0, phase=0, bits=8,
32                   firstbit=MSB, sck=None, mosi=None, miso=None):
33         print("baudrate: " + baudrate)
34         print("mode: " + (polarity<<1) | (phase))
35         self._nova.setClockSPI(0, baudrate)
36         self._nova.setModeSPI(0, (polarity<<1) | (phase))
37
38     @staticmethod
39     def getSpiReceivedData(lineOutput):
40         return (lineOutput.split('RXD ')[1])
41
42     @property
43     def frequency(self):
44         return self._nova.getClockSPI(0).split('CLK ')[1]
45
46     def write(self, buf, start=0, end=None):
47         end = end if end else len(buf)
48         chunks, rest = divmod(end - start, self.PAYLOAD_MAX_LENGTH)
49         self._nova.setIOpinValue(0, 'LOW')
50         for i in range(chunks):
51             chunk_start = start + i * self.PAYLOAD_MAX_LENGTH
52             chunk_end = chunk_start + self.PAYLOAD_MAX_LENGTH
53             buffer_data = buf[chunk_start:chunk_end]
54             self._nova.clearBuffer(0)
55             self._nova.writeToBuffer(0, 0, buffer_data)
56             self._nova.transferBufferSPI(0, chunk_end - chunk_start + 1)
57         if rest:
58             buffer_data = buf[-1*rest:]
59             self._nova.clearBuffer(0)
60             self._nova.writeToBuffer(0, 0, buffer_data)
61             self._nova.transferBufferSPI(0, rest)
62         self._nova.setIOpinValue(0, 'HIGH')
63         print(self._nova.readBuffer(0, 4))
64
65     def readinto(self, buf, start=0, end=None, write_value=0):
66         end = end if end else len(buf)
67         self._nova.setIOpinValue(0, 'LOW')
68         for i in range(start, end):
69             buf[start+i] = int(self.getSpiReceivedData(self._nova.transferSPI(0, write_value)), 16)
70         self._nova.setIOpinValue(0, 'HIGH')
71
72     def write_readinto(self, buffer_out, buffer_in,  out_start=0, out_end=None, in_start=0, in_end=None):
73         out_end = out_end if out_end else len(buffer_out)
74         in_end = in_end if in_end else len(buffer_in)
75         readlen = in_end-in_start
76         writelen = out_end-out_start
77         if readlen > writelen:
78             # resize out and pad with 0's
79             tmp = bytearray(buffer_out)
80             tmp.extend([0] * (readlen - len(buffer_out)))
81             buffer_out = tmp
82         i = 0
83         self._nova.setIOpinValue(0, 'LOW')
84         for data_out in buffer_out:
85             data_in = int(self.getSpiReceivedData(self._nova.transferSPI(0, data_out)), 16)
86             if i < readlen:
87                 buffer_in[in_start+i] = data_in
88             i += 1
89         self._nova.setIOpinValue(0, 'HIGH')