mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
sensors/cambus: Support returning multiple devices from scan.
This commit is contained in:
parent
ef275cf29c
commit
2960a803cb
@ -46,7 +46,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_scan(cambus_t *bus, uint8_t *list, uint8_t size);
|
||||
int cambus_enable(cambus_t *bus, bool enable);
|
||||
int cambus_gencall(cambus_t *bus, uint8_t cmd);
|
||||
int cambus_pulse_scl(cambus_t *bus);
|
||||
|
||||
@ -201,7 +201,7 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed)
|
||||
mp_hal_delay_ms(10);
|
||||
|
||||
// Probe the sensor
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus);
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0);
|
||||
if (sensor.slv_addr == 0) {
|
||||
/* Sensor has been held in reset,
|
||||
so the reset line is active low */
|
||||
@ -212,21 +212,21 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed)
|
||||
mp_hal_delay_ms(10);
|
||||
|
||||
// Probe again to set the slave addr.
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus);
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0);
|
||||
if (sensor.slv_addr == 0) {
|
||||
sensor.pwdn_pol = ACTIVE_LOW;
|
||||
|
||||
DCMI_PWDN_HIGH();
|
||||
mp_hal_delay_ms(10);
|
||||
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus);
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0);
|
||||
if (sensor.slv_addr == 0) {
|
||||
sensor.reset_pol = ACTIVE_HIGH;
|
||||
|
||||
DCMI_RESET_LOW();
|
||||
mp_hal_delay_ms(10);
|
||||
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus);
|
||||
sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0);
|
||||
#ifndef OMV_ENABLE_NONI2CIS
|
||||
if (sensor.slv_addr == 0) {
|
||||
return SENSOR_ERROR_ISC_UNDETECTED;
|
||||
|
||||
@ -317,7 +317,7 @@ mp_obj_t py_fir_init(uint n_args, const mp_obj_t *args, mp_map_t *kw_args)
|
||||
if (type == -1) {
|
||||
FIR_SCAN_RETRY:
|
||||
cambus_init(&fir_bus, FIR_I2C_ID, CAMBUS_SPEED_STANDARD);
|
||||
switch (cambus_scan(&fir_bus)) {
|
||||
switch (cambus_scan(&fir_bus, NULL, 0)) {
|
||||
#if (OMV_ENABLE_FIR_MLX90621 == 1)
|
||||
case (MLX90621_ADDR << 1): {
|
||||
type = FIR_MLX90621;
|
||||
|
||||
@ -84,17 +84,24 @@ int cambus_deinit(cambus_t *bus)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cambus_scan(cambus_t *bus)
|
||||
int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size)
|
||||
{
|
||||
int idx = 0;
|
||||
uint8_t data;
|
||||
uint32_t xfer_flags = 0;
|
||||
for (uint8_t addr=0x09; addr<=0x77; addr++) {
|
||||
nrfx_twi_xfer_desc_t desc = NRFX_TWI_XFER_DESC_RX(addr, &data, 1);
|
||||
if (nrfx_twi_xfer(&bus->i2c, &desc, xfer_flags) == NRFX_SUCCESS) {
|
||||
if (list == NULL || size == 0) {
|
||||
return (addr << 1);
|
||||
} else if (idx < size) {
|
||||
list[idx++] = (addr << 1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
int cambus_enable(cambus_t *bus, bool enable)
|
||||
|
||||
@ -64,14 +64,21 @@ int cambus_deinit(cambus_t *bus)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cambus_scan(cambus_t *bus)
|
||||
int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size)
|
||||
{
|
||||
for (uint8_t addr=0x20, rxdata; addr<=0x48; addr++) {
|
||||
int idx = 0;
|
||||
for (uint8_t addr=0x20, rxdata; addr<=0x77; addr++) {
|
||||
if (i2c_read_timeout_us(bus->i2c, addr, &rxdata, 1, false, I2C_SCAN_TIMEOUT) >= 0) {
|
||||
if (list == NULL || size == 0) {
|
||||
return (addr << 1);
|
||||
} else if (idx < size) {
|
||||
list[idx++] = (addr << 1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
int cambus_enable(cambus_t *bus, bool enable)
|
||||
|
||||
@ -261,21 +261,30 @@ int cambus_deinit(cambus_t *bus)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cambus_scan(cambus_t *bus)
|
||||
int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size)
|
||||
{
|
||||
int idx = 0;
|
||||
for (uint8_t addr=0x09; addr<=0x77; addr++) {
|
||||
if (HAL_I2C_IsDeviceReady(bus->i2c, addr << 1, 10, I2C_SCAN_TIMEOUT) == HAL_OK) {
|
||||
if (list == NULL || size == 0) {
|
||||
return (addr << 1);
|
||||
} else if (idx < size) {
|
||||
list[idx++] = (addr << 1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(STM32H7)
|
||||
// After a failed scan the bus can get stuck. Re-initializing the bus fixes
|
||||
// it, but it seems disabling and re-enabling the bus is all that's needed.
|
||||
if (idx == 0) {
|
||||
__HAL_I2C_DISABLE(bus->i2c);
|
||||
mp_hal_delay_ms(10);
|
||||
__HAL_I2C_ENABLE(bus->i2c);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
return idx;
|
||||
}
|
||||
|
||||
int cambus_enable(cambus_t *bus, bool enable)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user