diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index 9d66338c78..ffd50299f8 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -157,6 +157,7 @@ SRC_SDK := \ src/common/pico_sync/lock_core.c \ src/common/pico_sync/mutex.c \ src/common/pico_time/time.c \ + src/common/pico_time/timeout_helper.c \ src/common/pico_util/pheap.c \ src/rp2_common/hardware_adc/adc.c \ src/rp2_common/hardware_claim/claim.c \ diff --git a/ports/raspberrypi/common-hal/busio/I2C.c b/ports/raspberrypi/common-hal/busio/I2C.c index 6886b3815e..cb0d73e75b 100644 --- a/ports/raspberrypi/common-hal/busio/I2C.c +++ b/ports/raspberrypi/common-hal/busio/I2C.c @@ -38,6 +38,9 @@ #define NO_PIN 0xff +// One second +#define BUS_TIMEOUT_US 1000000 + STATIC bool never_reset_i2c[2]; STATIC i2c_inst_t* i2c[2] = {i2c0, i2c1}; @@ -177,24 +180,34 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, return status; } - int result = i2c_write_blocking(self->peripheral, addr, data, len, !transmit_stop_bit); + int result = i2c_write_timeout_us(self->peripheral, addr, data, len, !transmit_stop_bit, BUS_TIMEOUT_US); if (result == len) { return 0; - } else if (result == PICO_ERROR_GENERIC) { - return MP_ENODEV; } - return MP_EIO; + switch (result) { + case PICO_ERROR_GENERIC: + return MP_ENODEV; + case PICO_ERROR_TIMEOUT: + return MP_ETIMEDOUT; + default: + return MP_EIO; + } } uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { - int result = i2c_read_blocking(self->peripheral, addr, data, len, false); + int result = i2c_read_timeout_us(self->peripheral, addr, data, len, false, BUS_TIMEOUT_US); if (result == len) { return 0; - } else if (result == PICO_ERROR_GENERIC) { - return MP_ENODEV; } - return MP_EIO; + switch (result) { + case PICO_ERROR_GENERIC: + return MP_ENODEV; + case PICO_ERROR_TIMEOUT: + return MP_ETIMEDOUT; + default: + return MP_EIO; + } } void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {