stm32/spi: Return error code and raise exception if SPI init fails.
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
98937dcfc2
commit
6c8b19c7e2
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
@ -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 };
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue