8000 Merge pull request #938 from sommersoft/esp_busio_fix · sparkfun/circuitpython@be5eb91 · GitHub
[go: up one dir, main page]

Skip to content

Commit be5eb91

Browse files
authored
Merge pull request adafruit#938 from sommersoft/esp_busio_fix
ESP8266: Fix pin locking during busio.SPI.configure
2 parents 35ead7b + 23b6d33 commit be5eb91

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

ports/esp8266/common-hal/busio/SPI.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,11 @@ extern const mcu_pin_obj_t pin_MTMS;
3838
extern const mcu_pin_obj_t pin_MTCK;
3939
extern const mcu_pin_obj_t pin_MTDI;
4040

41-
void common_hal_busio_spi_construct(busio_spi_obj_t *self,
42-
const mcu_pin_obj_t * clock, const mcu_pin_obj_t 8000 * mosi,
43-
const mcu_pin_obj_t * miso) {
44-
if (clock != &pin_MTMS || !((mosi == &pin_MTCK && miso == MP_OBJ_TO_PTR(mp_const_none)) ||
45-
(mosi == MP_OBJ_TO_PTR(mp_const_none) && miso == &pin_MTDI) ||
46-
(mosi == &pin_MTCK && miso == &pin_MTDI))) {
47-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
48-
"Pins not valid for SPI"));
49-
}
41+
void busio_spi_init_gpio(uint8_t sysclk_as_spiclk, const mcu_pin_obj_t * clock,
42+
const mcu_pin_obj_t * mosi, const mcu_pin_obj_t * miso) {
5043

5144
uint32_t clock_div_flag = 0;
52-
if (SPI_CLK_USE_DIV) {
45+
if (sysclk_as_spiclk) {
5346
clock_div_flag = 0x0001;
5447
}
5548

@@ -65,6 +58,23 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
6558
}
6659
// GPIO14 is HSPI CLK pin (Clock)
6760
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
61+
}
62+
63+
64+
void common_hal_busio_spi_construct(busio_spi_obj_t *self,
65+
const mcu_pin_obj_t * clock, const mcu_pin_obj_t * mosi,
66+
const mcu_pin_obj_t * miso) {
67+
if (clock != &pin_MTMS || !((mosi == &pin_MTCK && miso == MP_OBJ_TO_PTR(mp_const_none)) ||
68+
(mosi == MP_OBJ_TO_PTR(mp_const_none) && miso == &pin_MTDI) ||
69+
(mosi == &pin_MTCK && miso == &pin_MTDI))) {
70+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
71+
"Pins not valid for SPI"));
72+
}
73+
74+
busio_spi_init_gpio(SPI_CLK_USE_DIV, clock, mosi, miso);
75+
self->clock = clock;
76+
self->mosi = mosi;
77+
self->miso = miso;
6878

6979
spi_clock(HSPI, SPI_CLK_PREDIV, SPI_CLK_CNTDIV);
7080
self->frequency = SPI_CLK_FREQ;
@@ -106,7 +116,7 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
106116
}
107117
if (baudrate == 80000000L) {
108118
// Special case for full speed.
109-
spi_init_gpio(HSPI, SPI_CLK_80MHZ_NODIV);
119+
busio_spi_init_gpio(SPI_CLK_80MHZ_NODIV, self->clock, self->mosi, self->miso);
110120
spi_clock(HSPI, 0, 0);
111121
self->frequency = 80000000L;
112122
} else if (baudrate > 40000000L) {
@@ -118,7 +128,7 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
118128
if (cntdiv > SPI_CLKCNT_N + 1 || cntdiv == 0 || prediv == 0) {
119129
return false;
120130
}
121-
spi_init_gpio(HSPI, SPI_CLK_USE_DIV);
131+
busio_spi_init_gpio(SPI_CLK_USE_DIV, self->clock, self->mosi, self->miso);
122132
spi_clock(HSPI, prediv, cntdiv);
123133
self->frequency = 80000000L / (prediv * cntdiv);
124134
}

ports/esp8266/common-hal/busio/SPI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ typedef struct {
3636
uint32_t frequency;
3737
bool locked;
3838
bool deinited;
39+
const mcu_pin_obj_t * mosi;
40+
const mcu_pin_obj_t * miso;
41+
const mcu_pin_obj_t * clock;
3942
} busio_spi_obj_t;
4043

4144
#endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_BUSIO_SPI_H

0 commit comments

Comments
 (0)
0