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);
|
args[ARG_firstbit].u_int);
|
||||||
|
|
||||||
// init the SPI bus
|
// 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);
|
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);
|
args[ARG_firstbit].u_int);
|
||||||
|
|
||||||
// re-init the SPI bus
|
// 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) {
|
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
|
// 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;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,8 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
|
#include "py/mperrno.h"
|
||||||
#include "py/mphal.h"
|
#include "py/mphal.h"
|
||||||
#include "spi.h"
|
#include "spi.h"
|
||||||
#include "extmod/machine_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
|
// 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;
|
SPI_HandleTypeDef *spi = self->spi;
|
||||||
uint32_t irqn = 0;
|
uint32_t irqn = 0;
|
||||||
const pin_obj_t *pins[4] = { NULL, NULL, NULL, NULL };
|
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
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
|
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
|
||||||
return;
|
return -MP_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// init the GPIO lines
|
// init the GPIO lines
|
||||||
|
@ -412,10 +410,7 @@ void spi_init(const spi_t *self, bool enable_nss_pin) {
|
||||||
// init the SPI device
|
// init the SPI device
|
||||||
if (HAL_SPI_Init(spi) != HAL_OK) {
|
if (HAL_SPI_Init(spi) != HAL_OK) {
|
||||||
// init error
|
// init error
|
||||||
// TODO should raise an exception, but this function is not necessarily going to be
|
return -MP_EIO;
|
||||||
// called via Python, so may not be properly wrapped in an NLR handler
|
|
||||||
printf("OSError: HAL_SPI_Init failed\n");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// After calling HAL_SPI_Init() it seems that the DMA gets disconnected if
|
// 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
|
#else
|
||||||
(void)irqn;
|
(void)irqn;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return 0; // success
|
||||||
}
|
}
|
||||||
|
|
||||||
void spi_deinit(const spi_t *spi_obj) {
|
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;
|
self->spi->spi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||||
spi_set_params(self->spi, 0xffffffff, self->baudrate,
|
spi_set_params(self->spi, 0xffffffff, self->baudrate,
|
||||||
self->polarity, self->phase, self->bits, self->firstbit);
|
self->polarity, self->phase, self->bits, self->firstbit);
|
||||||
spi_init(self->spi, false);
|
return spi_init(self->spi, false);
|
||||||
break;
|
|
||||||
|
|
||||||
case MP_SPI_IOCTL_DEINIT:
|
case MP_SPI_IOCTL_DEINIT:
|
||||||
spi_deinit(self->spi);
|
spi_deinit(self->spi);
|
||||||
|
|
|
@ -66,7 +66,7 @@ extern const mp_obj_type_t machine_spi_type;
|
||||||
#define SPI_TRANSFER_TIMEOUT(len) ((len) + 100)
|
#define SPI_TRANSFER_TIMEOUT(len) ((len) + 100)
|
||||||
|
|
||||||
void spi_init0(void);
|
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);
|
void spi_deinit(const spi_t *spi_obj);
|
||||||
int spi_find_index(mp_obj_t id);
|
int spi_find_index(mp_obj_t id);
|
||||||
void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate,
|
void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate,
|
||||||
|
|
Loading…
Reference in New Issue