aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/stm32/spi.c31
-rw-r--r--ports/stm32/spi.h11
2 files changed, 42 insertions, 0 deletions
diff --git a/ports/stm32/spi.c b/ports/stm32/spi.c
index d09018148..411083bf2 100644
--- a/ports/stm32/spi.c
+++ b/ports/stm32/spi.c
@@ -563,3 +563,34 @@ const spi_t *spi_from_mp_obj(mp_obj_t o) {
mp_raise_TypeError("expecting an SPI object");
}
}
+
+/******************************************************************************/
+// Implementation of low-level SPI C protocol
+
+STATIC int spi_proto_ioctl(void *self_in, uint32_t cmd) {
+ spi_proto_cfg_t *self = (spi_proto_cfg_t*)self_in;
+
+ switch (cmd) {
+ case MP_SPI_IOCTL_INIT:
+ spi_set_params(self->spi, 0xffffffff, self->baudrate,
+ self->polarity, self->phase, self->bits, self->firstbit);
+ spi_init(self->spi, false);
+ break;
+
+ case MP_SPI_IOCTL_DEINIT:
+ spi_deinit(self->spi);
+ break;
+ }
+
+ return 0;
+}
+
+STATIC void spi_proto_transfer(void *self_in, size_t len, const uint8_t *src, uint8_t *dest) {
+ spi_proto_cfg_t *self = (spi_proto_cfg_t*)self_in;
+ spi_transfer(self->spi, len, src, dest, SPI_TRANSFER_TIMEOUT(len));
+}
+
+const mp_spi_proto_t spi_proto = {
+ .ioctl = spi_proto_ioctl,
+ .transfer = spi_proto_transfer,
+};
diff --git a/ports/stm32/spi.h b/ports/stm32/spi.h
index 41e7a47e7..885fb0bd6 100644
--- a/ports/stm32/spi.h
+++ b/ports/stm32/spi.h
@@ -26,6 +26,7 @@
#ifndef MICROPY_INCLUDED_STM32_SPI_H
#define MICROPY_INCLUDED_STM32_SPI_H
+#include "drivers/bus/spi.h"
#include "dma.h"
typedef struct _spi_t {
@@ -34,6 +35,15 @@ typedef struct _spi_t {
const dma_descr_t *rx_dma_descr;
} spi_t;
+typedef struct _spi_proto_cfg_t {
+ const spi_t *spi;
+ uint32_t baudrate;
+ uint8_t polarity;
+ uint8_t phase;
+ uint8_t bits;
+ uint8_t firstbit;
+} spi_proto_cfg_t;
+
typedef struct _pyb_spi_obj_t {
mp_obj_base_t base;
const spi_t *spi;
@@ -53,6 +63,7 @@ extern SPI_HandleTypeDef SPIHandle6;
extern const spi_t spi_obj[6];
+extern const mp_spi_proto_t spi_proto;
extern const mp_obj_type_t pyb_spi_type;
extern const mp_obj_type_t machine_soft_spi_type;
extern const mp_obj_type_t machine_hard_spi_type;