mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Remove hard-coded cambus pins used for bus recovery.
This commit is contained in:
parent
dfe4aa81d9
commit
f387f58053
@ -102,6 +102,18 @@
|
|||||||
#define FIR_I2C_SDA_PIN (31)
|
#define FIR_I2C_SDA_PIN (31)
|
||||||
#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL)
|
#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL)
|
||||||
|
|
||||||
|
// I2C0
|
||||||
|
#define TWI0_ID (0)
|
||||||
|
#define TWI0_SCL_PIN (2)
|
||||||
|
#define TWI0_SDA_PIN (31)
|
||||||
|
#define TWI0_SPEED (CAMBUS_SPEED_FULL)
|
||||||
|
|
||||||
|
// I2C1
|
||||||
|
#define TWI1_ID (1)
|
||||||
|
#define TWI1_SCL_PIN (15)
|
||||||
|
#define TWI1_SDA_PIN (14)
|
||||||
|
#define TWI1_SPEED (CAMBUS_SPEED_FULL)
|
||||||
|
|
||||||
// PDM/MIC
|
// PDM/MIC
|
||||||
#define PDM_DIN_PIN (25)
|
#define PDM_DIN_PIN (25)
|
||||||
#define PDM_CLK_PIN (26)
|
#define PDM_CLK_PIN (26)
|
||||||
|
|||||||
@ -23,17 +23,19 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed)
|
|||||||
{
|
{
|
||||||
bus->id = bus_id;
|
bus->id = bus_id;
|
||||||
bus->speed = speed;
|
bus->speed = speed;
|
||||||
bus->scl_pin = FIR_I2C_SCL_PIN;
|
|
||||||
bus->sda_pin = FIR_I2C_SDA_PIN;
|
|
||||||
bus->initialized = false;
|
bus->initialized = false;
|
||||||
|
|
||||||
switch (bus_id) {
|
switch (bus_id) {
|
||||||
case 0: {
|
case 0: {
|
||||||
|
bus->scl_pin = TWI0_SCL_PIN;
|
||||||
|
bus->sda_pin = TWI0_SDA_PIN;
|
||||||
nrfx_twi_t _twi = NRFX_TWI_INSTANCE(0);
|
nrfx_twi_t _twi = NRFX_TWI_INSTANCE(0);
|
||||||
memcpy(&bus->twi, &_twi, sizeof(nrfx_twi_t));
|
memcpy(&bus->twi, &_twi, sizeof(nrfx_twi_t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case 1: {
|
||||||
|
bus->scl_pin = TWI1_SCL_PIN;
|
||||||
|
bus->sda_pin = TWI1_SDA_PIN;
|
||||||
nrfx_twi_t _twi = NRFX_TWI_INSTANCE(1);
|
nrfx_twi_t _twi = NRFX_TWI_INSTANCE(1);
|
||||||
memcpy(&bus->twi, &_twi, sizeof(nrfx_twi_t));
|
memcpy(&bus->twi, &_twi, sizeof(nrfx_twi_t));
|
||||||
break;
|
break;
|
||||||
@ -43,8 +45,8 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed)
|
|||||||
}
|
}
|
||||||
|
|
||||||
nrfx_twi_config_t config = {
|
nrfx_twi_config_t config = {
|
||||||
.scl = FIR_I2C_SCL_PIN,
|
.scl = bus->scl_pin,
|
||||||
.sda = FIR_I2C_SDA_PIN,
|
.sda = bus->sda_pin,
|
||||||
.frequency = speed,
|
.frequency = speed,
|
||||||
.interrupt_priority = 4,
|
.interrupt_priority = 4,
|
||||||
.hold_bus_uninit = false
|
.hold_bus_uninit = false
|
||||||
|
|||||||
@ -92,6 +92,21 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Our code only knows about these two I2Cs instances.
|
||||||
|
if (bus->i2c->Instance == FIR_I2C) {
|
||||||
|
bus->port = FIR_I2C_PORT;
|
||||||
|
bus->scl_pin = FIR_I2C_SCL_PIN;
|
||||||
|
bus->sda_pin = FIR_I2C_SDA_PIN;
|
||||||
|
} else if (bus->i2c->Instance == ISC_I2C) {
|
||||||
|
bus->port = ISC_I2C_PORT;
|
||||||
|
bus->scl_pin = ISC_I2C_SCL_PIN;
|
||||||
|
bus->sda_pin = ISC_I2C_SDA_PIN;
|
||||||
|
} else {
|
||||||
|
bus->port = NULL;
|
||||||
|
bus->scl_pin = 0;
|
||||||
|
bus->sda_pin = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Configure the I2C handle
|
// Configure the I2C handle
|
||||||
bus->i2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
bus->i2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||||
#if !defined(STM32F4)
|
#if !defined(STM32F4)
|
||||||
@ -111,7 +126,8 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed)
|
|||||||
|
|
||||||
HAL_I2C_DeInit(bus->i2c);
|
HAL_I2C_DeInit(bus->i2c);
|
||||||
if (HAL_I2C_Init(bus->i2c) != HAL_OK) {
|
if (HAL_I2C_Init(bus->i2c) != HAL_OK) {
|
||||||
/* Initialization Error */
|
bus->i2c = NULL;
|
||||||
|
bus->port = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,6 +213,7 @@ int cambus_deinit(cambus_t *bus)
|
|||||||
bus->i2c->Instance = NULL;
|
bus->i2c->Instance = NULL;
|
||||||
}
|
}
|
||||||
bus->i2c = NULL;
|
bus->i2c = NULL;
|
||||||
|
bus->port = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,29 +407,28 @@ i2c_error:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO this is only used by the FIR code, hard-code pin/port for now.
|
|
||||||
int cambus_pulse_scl(cambus_t *bus)
|
int cambus_pulse_scl(cambus_t *bus)
|
||||||
{
|
{
|
||||||
#if defined(FIR_I2C_SCL_PIN)
|
if (bus->port) {
|
||||||
// Configure SCL as GPIO
|
// Configure SCL as GPIO
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||||||
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
|
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
|
||||||
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
GPIO_InitStructure.Pin = FIR_I2C_SCL_PIN;
|
GPIO_InitStructure.Pin = bus->scl_pin;
|
||||||
HAL_GPIO_Init(FIR_I2C_PORT, &GPIO_InitStructure);
|
HAL_GPIO_Init(bus->port, &GPIO_InitStructure);
|
||||||
|
|
||||||
// Pulse SCL to recover stuck device.
|
// Pulse SCL to recover stuck device.
|
||||||
for (int i=0; i<10000; i++) {
|
for (int i=0; i<10000; i++) {
|
||||||
HAL_GPIO_WritePin(FIR_I2C_PORT, FIR_I2C_SCL_PIN, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(bus->port, bus->scl_pin, GPIO_PIN_SET);
|
||||||
mp_hal_delay_us(10);
|
mp_hal_delay_us(10);
|
||||||
HAL_GPIO_WritePin(FIR_I2C_PORT, FIR_I2C_SCL_PIN, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(bus->port, bus->scl_pin, GPIO_PIN_RESET);
|
||||||
mp_hal_delay_us(10);
|
mp_hal_delay_us(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear ARLO flag if it's set.
|
||||||
|
__HAL_I2C_CLEAR_FLAG(bus->i2c, I2C_FLAG_ARLO);
|
||||||
|
debug_printf("reset stuck i2c device\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear ARLO flag if it's set.
|
|
||||||
__HAL_I2C_CLEAR_FLAG(bus->i2c, I2C_FLAG_ARLO);
|
|
||||||
debug_printf("reset stuck i2c device\n");
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,6 +36,9 @@ typedef enum _cambus_speed {
|
|||||||
typedef struct _cambus {
|
typedef struct _cambus {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t speed;
|
uint32_t speed;
|
||||||
|
uint32_t scl_pin;
|
||||||
|
uint32_t sda_pin;
|
||||||
|
GPIO_TypeDef *port;
|
||||||
// This pointer will be set to its respective I2C handle defined in MicroPython
|
// This pointer will be set to its respective I2C handle defined in MicroPython
|
||||||
// because all I2C IRQs are defined in stm32_it.c and handled by MicroPython.
|
// because all I2C IRQs are defined in stm32_it.c and handled by MicroPython.
|
||||||
I2C_HandleTypeDef *i2c;
|
I2C_HandleTypeDef *i2c;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user