summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-06-16 11:49:20 -0400
committerGitHub <noreply@github.com>2018-06-16 11:49:20 -0400
commitbe5eb91df8d84de77bce976c7c1fc49686a9f7f0 (patch)
treea57e3d6daf6f83a0ddeec480dfbee29d8dadd97f
parent35ead7bf39d5bf845f547db60109d454ee3e8944 (diff)
parent23b6d334555cf7314546b9040a20d40bc21922c5 (diff)
Merge pull request #938 from sommersoft/esp_busio_fix
ESP8266: Fix pin locking during busio.SPI.configure
-rw-r--r--ports/esp8266/common-hal/busio/SPI.c34
-rw-r--r--ports/esp8266/common-hal/busio/SPI.h3
2 files changed, 25 insertions, 12 deletions
diff --git a/ports/esp8266/common-hal/busio/SPI.c b/ports/esp8266/common-hal/busio/SPI.c
index b862c1da7..e1eeecc2a 100644
--- a/ports/esp8266/common-hal/busio/SPI.c
+++ b/ports/esp8266/common-hal/busio/SPI.c
@@ -38,18 +38,11 @@ extern const mcu_pin_obj_t pin_MTMS;
extern const mcu_pin_obj_t pin_MTCK;
extern const mcu_pin_obj_t pin_MTDI;
-void common_hal_busio_spi_construct(busio_spi_obj_t *self,
- const mcu_pin_obj_t * clock, const mcu_pin_obj_t * mosi,
- const mcu_pin_obj_t * miso) {
- if (clock != &pin_MTMS || !((mosi == &pin_MTCK && miso == MP_OBJ_TO_PTR(mp_const_none)) ||
- (mosi == MP_OBJ_TO_PTR(mp_const_none) && miso == &pin_MTDI) ||
- (mosi == &pin_MTCK && miso == &pin_MTDI))) {
- nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
- "Pins not valid for SPI"));
- }
+void busio_spi_init_gpio(uint8_t sysclk_as_spiclk, const mcu_pin_obj_t * clock,
+ const mcu_pin_obj_t * mosi, const mcu_pin_obj_t * miso) {
uint32_t clock_div_flag = 0;
- if (SPI_CLK_USE_DIV) {
+ if (sysclk_as_spiclk) {
clock_div_flag = 0x0001;
}
@@ -65,6 +58,23 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
}
// GPIO14 is HSPI CLK pin (Clock)
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
+}
+
+
+void common_hal_busio_spi_construct(busio_spi_obj_t *self,
+ const mcu_pin_obj_t * clock, const mcu_pin_obj_t * mosi,
+ const mcu_pin_obj_t * miso) {
+ if (clock != &pin_MTMS || !((mosi == &pin_MTCK && miso == MP_OBJ_TO_PTR(mp_const_none)) ||
+ (mosi == MP_OBJ_TO_PTR(mp_const_none) && miso == &pin_MTDI) ||
+ (mosi == &pin_MTCK && miso == &pin_MTDI))) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
+ "Pins not valid for SPI"));
+ }
+
+ busio_spi_init_gpio(SPI_CLK_USE_DIV, clock, mosi, miso);
+ self->clock = clock;
+ self->mosi = mosi;
+ self->miso = miso;
spi_clock(HSPI, SPI_CLK_PREDIV, SPI_CLK_CNTDIV);
self->frequency = SPI_CLK_FREQ;
@@ -106,7 +116,7 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
}
if (baudrate == 80000000L) {
// Special case for full speed.
- spi_init_gpio(HSPI, SPI_CLK_80MHZ_NODIV);
+ busio_spi_init_gpio(SPI_CLK_80MHZ_NODIV, self->clock, self->mosi, self->miso);
spi_clock(HSPI, 0, 0);
self->frequency = 80000000L;
} else if (baudrate > 40000000L) {
@@ -118,7 +128,7 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
if (cntdiv > SPI_CLKCNT_N + 1 || cntdiv == 0 || prediv == 0) {
return false;
}
- spi_init_gpio(HSPI, SPI_CLK_USE_DIV);
+ busio_spi_init_gpio(SPI_CLK_USE_DIV, self->clock, self->mosi, self->miso);
spi_clock(HSPI, prediv, cntdiv);
self->frequency = 80000000L / (prediv * cntdiv);
}
diff --git a/ports/esp8266/common-hal/busio/SPI.h b/ports/esp8266/common-hal/busio/SPI.h
index ba9a5268e..7b2de082c 100644
--- a/ports/esp8266/common-hal/busio/SPI.h
+++ b/ports/esp8266/common-hal/busio/SPI.h
@@ -36,6 +36,9 @@ typedef struct {
uint32_t frequency;
bool locked;
bool deinited;
+ const mcu_pin_obj_t * mosi;
+ const mcu_pin_obj_t * miso;
+ const mcu_pin_obj_t * clock;
} busio_spi_obj_t;
#endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_BUSIO_SPI_H