diff options
| -rw-r--r-- | ports/rp2/machine_spi.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/ports/rp2/machine_spi.c b/ports/rp2/machine_spi.c index 940e31b3b..680a3df28 100644 --- a/ports/rp2/machine_spi.c +++ b/ports/rp2/machine_spi.c @@ -80,6 +80,9 @@ #endif +// Assume we won't get an RP2-compatible with 255 GPIO pins +#define MICROPY_HW_SPI_PIN_UNUSED UINT8_MAX + // SPI0 can be GP{0..7,16..23}, SPI1 can be GP{8..15,24..29}. #define IS_VALID_PERIPH(spi, pin) ((((pin) & 8) >> 3) == (spi)) // GP{2,6,10,14,...} @@ -120,9 +123,14 @@ static machine_spi_obj_t machine_spi_obj[] = { static void machine_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { machine_spi_obj_t *self = MP_OBJ_TO_PTR(self_in); - mp_printf(print, "SPI(%u, baudrate=%u, polarity=%u, phase=%u, bits=%u, sck=%u, mosi=%u, miso=%u)", + mp_printf(print, "SPI(%u, baudrate=%u, polarity=%u, phase=%u, bits=%u, sck=%u, mosi=%u, miso=", self->spi_id, self->baudrate, self->polarity, self->phase, self->bits, - self->sck, self->mosi, self->miso); + self->sck, self->mosi); + if (self->miso == MICROPY_HW_SPI_PIN_UNUSED) { + mp_printf(print, "None)"); + } else { + mp_printf(print, "%u)", self->miso); + } } mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { @@ -140,7 +148,7 @@ mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n { MP_QSTR_firstbit, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_FIRSTBIT} }, { MP_QSTR_sck, MICROPY_SPI_PINS_ARG_OPTS | MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} }, { MP_QSTR_mosi, MICROPY_SPI_PINS_ARG_OPTS | MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} }, - { MP_QSTR_miso, MICROPY_SPI_PINS_ARG_OPTS | MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} }, + { MP_QSTR_miso, MICROPY_SPI_PINS_ARG_OPTS | MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_INT(-1)} }, }; // Parse the arguments. @@ -171,7 +179,10 @@ mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n } self->mosi = mosi; } - if (args[ARG_miso].u_obj != mp_const_none) { + + if (args[ARG_miso].u_obj == mp_const_none) { + self->miso = MICROPY_HW_SPI_PIN_UNUSED; + } else if (args[ARG_miso].u_obj != MP_OBJ_NEW_SMALL_INT(-1)) { int miso = mp_hal_get_pin_obj(args[ARG_miso].u_obj); if (!IS_VALID_MISO(self->spi_id, miso)) { mp_raise_ValueError(MP_ERROR_TEXT("bad MISO pin")); @@ -194,7 +205,9 @@ mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n self->baudrate = spi_set_baudrate(self->spi_inst, self->baudrate); spi_set_format(self->spi_inst, self->bits, self->polarity, self->phase, self->firstbit); gpio_set_function(self->sck, GPIO_FUNC_SPI); - gpio_set_function(self->miso, GPIO_FUNC_SPI); + if (self->miso != MICROPY_HW_SPI_PIN_UNUSED) { + gpio_set_function(self->miso, GPIO_FUNC_SPI); + } gpio_set_function(self->mosi, GPIO_FUNC_SPI); } |
