diff options
Diffstat (limited to 'stmhal/spi.c')
| -rw-r--r-- | stmhal/spi.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/stmhal/spi.c b/stmhal/spi.c index 9e48bc899..b16cd83c8 100644 --- a/stmhal/spi.c +++ b/stmhal/spi.c @@ -13,7 +13,9 @@ #include "genhdr/pins.h" #include "spi.h" +#if MICROPY_HW_ENABLE_SPI1 SPI_HandleTypeDef SPIHandle1 = {.Instance = NULL}; +#endif SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL}; #if MICROPY_HW_ENABLE_SPI3 SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL}; @@ -21,8 +23,10 @@ SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL}; void spi_init0(void) { // reset the SPI handles +#if MICROPY_HW_ENABLE_SPI1 memset(&SPIHandle1, 0, sizeof(SPI_HandleTypeDef)); SPIHandle1.Instance = SPI1; +#endif memset(&SPIHandle2, 0, sizeof(SPI_HandleTypeDef)); SPIHandle2.Instance = SPI2; #if MICROPY_HW_ENABLE_SPI3 @@ -40,13 +44,18 @@ void spi_init(SPI_HandleTypeDef *spi) { GPIO_InitStructure.Pull = GPIO_PULLUP; // ST examples use PULLUP const pin_obj_t *pins[4]; - if (spi->Instance == SPI1) { + if (0) { +#if MICROPY_HW_ENABLE_SPI1 + } else 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; pins[1] = &pin_A5; pins[2] = &pin_A6; pins[3] = &pin_A7; GPIO_InitStructure.Alternate = GPIO_AF5_SPI1; + // enable the SPI clock + __SPI1_CLK_ENABLE(); +#endif } else 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; @@ -54,6 +63,8 @@ void spi_init(SPI_HandleTypeDef *spi) { pins[2] = &pin_B14; pins[3] = &pin_B15; GPIO_InitStructure.Alternate = GPIO_AF5_SPI2; + // enable the SPI clock + __SPI2_CLK_ENABLE(); #if MICROPY_HW_ENABLE_SPI3 } else if (spi->Instance == SPI3) { pins[0] = &pin_A4; @@ -61,10 +72,11 @@ void spi_init(SPI_HandleTypeDef *spi) { pins[2] = &pin_B4; pins[3] = &pin_B5; GPIO_InitStructure.Alternate = GPIO_AF6_SPI3; + // enable the SPI clock + __SPI3_CLK_ENABLE(); #endif } else { - // SPI does not exist for this board - printf("HardwareError: invalid SPI\n"); + // SPI does not exist for this board (shouldn't get here, should be checked by caller) return; } @@ -73,18 +85,7 @@ void spi_init(SPI_HandleTypeDef *spi) { HAL_GPIO_Init(pins[i]->gpio, &GPIO_InitStructure); } - // enable the SPI clock - if (spi->Instance == SPI1) { - __SPI1_CLK_ENABLE(); - } else if (spi->Instance == SPI2) { - __SPI2_CLK_ENABLE(); -#if MICROPY_HW_ENABLE_SPI3 - } else { - __SPI3_CLK_ENABLE(); -#endif - } - - // init the I2C device + // init the SPI device if (HAL_SPI_Init(spi) != HAL_OK) { // init error // TODO should raise an exception, but this function is not necessarily going to be @@ -96,12 +97,15 @@ void spi_init(SPI_HandleTypeDef *spi) { void spi_deinit(SPI_HandleTypeDef *spi) { HAL_SPI_DeInit(spi); - if (spi->Instance == SPI1) { + if (0) { +#if MICROPY_HW_ENABLE_SPI1 + } else if (spi->Instance == SPI1) { __SPI1_CLK_DISABLE(); +#endif } else if (spi->Instance == SPI2) { __SPI2_CLK_DISABLE(); #if MICROPY_HW_ENABLE_SPI3 - } else { + } else if (spi->Instance == SPI3) { __SPI3_CLK_DISABLE(); #endif } @@ -110,14 +114,25 @@ void spi_deinit(SPI_HandleTypeDef *spi) { /******************************************************************************/ /* Micro Python bindings */ -#define PYB_SPI_NUM (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[] = { +#if MICROPY_HW_ENABLE_SPI1 + {{&pyb_spi_type}, &SPIHandle1}, +#else + {{&pyb_spi_type}, NULL}, +#endif + {{&pyb_spi_type}, &SPIHandle2}, +#if MICROPY_HW_ENABLE_SPI3 + {{&pyb_spi_type}, &SPIHandle3}, +#else + {{&pyb_spi_type}, NULL}, +#endif +}; +#define PYB_NUM_SPI (sizeof(pyb_spi_obj) / sizeof(pyb_spi_obj[0])) 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 +235,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 && pyb_spi_obj[spi_id].spi != NULL)) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "SPI bus %d does not exist", spi_id + 1)); } |
