Skip to content

Commit 907d85b

Browse files
committed
working out spi bug
1 parent c6af5a7 commit 907d85b

File tree

5 files changed

+191
-36
lines changed

5 files changed

+191
-36
lines changed

esp32/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ SRC_C = \
129129
modesp.c \
130130
espneopixel.c \
131131
machine_hw_spi.c \
132+
machine_spi_test.c \
132133
$(SRC_MOD)
133134

134135
STM_SRC_C = $(addprefix stmhal/,\

esp32/machine_hw_spi.c

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,16 @@
4343
#define MICROPY_PY_MACHINE_SPI_LSB (1)
4444
#endif
4545

46+
#if 1
4647
#define MACHINE_HW_SPI_DEBUG_PRINTF(args...) printf(args)
48+
#else
49+
#define MACHINE_HW_SPI_DEBUG_PRINTF(args...)
50+
#endif
4751

48-
STATIC void machine_hw_spi_deinit_internal(spi_host_device_t host, spi_device_handle_t* spi) {
52+
STATIC void machine_hw_spi_deinit_internal(spi_host_device_t host, spi_device_handle_t spi) {
4953

50-
switch(spi_bus_remove_device(*spi)) {
54+
MACHINE_HW_SPI_DEBUG_PRINTF("machine_hw_spi_deinit_internal(host = %d, spi = %p)\n", host, spi);
55+
switch(spi_bus_remove_device(spi)) {
5156
case ESP_ERR_INVALID_ARG:
5257
mp_raise_msg(&mp_type_OSError, "Invalid configuration");
5358
return;
@@ -72,7 +77,7 @@ STATIC void machine_hw_spi_deinit(mp_obj_base_t *self_in) {
7277
machine_hw_spi_obj_t *self = (machine_hw_spi_obj_t*)self_in;
7378
if (self->state == MACHINE_HW_SPI_STATE_INIT) {
7479
self->state = MACHINE_HW_SPI_STATE_DEINIT;
75-
machine_hw_spi_deinit_internal(self->host, &self->spi);
80+
machine_hw_spi_deinit_internal(self->host, self->spi);
7681
}
7782
}
7883

@@ -107,7 +112,9 @@ STATIC void machine_hw_spi_transfer(mp_obj_base_t *self_in, size_t len, const ui
107112
transaction.rx_buffer = dest;
108113
}
109114

115+
MACHINE_HW_SPI_DEBUG_PRINTF("Just before spi_device_transmit()\n");
110116
spi_device_transmit(self->spi, &transaction);
117+
MACHINE_HW_SPI_DEBUG_PRINTF("Just after spi_device_transmit()\n");
111118

112119
if (shortMsg && dest != NULL) {
113120
memcpy(dest, &transaction.rx_data, len);
@@ -119,12 +126,14 @@ STATIC void machine_hw_spi_transfer(mp_obj_base_t *self_in, size_t len, const ui
119126

120127
STATIC void machine_hw_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
121128
machine_hw_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
122-
mp_printf(print, "SPI(id=%u, baudrate=%u, polarity=%u, phase=%u, bits=%u, firstbit=%u, sck=%d, mosi=%d, miso=%d)",
129+
mp_printf(print, "SPI(id=%u, baudrate=%u, polarity=%u, phase=%u, bits=%u, firstbit=%u, sck=%d, mosi=%d, miso=%d%s)",
123130
self->host, self->baudrate, self->polarity,
124131
self->phase, self->bits, self->firstbit,
125-
self->sck, self->mosi, self->miso );
132+
self->sck, self->mosi, self->miso,
133+
self->state != MACHINE_HW_SPI_STATE_INIT ? ", DEINIT" : "");
126134
}
127135

136+
128137
STATIC void machine_hw_spi_init_internal(
129138
machine_hw_spi_obj_t *self,
130139
int8_t host,
@@ -136,7 +145,10 @@ STATIC void machine_hw_spi_init_internal(
136145
int8_t sck,
137146
int8_t mosi,
138147
int8_t miso) {
139-
bool changed = false;
148+
149+
// if not initialized, then calling this (init) is a change, by definiton
150+
bool changed = self->state != MACHINE_HW_SPI_STATE_INIT;
151+
140152
MACHINE_HW_SPI_DEBUG_PRINTF("machine_hw_spi_init_internal(self, host = %d, baudrate = %d, polarity = %d, phase = %d, bits = %d, firstbit = %d, sck = %d, mosi = %d, miso = %d)\n", host, baudrate, polarity, phase, bits, firstbit, sck, mosi, miso);
141153

142154

@@ -193,40 +205,41 @@ STATIC void machine_hw_spi_init_internal(
193205
mp_raise_ValueError("SPI ID must be either HSPI(1) or VSPI(2)");
194206
}
195207

196-
if (changed) {
197-
if (self->state == MACHINE_HW_SPI_STATE_INIT) {
198-
MACHINE_HW_SPI_DEBUG_PRINTF("machine_hw_spi_init_internal calling deinit()\n");
199-
self->state = MACHINE_HW_SPI_STATE_DEINIT;
200-
machine_hw_spi_deinit_internal(old_host, &self->spi);
201-
}
202-
} else {
203-
return; // no changes
208+
if (!changed && self->state == MACHINE_HW_SPI_STATE_INIT) {
209+
return;
210+
}
211+
212+
if (self->state == MACHINE_HW_SPI_STATE_INIT) {
213+
MACHINE_HW_SPI_DEBUG_PRINTF("machine_hw_spi_init_internal calling deinit()\n");
214+
self->state = MACHINE_HW_SPI_STATE_DEINIT;
215+
machine_hw_spi_deinit_internal(old_host, self->spi);
204216
}
205217

206218
MACHINE_HW_SPI_DEBUG_PRINTF("machine_hw_spi_init_internal new values: host = %d, baudrate = %d, polarity = %d, phase = %d, bits = %d, firstbit = %d, sck = %d, mosi = %d, miso = %d)\n", self->host, self->baudrate, self->polarity, self->phase, self->bits, self->firstbit, self->sck, self->mosi, self->miso);
207219

220+
spi_bus_config_t bus_config;
221+
spi_device_interface_config_t device_config;
208222

209-
spi_bus_config_t buscfg = {
210-
.miso_io_num = self->miso,
211-
.mosi_io_num = self->mosi,
212-
.sclk_io_num = self->sck,
213-
.quadwp_io_num = -1,
214-
.quadhd_io_num = -1
215-
};
223+
memset(&bus_config, 0, sizeof(spi_bus_config_t));
224+
memset(&device_config, 0, sizeof(spi_device_interface_config_t));
216225

217-
spi_device_interface_config_t devcfg = {
218-
.clock_speed_hz = self->baudrate,
219-
.mode = self->phase | (self->polarity << 1),
220-
.spics_io_num = -1, // No CS pin
221-
.queue_size = 1,
222-
.flags = self->firstbit == MICROPY_PY_MACHINE_SPI_LSB ? SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST : 0,
223-
.pre_cb = NULL
224-
};
226+
bus_config.miso_io_num = self->miso;
227+
bus_config.mosi_io_num = self->mosi;
228+
bus_config.sclk_io_num = self->sck;
229+
bus_config.quadwp_io_num = -1;
230+
bus_config.quadhd_io_num = -1;
231+
232+
device_config.clock_speed_hz = self->baudrate;
233+
device_config.mode = self->phase | (self->polarity << 1);
234+
device_config.spics_io_num = -1;
235+
device_config.queue_size = 1;
236+
device_config.flags = self->firstbit == MICROPY_PY_MACHINE_SPI_LSB ? SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST : 0;
237+
device_config.pre_cb = NULL;
225238

226239
//Initialize the SPI bus
227240
// FIXME: Does the DMA matter? There are two
228241

229-
ret = spi_bus_initialize(self->host, &buscfg, 1);
242+
ret = spi_bus_initialize(self->host, &bus_config, self->host);
230243
switch (ret) {
231244
case ESP_ERR_INVALID_ARG:
232245
mp_raise_msg(&mp_type_OSError, "Invalid configuration");
@@ -237,7 +250,7 @@ STATIC void machine_hw_spi_init_internal(
237250
return;
238251
}
239252

240-
ret = spi_bus_add_device(self->host, &devcfg, &self->spi);
253+
ret = spi_bus_add_device(self->host, &device_config, &self->spi);
241254
switch (ret) {
242255
case ESP_ERR_INVALID_ARG:
243256
mp_raise_msg(&mp_type_OSError, "Invalid configuration");
@@ -274,8 +287,6 @@ STATIC void machine_hw_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_
274287
{ MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
275288
};
276289

277-
278-
279290
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
280291
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args),
281292
allowed_args, args);
@@ -308,7 +319,7 @@ STATIC void machine_hw_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_
308319
MACHINE_HW_SPI_DEBUG_PRINTF ("before calling internal\n");
309320
machine_hw_spi_init_internal( self, args[ARG_id].u_int, args[ARG_baudrate].u_int,
310321
args[ARG_polarity].u_int, args[ARG_phase].u_int, args[ARG_bits].u_int,
311-
args[ARG_firstbit].u_int, sck, miso, mosi);
322+
args[ARG_firstbit].u_int, sck, mosi, miso);
312323
}
313324

314325
mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
@@ -339,8 +350,8 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
339350
args[ARG_bits].u_int,
340351
args[ARG_firstbit].u_int,
341352
args[ARG_sck].u_obj == MP_OBJ_NULL ? -1 : machine_pin_get_id(args[ARG_sck].u_obj),
342-
args[ARG_miso].u_obj == MP_OBJ_NULL ? -1 : machine_pin_get_id(args[ARG_miso].u_obj),
343-
args[ARG_mosi].u_obj == MP_OBJ_NULL ? -1 : machine_pin_get_id(args[ARG_mosi].u_obj));
353+
args[ARG_mosi].u_obj == MP_OBJ_NULL ? -1 : machine_pin_get_id(args[ARG_mosi].u_obj),
354+
args[ARG_miso].u_obj == MP_OBJ_NULL ? -1 : machine_pin_get_id(args[ARG_miso].u_obj));
344355

345356
return MP_OBJ_FROM_PTR(self);
346357
}

esp32/machine_spi_test.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
4+
#include "esp_log.h"
5+
6+
#include "py/runtime.h"
7+
#include "modmachine.h"
8+
9+
10+
#include "driver/spi_master.h"
11+
12+
STATIC mp_obj_t spi_test(void) {
13+
14+
spi_bus_config_t bus_config;
15+
spi_device_interface_config_t device_config;
16+
spi_device_handle_t spi;
17+
spi_host_device_t host = 1;
18+
int dma = 1;
19+
20+
memset(&bus_config, 0, sizeof(spi_bus_config_t));
21+
memset(&device_config, 0, sizeof(spi_device_interface_config_t));
22+
23+
bus_config.miso_io_num = -1;
24+
bus_config.mosi_io_num = 26;
25+
bus_config.sclk_io_num = 25;
26+
bus_config.quadwp_io_num = -1;
27+
bus_config.quadhd_io_num = -1;
28+
29+
device_config.clock_speed_hz = 50000;
30+
device_config.mode = 0;
31+
device_config.spics_io_num = -1;
32+
device_config.queue_size = 1;
33+
device_config.flags = SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST;
34+
35+
assert(spi_bus_initialize(host, &bus_config, dma) == ESP_OK);
36+
assert(spi_bus_add_device(host, &device_config, &spi) == ESP_OK);
37+
38+
struct spi_transaction_t transaction = {
39+
.flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA,
40+
.length = 16,
41+
.tx_buffer = NULL,
42+
.rx_buffer = NULL,
43+
.tx_data = {0x04, 0x00}
44+
};
45+
46+
printf("before first xmit\n");
47+
assert(spi_device_transmit(spi, &transaction) == ESP_OK);
48+
printf("after first xmit\n");
49+
50+
assert(spi_bus_remove_device(spi) == ESP_OK);
51+
assert(spi_bus_free(host) == ESP_OK);
52+
53+
// change things up!
54+
bus_config.mosi_io_num = 4;
55+
host = 2;
56+
57+
assert(spi_bus_initialize(host, &bus_config, dma) == ESP_OK);
58+
assert(spi_bus_add_device(host, &device_config, &spi) == ESP_OK);
59+
60+
printf("before second xmit\n");
61+
assert(spi_device_transmit(spi, &transaction) == ESP_OK);
62+
printf("after second xmit\n");
63+
64+
return mp_const_none;
65+
}
66+
MP_DEFINE_CONST_FUN_OBJ_0(spi_test_obj, spi_test);
67+
68+
STATIC const mp_rom_map_elem_t spi_test_locals_dict_table[] = {
69+
{ MP_ROM_QSTR(MP_QSTR_test), MP_ROM_PTR(&spi_test_obj) },
70+
};
71+
72+
STATIC MP_DEFINE_CONST_DICT(spi_test_locals_dict, spi_test_locals_dict_table);
73+
74+
const mp_obj_type_t machine_spi_test_type = {
75+
{ &mp_type_type },
76+
.name = MP_QSTR_spi_test,
77+
.locals_dict = (mp_obj_t)&spi_test_locals_dict
78+
};

esp32/modmachine.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) {
8989
}
9090
MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq);
9191

92+
extern mp_obj_type_t machine_spi_test_type;
93+
9294
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
9395
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
9496

@@ -110,6 +112,7 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
110112
{ MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&machine_adc_type) },
111113
{ MP_ROM_QSTR(MP_QSTR_DAC), MP_ROM_PTR(&machine_dac_type) },
112114
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&machine_i2c_type) },
115+
{ MP_ROM_QSTR(MP_QSTR_spi_test), MP_ROM_PTR(&machine_spi_test_type) },
113116
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&mp_machine_soft_spi_type) },
114117
};
115118

esp32/scratch.txt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
import machine as m
3+
m.spi_test.test()
4+
5+
import machine as m
6+
p = m.Pin(4)
7+
r = m.RTC()
8+
p.init(p.IN, p.PULL_UP)
9+
r.wake_on_ext0(pin = p, level = 0)
10+
m.deepsleep()
11+
12+
import machine as m
13+
pins = (m.Pin(2), m.Pin(4))
14+
for p in pins: p.init(m.Pin.IN, m.Pin.PULL_UP)
15+
16+
r = m.RTC()
17+
r.wake_on_ext1(pins = pins, level = r.WAKEUP_ALL_LOW)
18+
m.deepsleep()
19+
20+
21+
import machine as m
22+
r = m.RTC()
23+
r.irq(trigger=r.ALARM0, wake=m.DEEPSLEEP)
24+
r.alarm(r.ALARM0, 3000)
25+
m.deepsleep()
26+
27+
import machine as m
28+
s = m.SPI(sck=m.Pin(25), mosi = m.Pin(26), miso = m.Pin(5))
29+
s.init()
30+
cs = m.Pin(27)
31+
cs.value(0)
32+
cs.init(m.Pin.OUT, m.Pin.PULL_UP)
33+
cs.value(1)
34+
s.write(bytearray([0x80, 0x01] + [0xAA] * 1000))
35+
cs.value(0)
36+
37+
38+
import machine as m
39+
40+
t = m.SPI(1, sck=m.Pin(4), mosi = m.Pin(5))
41+
42+
s.init(2);
43+
s.init(2, sck=m.Pin(25), mosi = m.Pin(4), firstbit = m.SPI.LSB)
44+
45+
s.init(1, sck=m.Pin(25), mosi = m.Pin(26), firstbit = m.SPI.LSB)
46+
47+
s = m.SPI(2, sck=m.Pin(25), mosi = m.Pin(26))
48+
49+
50+
s.init(2, sck=m.Pin(25), mosi = m.Pin(26))
51+
52+
s.init(1, sck=m.Pin(25), mosi = m.Pin(26), miso = m.Pin(5), firstbit = m.SPI.LSB)
53+
54+
s.init(1)
55+
56+
s.init(2, baudrate = 50000)
57+
58+
import time;d.clear(); time.sleep(.5);d.refresh()
59+
60+
s.transfer(bytearray((1,2,3,4,5)))
61+
s.init(1, sck=m.Pin(25), mosi = m.Pin(26))
62+
cs = m.Pin(27)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy