Skip to content

Commit

Permalink
stm32/spi: Return error code and raise exception if SPI init fails.
Browse files Browse the repository at this point in the history
Signed-off-by: Damien George <[email protected]>
  • Loading branch information
dpgeorge committed Mar 9, 2023
1 parent 98937dc commit 6c8b19c
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 15 deletions.
10 changes: 8 additions & 2 deletions ports/stm32/machine_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz
args[ARG_firstbit].u_int);

// init the SPI bus
spi_init(self->spi, false);
int ret = spi_init(self->spi, false);
if (ret != 0) {
mp_raise_OSError(-ret);
}

return MP_OBJ_FROM_PTR(self);
}
Expand All @@ -116,7 +119,10 @@ STATIC void machine_hard_spi_init(mp_obj_base_t *self_in, size_t n_args, const m
args[ARG_firstbit].u_int);

// re-init the SPI bus
spi_init(self->spi, false);
int ret = spi_init(self->spi, false);
if (ret != 0) {
mp_raise_OSError(-ret);
}
}

STATIC void machine_hard_spi_deinit(mp_obj_base_t *self_in) {
Expand Down
5 changes: 4 additions & 1 deletion ports/stm32/pyb_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,10 @@ STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, size_t n_args, co
}

// init the SPI bus
spi_init(self->spi, init->NSS != SPI_NSS_SOFT);
int ret = spi_init(self->spi, init->NSS != SPI_NSS_SOFT);
if (ret != 0) {
mp_raise_OSError(-ret);
}

return mp_const_none;
}
Expand Down
18 changes: 7 additions & 11 deletions ports/stm32/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,8 @@
* THE SOFTWARE.
*/

#include <stdio.h>
#include <string.h>

#include "py/runtime.h"
#include "py/mperrno.h"
#include "py/mphal.h"
#include "spi.h"
#include "extmod/machine_spi.h"
Expand Down Expand Up @@ -296,7 +294,7 @@ void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate,
}

// TODO allow to take a list of pins to use
void spi_init(const spi_t *self, bool enable_nss_pin) {
int spi_init(const spi_t *self, bool enable_nss_pin) {
SPI_HandleTypeDef *spi = self->spi;
uint32_t irqn = 0;
const pin_obj_t *pins[4] = { NULL, NULL, NULL, NULL };
Expand Down Expand Up @@ -396,7 +394,7 @@ void spi_init(const spi_t *self, bool enable_nss_pin) {
#endif
} else {
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
return;
return -MP_EINVAL;
}

// init the GPIO lines
Expand All @@ -412,10 +410,7 @@ void spi_init(const spi_t *self, bool enable_nss_pin) {
// 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
// called via Python, so may not be properly wrapped in an NLR handler
printf("OSError: HAL_SPI_Init failed\n");
return;
return -MP_EIO;
}

// After calling HAL_SPI_Init() it seems that the DMA gets disconnected if
Expand All @@ -430,6 +425,8 @@ void spi_init(const spi_t *self, bool enable_nss_pin) {
#else
(void)irqn;
#endif

return 0; // success
}

void spi_deinit(const spi_t *spi_obj) {
Expand Down Expand Up @@ -715,8 +712,7 @@ STATIC int spi_proto_ioctl(void *self_in, uint32_t cmd) {
self->spi->spi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
spi_set_params(self->spi, 0xffffffff, self->baudrate,
self->polarity, self->phase, self->bits, self->firstbit);
spi_init(self->spi, false);
break;
return spi_init(self->spi, false);

case MP_SPI_IOCTL_DEINIT:
spi_deinit(self->spi);
Expand Down
2 changes: 1 addition & 1 deletion ports/stm32/spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ extern const mp_obj_type_t machine_spi_type;
#define SPI_TRANSFER_TIMEOUT(len) ((len) + 100)

void spi_init0(void);
void spi_init(const spi_t *spi, bool enable_nss_pin);
int spi_init(const spi_t *spi, bool enable_nss_pin);
void spi_deinit(const spi_t *spi_obj);
int spi_find_index(mp_obj_t id);
void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate,
Expand Down

0 comments on commit 6c8b19c

Please sign in to comment.