3 PAYLOAD_MAX_LENGTH = 64
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)
15 # Cpol and Cpha set by mode
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))
30 def getSpiReceivedData(lineOutput):
31 return (lineOutput.split('RXD ')[1])
35 return self._nova.getClockSPI(0).split('CLK ')[1]
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)
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)
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)
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)))
69 for data_out in buffer_out:
70 data_in = int(self.getSpiReceivedData(self._nova.transferSPI(0, data_out)), 16)
72 buffer_in[in_start+i] = data_in