diff --git a/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h b/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h index a01d37aea8..a626f4534b 100644 --- a/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h +++ b/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h @@ -17,6 +17,8 @@ #define MICROPY_HW_ENABLE_TIMER (1) #define MICROPY_HW_ENABLE_SERVO (1) #define MICROPY_HW_ENABLE_DAC (0) +#define MICROPU_HW_ENABLE_I2C1 (0) +#define MICROPU_HW_ENABLE_SPI1 (0) // USRSW is pulled low. Pressing the button makes the input go high. #define MICROPY_HW_USRSW_PIN (pin_B11) diff --git a/stmhal/i2c.c b/stmhal/i2c.c index 8a8dd7dc2d..4d2710d8e5 100644 --- a/stmhal/i2c.c +++ b/stmhal/i2c.c @@ -13,6 +13,10 @@ #include "genhdr/pins.h" #include "i2c.h" +#if !defined(MICROPU_HW_ENABLE_I2C1) +#define MICROPY_HW_ENABLE_I2C1 (1) +#endif + I2C_HandleTypeDef I2CHandle1 = {.Instance = NULL}; I2C_HandleTypeDef I2CHandle2 = {.Instance = NULL}; @@ -32,6 +36,7 @@ void i2c_init(I2C_HandleTypeDef *i2c) { GPIO_InitStructure.Pull = GPIO_NOPULL; // have external pull-up resistors on both lines const pin_obj_t *pins[2]; +#if MICROPY_HW_ENABLE_I2C1 if (i2c == &I2CHandle1) { // X-skin: X9=PB6=SCL, X10=PB7=SDA pins[0] = &pin_B6; @@ -39,7 +44,9 @@ void i2c_init(I2C_HandleTypeDef *i2c) { GPIO_InitStructure.Alternate = GPIO_AF4_I2C1; // enable the I2C clock __I2C1_CLK_ENABLE(); - } else { + } else +#endif + if (i2c == &I2CHandle2) { // Y-skin: Y9=PB10=SCL, Y10=PB11=SDA pins[0] = &pin_B10; pins[1] = &pin_B11; @@ -54,13 +61,6 @@ void i2c_init(I2C_HandleTypeDef *i2c) { HAL_GPIO_Init(pins[i]->gpio, &GPIO_InitStructure); } - // enable the I2C clock - if (i2c == &I2CHandle1) { - __I2C1_CLK_ENABLE(); - } else { - __I2C2_CLK_ENABLE(); - } - // init the I2C device i2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; i2c->Init.ClockSpeed = 400000; @@ -88,7 +88,10 @@ typedef struct _pyb_i2c_obj_t { I2C_HandleTypeDef *i2c; } pyb_i2c_obj_t; -STATIC const pyb_i2c_obj_t pyb_i2c_obj[PYB_NUM_I2C] = {{{&pyb_i2c_type}, &I2CHandle1}, {{&pyb_i2c_type}, &I2CHandle2}}; +STATIC const pyb_i2c_obj_t pyb_i2c_obj[PYB_NUM_I2C] = { + {{&pyb_i2c_type}, &I2CHandle1}, + {{&pyb_i2c_type}, &I2CHandle2} +}; STATIC mp_obj_t pyb_i2c_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) { // check arguments diff --git a/stmhal/spi.c b/stmhal/spi.c index 9e48bc899e..5e5049bef9 100644 --- a/stmhal/spi.c +++ b/stmhal/spi.c @@ -13,11 +13,13 @@ #include "genhdr/pins.h" #include "spi.h" +#if !defined(MICROPU_HW_ENABLE_SPI1) +#define MICROPY_HW_ENABLE_SPI1 (1) +#endif + SPI_HandleTypeDef SPIHandle1 = {.Instance = NULL}; SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL}; -#if MICROPY_HW_ENABLE_SPI3 SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL}; -#endif void spi_init0(void) { // reset the SPI handles @@ -25,10 +27,8 @@ void spi_init0(void) { SPIHandle1.Instance = SPI1; memset(&SPIHandle2, 0, sizeof(SPI_HandleTypeDef)); SPIHandle2.Instance = SPI2; -#if MICROPY_HW_ENABLE_SPI3 memset(&SPIHandle3, 0, sizeof(SPI_HandleTypeDef)); SPIHandle3.Instance = SPI3; -#endif } // TODO allow to take a list of pins to use @@ -40,6 +40,7 @@ void spi_init(SPI_HandleTypeDef *spi) { GPIO_InitStructure.Pull = GPIO_PULLUP; // ST examples use PULLUP const pin_obj_t *pins[4]; +#if MICROPY_HW_ENABLE_SPI1 if (spi->Instance == SPI1) { // X-skin: X5=PA4=SPI1_NSS, X6=PA5=SPI1_SCK, X7=PA6=SPI1_MISO, X8=PA7=SPI1_MOSI pins[0] = &pin_A4; @@ -47,25 +48,28 @@ void spi_init(SPI_HandleTypeDef *spi) { pins[2] = &pin_A6; pins[3] = &pin_A7; GPIO_InitStructure.Alternate = GPIO_AF5_SPI1; - } else if (spi->Instance == SPI2) { + } else +#endif + if (spi->Instance == SPI2) { // Y-skin: Y5=PB12=SPI2_NSS, Y6=PB13=SPI2_SCK, Y7=PB14=SPI2_MISO, Y8=PB15=SPI2_MOSI pins[0] = &pin_B12; pins[1] = &pin_B13; pins[2] = &pin_B14; pins[3] = &pin_B15; GPIO_InitStructure.Alternate = GPIO_AF5_SPI2; + } else #if MICROPY_HW_ENABLE_SPI3 - } else if (spi->Instance == SPI3) { + if (spi->Instance == SPI3) { pins[0] = &pin_A4; pins[1] = &pin_B3; pins[2] = &pin_B4; pins[3] = &pin_B5; GPIO_InitStructure.Alternate = GPIO_AF6_SPI3; + } else #endif - } else { + { // SPI does not exist for this board - printf("HardwareError: invalid SPI\n"); - return; + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "SPI bus does not exist")); } for (uint i = 0; i < 4; i++) { @@ -78,10 +82,8 @@ void spi_init(SPI_HandleTypeDef *spi) { __SPI1_CLK_ENABLE(); } else if (spi->Instance == SPI2) { __SPI2_CLK_ENABLE(); -#if MICROPY_HW_ENABLE_SPI3 - } else { + } else if (spi->Instance == SPI3) { __SPI3_CLK_ENABLE(); -#endif } // init the I2C device @@ -100,24 +102,25 @@ void spi_deinit(SPI_HandleTypeDef *spi) { __SPI1_CLK_DISABLE(); } else if (spi->Instance == SPI2) { __SPI2_CLK_DISABLE(); -#if MICROPY_HW_ENABLE_SPI3 - } else { + } else if (spi->Instance == SPI3) { __SPI3_CLK_DISABLE(); -#endif } } /******************************************************************************/ /* Micro Python bindings */ -#define PYB_SPI_NUM (2) +#define PYB_NUM_SPI (2) typedef struct _pyb_spi_obj_t { mp_obj_base_t base; SPI_HandleTypeDef *spi; } pyb_spi_obj_t; -STATIC const pyb_spi_obj_t pyb_spi_obj[PYB_SPI_NUM] = {{{&pyb_spi_type}, &SPIHandle1}, {{&pyb_spi_type}, &SPIHandle2}}; +STATIC const pyb_spi_obj_t pyb_spi_obj[PYB_NUM_SPI] = { + {{&pyb_spi_type}, &SPIHandle1}, + {{&pyb_spi_type}, &SPIHandle2} +}; STATIC void pyb_spi_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { pyb_spi_obj_t *self = self_in; @@ -220,7 +223,7 @@ STATIC mp_obj_t pyb_spi_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const machine_int_t spi_id = mp_obj_get_int(args[0]) - 1; // check SPI number - if (!(0 <= spi_id && spi_id < PYB_SPI_NUM)) { + if (!(0 <= spi_id && spi_id < PYB_NUM_SPI)) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "SPI bus %d does not exist", spi_id + 1)); }