cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H743BI, I2C becomes busy after two hours or five hours randomly. Some times there is no issue.

Anand A
Associate III

We are using I2C channel 1 for EEPROM and RTC (Semophore used for exclusive access) and I2C channel 2 for Touch controller. Both I2C runs at 400KHz. Everything works normally, Suddenly I2C channel 1 becomes busy at random time. It is really hard to reproduce this issue. We have captured I2C channel 1 data in Logic analyzer during problem scenario. What we observe is both data and clock line goes low and in ISR register BUSY flag is SET. Refer attached logic analyzer output image.

Is there any reason for this behavior?

I2C configuration code given below.

static void MX_I2C1_Init(void)

{

 hi2c1.Instance = I2C1;

 hi2c1.Init.Timing = 0x00901954;;

 hi2c1.Init.OwnAddress1 = 0;

 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

 hi2c1.Init.OwnAddress2 = 0;

 hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;

 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

 if (HAL_I2C_Init(&hi2c1) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

   /**Configure Analogue filter

   */

 if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

   /**Configure Digital filter

   */

 if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

}

/* I2C1 init function */

static void MX_I2C2_Init(void)

{

 hi2c2.Instance = I2C2;

 hi2c2.Init.Timing = 0x00901954;

 hi2c2.Init.OwnAddress1 = 0;

 hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

 hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

 hi2c2.Init.OwnAddress2 = 0;

 hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;

 hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

 hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

 if (HAL_I2C_Init(&hi2c2) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

   /**Configure Analogue filter

   */

 if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

   /**Configure Digital filter

   */

 if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)

 {

   //_Error_Handler(__FILE__, __LINE__);

 }

}

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{

 GPIO_InitTypeDef GPIO_InitStruct;

 if(hi2c->Instance==I2C1)

 {

   /**I2C1 GPIO Configuration   

   H7

   PB6    ------> I2C1_SCL

   PB7    ------> I2C1_SDA

   */

   GPIO_InitStruct.Pin = I2C_SCL_Pin|I2C_SDA_Pin;

   GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

   GPIO_InitStruct.Pull = GPIO_PULLUP;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

   GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

   /* Peripheral clock enable */

   __HAL_RCC_I2C1_CLK_ENABLE();

 }

 else if(hi2c->Instance == I2C2)

 {

   /**I2C2 GPIO Configuration   

   H7

   PH4    ------> I2C2_SDA

   PH5    ------> I2C2_SCL

   */

   GPIO_InitStruct.Pin = TOUCH_SDA_Pin;

   GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

   GPIO_InitStruct.Pull = GPIO_PULLUP;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

   GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

   HAL_GPIO_Init(TOUCH_SDA_GPIO_Port, &GPIO_InitStruct);

   GPIO_InitStruct.Pin = TOUCH_SCL_Pin;

   GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

   GPIO_InitStruct.Pull = GPIO_PULLUP;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

   GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

   HAL_GPIO_Init(TOUCH_SCL_GPIO_Port, &GPIO_InitStruct);

   /* I2C2 clock enable */

   __HAL_RCC_I2C2_CLK_ENABLE();

 /* USER CODE BEGIN I2C2_MspInit 1 */

 }

}

0 REPLIES 0