1 #from adafruit_blinka.microcontroller.nova.pin import Pin
4 PAYLOAD_MAX_LENGTH = 64
6 def __init__(self, clock):
7 from binhoHostAdapter import binhoHostAdapter
8 from binhoHostAdapter import binhoUtilities
10 utilities = binhoUtilities.binhoUtilities()
11 devices = utilities.listAvailableDevices()
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
29 raise RuntimeError('No Binho host adapter found!')
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))
39 def getSpiReceivedData(lineOutput):
40 return (lineOutput.split('RXD ')[1])
44 return self._nova.getClockSPI(0).split('CLK ')[1]
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)
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))
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')
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)))
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)
87 buffer_in[in_start+i] = data_in
89 self._nova.setIOpinValue(0, 'HIGH')