Skip to content

Commit 9dce627

Browse files
committed
can read version #
1 parent 713e439 commit 9dce627

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

adafruit_esp32spi.py

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import time
2+
import board
3+
import busio
4+
from digitalio import DigitalInOut, Direction, Pull
5+
from micropython import const
6+
7+
class ESP_SPIcontrol:
8+
GET_CONN_STATUS_CMD = const(0x20)
9+
GET_FW_VERSION_CMD = const(0x37)
10+
START_CMD = const(0xE0)
11+
END_CMD = const(0xEE)
12+
ERR_CMD = const(0xEF)
13+
REPLY_FLAG = const(1<<7)
14+
CMD_FLAG = const(0)
15+
16+
WL_NO_SHIELD = const(0xFF)
17+
WL_NO_MODULE = const(0xFF)
18+
WL_IDLE_STATUS = const(0)
19+
20+
def __init__(self, spi, cs_pin, ready_pin, reset_pin, gpio0_pin, *, debug=True):
21+
self.debug = debug
22+
self._buffer = bytearray(10)
23+
self._pbuf = bytearray(1) # buffer for param read
24+
25+
self._spi = spi
26+
self._cs = cs_pin
27+
self._ready = ready_pin
28+
self._reset = reset_pin
29+
self._gpio0 = gpio0_pin
30+
31+
self._cs.direction = Direction.OUTPUT
32+
self._ready.direction = Direction.INPUT
33+
self._reset.direction = Direction.OUTPUT
34+
self._gpio0.direction = Direction.OUTPUT
35+
36+
print("Nina reset")
37+
self._gpio0.value = True # not bootload mode
38+
self._cs.value = True
39+
self._reset.value = False
40+
time.sleep(0.01) # reset
41+
self._reset.value = True
42+
time.sleep(0.75) # wait for it to boot up
43+
44+
self._gpio0.direction = Direction.INPUT
45+
46+
def spi_slave_select(self):
47+
while not self._spi.try_lock():
48+
pass
49+
self._spi.configure(baudrate=100000) # start slow
50+
self._cs.value = False # the actual select
51+
times = time.monotonic()
52+
while (time.monotonic() - times) < 0.1: # wait up to 100ms
53+
if self._ready.value:
54+
return
55+
raise RuntimeError("ESP32 timed out on SPI select")
56+
57+
def slave_deselect(self):
58+
self._cs.value = True
59+
self._spi.unlock()
60+
61+
def slave_ready(self):
62+
return self._ready.value == False
63+
64+
def wait_for_slave_ready(self):
65+
print("wait for slave ready")
66+
while not self.slave_ready():
67+
print('.')
68+
69+
def wait_for_slave_select(self):
70+
self.wait_for_slave_ready()
71+
self.spi_slave_select()
72+
73+
74+
def send_command(self, cmd, params=None):
75+
num_params = 0 # default to no params
76+
if params:
77+
num_params = len(params)
78+
packet = bytearray(4+num_params)
79+
packet[0] = START_CMD
80+
packet[1] = cmd & ~REPLY_FLAG
81+
packet[2] = num_params
82+
83+
# handle parameters here
84+
85+
packet[3] = END_CMD
86+
self._spi.write(packet)
87+
print("Wrote: ", [hex(b) for b in packet])
88+
89+
def get_param(self):
90+
self._spi.readinto(self._pbuf)
91+
print("Read param", hex(self._pbuf[0]))
92+
return self._pbuf[0]
93+
94+
def wait_spi_char(self, desired):
95+
times = time.monotonic()
96+
while (time.monotonic() - times) < 0.1:
97+
r = self.get_param()
98+
if r == ERR_CMD:
99+
raise RuntimeError("Error response to command")
100+
if r == desired:
101+
return True
102+
else:
103+
raise RuntimeError("Timed out waiting for SPI char")
104+
105+
def check_data(self, desired):
106+
r = self.get_param()
107+
if r != desired:
108+
raise RuntimeError("Expected %02X but got %02X" % (desired, r))
109+
110+
def wait_response_cmd(self, cmd, num_responses):
111+
self.wait_spi_char(START_CMD)
112+
self.check_data(cmd | REPLY_FLAG)
113+
self.check_data(num_responses)
114+
responses = []
115+
for num in range(num_responses):
116+
response = []
117+
param_len = self.get_param()
118+
print("parameter #%d length is %d" % (num, param_len))
119+
for j in range(param_len):
120+
response.append(self.get_param())
121+
responses.append(response)
122+
self.check_data(END_CMD)
123+
return responses
124+
125+
def get_connection_status(self):
126+
print("Connection status")
127+
self.wait_for_slave_select()
128+
self.send_command(GET_CONN_STATUS_CMD)
129+
self.slave_deselect()
130+
131+
self.wait_for_slave_ready()
132+
self.spi_slave_select()
133+
resp = self.wait_response_cmd(GET_CONN_STATUS_CMD, 1)
134+
self.slave_deselect()
135+
print("Status:", resp[0][0])
136+
return resp[0][0] # one byte response
137+
138+
def get_firmware_version(self):
139+
print("Firmware version")
140+
self.wait_for_slave_select()
141+
self.send_command(GET_FW_VERSION_CMD)
142+
self.slave_deselect()
143+
144+
self.wait_for_slave_ready()
145+
self.spi_slave_select()
146+
resp = self.wait_response_cmd(GET_FW_VERSION_CMD, 1)
147+
self.slave_deselect()
148+
return ''.join([chr(c) for c in resp[0]])

0 commit comments

Comments
 (0)