diff --git a/src/omv/common/cambus.h b/src/omv/common/cambus.h index a340ccc3b..763245f2e 100644 --- a/src/omv/common/cambus.h +++ b/src/omv/common/cambus.h @@ -47,6 +47,7 @@ typedef struct _cambus { int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed); int cambus_deinit(cambus_t *bus); int cambus_scan(cambus_t *bus); +int cambus_enable(cambus_t *bus, bool enable); int cambus_gencall(cambus_t *bus, uint8_t cmd); int cambus_pulse_scl(cambus_t *bus); int cambus_readb(cambus_t *bus, uint8_t slv_addr, uint8_t reg_addr, uint8_t *reg_data); diff --git a/src/omv/common/sensor_utils.c b/src/omv/common/sensor_utils.c index 716d5e681..141d4dda8 100644 --- a/src/omv/common/sensor_utils.c +++ b/src/omv/common/sensor_utils.c @@ -137,6 +137,9 @@ __weak int sensor_reset() // Restore shutdown state on reset. sensor_shutdown(false); + // Disable the bus before reset. + cambus_enable(&sensor.bus, false); + // Hard-reset the sensor if (sensor.reset_pol == ACTIVE_HIGH) { DCMI_RESET_HIGH(); @@ -150,6 +153,9 @@ __weak int sensor_reset() mp_hal_delay_ms(20); + // Re-enable the bus. + cambus_enable(&sensor.bus, true); + // Check if the control is supported. if (sensor.reset == NULL) { return SENSOR_ERROR_CTL_UNSUPPORTED; diff --git a/src/omv/ports/nrf/cambus.c b/src/omv/ports/nrf/cambus.c index 7601eeb1f..4b3ff4052 100644 --- a/src/omv/ports/nrf/cambus.c +++ b/src/omv/ports/nrf/cambus.c @@ -97,6 +97,18 @@ int cambus_scan(cambus_t *bus) return 0; } +int cambus_enable(cambus_t *bus, bool enable) +{ + if (bus->initialized) { + if (enable) { + nrfx_twi_enable(&bus->i2c); + } else { + nrfx_twi_disable(&bus->i2c); + } + } + return 0; +} + int cambus_gencall(cambus_t *bus, uint8_t cmd) { uint32_t xfer_flags = 0; diff --git a/src/omv/ports/rp2/cambus.c b/src/omv/ports/rp2/cambus.c index 0ae7c0a56..f2419eb37 100644 --- a/src/omv/ports/rp2/cambus.c +++ b/src/omv/ports/rp2/cambus.c @@ -74,6 +74,11 @@ int cambus_scan(cambus_t *bus) return 0; } +int cambus_enable(cambus_t *bus, bool enable) +{ + return 0; +} + int cambus_readb(cambus_t *bus, uint8_t slv_addr, uint8_t reg_addr, uint8_t *reg_data) { int bytes = 0; diff --git a/src/omv/ports/stm32/cambus.c b/src/omv/ports/stm32/cambus.c index 2df9449a3..eb218242d 100644 --- a/src/omv/ports/stm32/cambus.c +++ b/src/omv/ports/stm32/cambus.c @@ -278,6 +278,18 @@ int cambus_scan(cambus_t *bus) return 0; } +int cambus_enable(cambus_t *bus, bool enable) +{ + if (bus->initialized) { + if (enable) { + __HAL_I2C_ENABLE(bus->i2c); + } else { + __HAL_I2C_DISABLE(bus->i2c); + } + } + return 0; +} + int cambus_gencall(cambus_t *bus, uint8_t cmd) { if (HAL_I2C_Master_Transmit(bus->i2c, 0x00, &cmd, 1, I2C_TIMEOUT) != HAL_OK) {