
У мастера stm32f407 на i2c шине висят slave устройства.
У мастера есть пин, которым он может сделать аппаратный сброс этих устройств (всех сразу).
При зависании одного из slave устройств, мастер должен прекратить работу на шине, дернуть за сброс, возобновить работу по шине.
А непонятка в следующем: какого-то хрена сброс slave устройств и дальнейшая работа по шине возможна только во время старта мастера, но до инициализации шины i2c.
А когда мастер уже инициализировал свою шину, тогда после сброса slave устройств дальнейшая работа по шине невозможна (вызов HAL_I2C_Master_Receive возвращается с ошибкой HAL_BUSY)
===============================================================
Такая последовательность запуска мастера работает:
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_USART1_UART_Init();
reset_i2c3m_subsystems();
MX_I2C3_Init();
MX_RTC_Init();
MX_I2C2_Init();
MX_I2C1_Init();
далее работа по шине идет нормально
.......................................................
===============================================================
Такая последовательность запуска мастера НЕ работает:
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_USART1_UART_Init();
MX_I2C3_Init();
reset_i2c3m_subsystems();
MX_RTC_Init();
MX_I2C2_Init();
MX_I2C1_Init();
HAL_I2C_Master_Receive возвращает HAL_BUSY
....................................................................
================================================================
Содержимое функции сброса простое.
void reset_i2c3m_subsystems(){
//HAL_I2C_MspDeInit(&hi2c3); // Не помогает
HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_SET);
HAL_Delay(100);
//HAL_I2C_MspInit(&hi2c3); //не помогает
}
=================================================================
=================================================================
Обнаружил, что работе шины мешает сброс устройств именно после инициализации SCL. Функция ниже вызывается из MX_I2C3_Init():
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){
.............................................................................
.............................................................................
/**I2C3 GPIO Configuration
PC9 ------> I2C3_SDA
PA8 ------> I2C3_SCL
*/
.............................................................................
.............................................................................
>>> Если сброс slave устройств сделать здесь, шина будет работать
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
>>> Если сброс slave устройств сделать здесь, шина работать НЕ будет
.............................................................................
.............................................................................
}
На осциллографе до и после инициализации шины изменений не видно, линии к земле не прижаты
Уже башку сломал
