adafruit_bus_device: SPIDevice: Fix so it works with bitbangio.SPI

.. by calling methods, same as we did for I2C
This commit is contained in:
Jeff Epler 2021-03-26 14:51:53 -05:00
parent a70b679ed5
commit 172715194f

View File

@ -42,14 +42,28 @@ void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spid
}
mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self) {
bool success = false;
while (!success) {
success = common_hal_busio_spi_try_lock(self->spi);
RUN_BACKGROUND_TASKS;
mp_handle_pending();
{
mp_obj_t dest[2];
mp_load_method(self->spi, MP_QSTR_try_lock, dest);
while (!mp_obj_is_true(mp_call_method_n_kw(0, 0, dest))) {
mp_handle_pending();
}
}
common_hal_busio_spi_configure(self->spi, self->baudrate, self->polarity, self->phase, 8);
{
mp_obj_t dest[10];
mp_load_method(self->spi, MP_QSTR_configure, dest);
dest[2] = MP_OBJ_NEW_QSTR(MP_QSTR_baudrate);
dest[3] = MP_OBJ_NEW_SMALL_INT(self->baudrate);
dest[4] = MP_OBJ_NEW_QSTR(MP_QSTR_polarity);
dest[5] = MP_OBJ_NEW_SMALL_INT(self->polarity);
dest[6] = MP_OBJ_NEW_QSTR(MP_QSTR_phase);
dest[7] = MP_OBJ_NEW_SMALL_INT(self->phase);
dest[8] = MP_OBJ_NEW_QSTR(MP_QSTR_bits);
dest[9] = MP_OBJ_NEW_SMALL_INT(8);
mp_call_method_n_kw(0, 4, dest);
}
if (self->chip_select != MP_OBJ_NULL) {
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), false);
@ -67,21 +81,21 @@ void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice
mp_buffer_info_t bufinfo;
mp_obj_t buffer = mp_obj_new_bytearray_of_zeros(1);
mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_READ);
mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_WRITE);
((uint8_t *)bufinfo.buf)[0] = 0xFF;
uint8_t clocks = self->extra_clocks / 8;
if ((self->extra_clocks % 8) != 0) {
clocks += 1;
}
uint8_t clocks = (self->extra_clocks + 7) / 8;
mp_obj_t dest[3];
mp_load_method(self->spi, MP_QSTR_write, dest);
dest[2] = buffer;
while (clocks > 0) {
if (!common_hal_busio_spi_write(self->spi, ((uint8_t *)bufinfo.buf), 1)) {
mp_raise_OSError(MP_EIO);
}
mp_call_method_n_kw(1, 0, dest);
clocks--;
}
}
common_hal_busio_spi_unlock(self->spi);
mp_obj_t dest[2];
mp_load_method(self->spi, MP_QSTR_unlock, dest);
mp_call_method_n_kw(0, 0, dest);
}