Hardware : STM32L452RET6
Software : STM32CubeFW_L4 v1.17
My problem : After using I2C with standard polling functions, i would like to use IT Functions to optimize my firmware. I try to work with HAL_I2C_Master_Transmit_IT & HAL_I2C_Master_Receive_IT but my firmware stay blocked in the I2C1_EV_IRQHandler :
void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
{
/* Get current IT Flags and IT sources value */
uint32_t itflags = READ_REG(hi2c->Instance->ISR);
uint32_t itsources = READ_REG(hi2c->Instance->CR1);
/* I2C events treatment -------------------------------------*/
if (hi2c->XferISR != NULL)
{
hi2c->XferISR(hi2c, itflags, itsources);
}
}
The IT flags seems not to be cleared and the hi2c->XferISR register seems to be NULL :
Edit 1 : Some additional informations : The following functions are never called.
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
I tried to clear I2C_FLAG_TXE & I2C_FLAG_TXIS but it's seems not possible.
Edit 2 : To answer some questions in comment :
The init code is well passed :
Status I2C_Init(I2C_HandleTypeDef *hi2c)
{
// Peripheral Clock Enable
__HAL_RCC_I2C1_CLK_ENABLE();
hi2c->Instance = I2C1;
hi2c->Init.Timing = 0x10909CEC;
hi2c->Init.OwnAddress1 = 0;
hi2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c->Init.OwnAddress2 = 0;
hi2c->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
// Interrupts Activation
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
if (HAL_I2C_Init(hi2c) != HAL_OK)
{
return STATUS_ERROR;
}
return STATUS_OK;
}
There is no bus activity on scope.