summaryrefslogtreecommitdiff
path: root/stmhal/spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'stmhal/spi.c')
-rw-r--r--stmhal/spi.c57
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));
}