2021-10-04 1:40 AM
Hello,
I am working with a costumer board using STM32F105. There are some LED drivers working I2C1 and I2c2.
Configuration for serial interfaces is:
void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
/* USER CODE END I2C1_Init 2 */
}
/* I2C2 init function */
void MX_I2C2_Init(void)
{
/* USER CODE BEGIN I2C2_Init 0 */
/* USER CODE END I2C2_Init 0 */
/* USER CODE BEGIN I2C2_Init 1 */
/* USER CODE END I2C2_Init 1 */
hi2c2.Instance = I2C2;
hi2c2.Init.ClockSpeed = 100000;
hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c2.Init.OwnAddress1 = 0;
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C2_Init 2 */
/* USER CODE END I2C2_Init 2 */
}
HW connections should be correct, because I am able to turn all LEDs which they configured in I2C1 and I2C2. But after some tries, I miss I2C1 and ErrorCode 32 (Timeout error) show up.
For I2C1, the errorcode is 32, and for I2C2 there is no error.
I am using 10ms for timeout for both I2C's, and it doesn't help if I put more timeout.
I am using following function to write the value on serial interface with related data:
void WriteRegister(HandleTypeDef* handle, uint8_t register_address, uint8_t value)
{
uint8_t buf[2];
buf[0] = register_address;
buf[1] = value;
HAL_I2C_Master_Transmit(handle->Init.I2C_Bus, handle->Init.I2C_Device_Address, buf, 2, handle->Init.I2C_Transmit_Timeout_Milliseconds);
}
Any idea?
Thank you.
Solved! Go to Solution.
2021-10-13 2:00 AM
Thank you @TDK and @Amel NASRI .
Some HW issues have been found for the LED drivers circuit. It seems to be work fine now. I need to test with other prototypes as well.
2021-10-04 6:01 AM
Sounds like a hardware issue.
Which line within HAL_I2C_Master_Transmit produces the timeout?
Do you have a logic analyzer to show the SDA/SCL lines?
Are there pullups on both lines?
2021-10-13 1:53 AM
Hi @NASI ,
Besides to proposals from @TDK , I suggest you to have a look to the product errata sheet.
Several known limitations on the I2C of STM32F1 are described on this document.
-Amel
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2021-10-13 2:00 AM
Thank you @TDK and @Amel NASRI .
Some HW issues have been found for the LED drivers circuit. It seems to be work fine now. I need to test with other prototypes as well.
2021-10-13 2:23 AM
Good to know that you identified the root cause of your issue.
I mark your reply as best answer. In case you have new questions, don't hesitate to create new inputs.
-Amel
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.