А здесь знаю, что кто вкурсе молчать не будут, дадут совет
tatic void I2cFailRecover(VL53L0X_Dev_t *vl53dev)
{
GPIO_InitTypeDef GPIO_InitStruct;
int i, nRetry=0;
uint16_t clk_pin, data_pin;
if ((vl53dev->I2cHandle)==&hi2c1)
{
clk_pin=GPIO_PIN_6;
data_pin=GPIO_PIN_7;
}
else if ((vl53dev->I2cHandle)==&hi2c2)
{
clk_pin=GPIO_PIN_10;
data_pin=GPIO_PIN_11;
}
else return;
// We can't assume bus state based on SDA and SCL state (we may be in a data or NAK bit so SCL=SDA=1)
// by setting SDA high and toggling SCL at least 10 time we ensure whatever agent and state
// all agent should end up seeing a "stop" and bus get back to an known idle i2c bus state
// Enable I/O
__HAL_RCC_GPIOB_CLK_ENABLE();
//HAL_I2C_DeInit(vl53dev->I2cHandle);
GPIO_InitStruct.Pin = clk_pin|data_pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, clk_pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, data_pin, GPIO_PIN_SET);
//TODO we could do this faster by not using HAL delay 1ms for clk timing
do{
for( i=0; i<10; i++){
HAL_GPIO_WritePin(GPIOB, clk_pin, GPIO_PIN_RESET);
fast_delay(10);
HAL_GPIO_WritePin(GPIOB, clk_pin, GPIO_PIN_SET);
fast_delay(10);
}
}while(HAL_GPIO_ReadPin(GPIOB, data_pin) == 0 && nRetry++<7);
if (HAL_GPIO_ReadPin(GPIOB, data_pin) == 1)
{
SET_BIT(vl53dev->I2cHandle->Instance->CR1, I2C_CR1_SWRST);
asm ("nop");
CLEAR_BIT(vl53dev->I2cHandle->Instance->CR1, I2C_CR1_SWRST);
// HAL_I2C_DeInit(vl53dev->I2cHandle);
vl53dev->I2cHandle->State=HAL_I2C_STATE_RESET;
if (vl53dev->I2cHandle==&hi2c1)
MX_I2C1_Init();
else if (vl53dev->I2cHandle==&hi2c2)
MX_I2C2_Init();
}
}