rp2/machine_spi: Allow MISO to be unspecified.
It's common with write-only SPI displays for MISO to be repurposed as a register select or data/command pin. While that was possible by setting up the pin after a call to `machine.SPI()` this change makes `machine.SPI(miso=None)` explicit. Signed-off-by: Phil Howard <github@gadgetoid.com>
This commit is contained in:
committed by
Damien George
parent
a86122396d
commit
dd7a950bbc
@@ -80,6 +80,9 @@
|
|||||||
|
|
||||||
#endif
|
#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}.
|
// 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))
|
#define IS_VALID_PERIPH(spi, pin) ((((pin) & 8) >> 3) == (spi))
|
||||||
// GP{2,6,10,14,...}
|
// 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) {
|
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);
|
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->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) {
|
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_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_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_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.
|
// 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;
|
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);
|
int miso = mp_hal_get_pin_obj(args[ARG_miso].u_obj);
|
||||||
if (!IS_VALID_MISO(self->spi_id, miso)) {
|
if (!IS_VALID_MISO(self->spi_id, miso)) {
|
||||||
mp_raise_ValueError(MP_ERROR_TEXT("bad MISO pin"));
|
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);
|
self->baudrate = spi_set_baudrate(self->spi_inst, self->baudrate);
|
||||||
spi_set_format(self->spi_inst, self->bits, self->polarity, self->phase, self->firstbit);
|
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->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);
|
gpio_set_function(self->mosi, GPIO_FUNC_SPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user