cancel
Showing results for 
Search instead for 
Did you mean: 

Stm32h743ii 2 i2c independant bus

KNaim.1
Associate III

 

Dear all;

 

I have a *** question but it dont work can we have quantity 2 different i2c bus 
1 is reconized but not the second bus

 

 /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LTDC_Init();
  MX_QUADSPI_Init();
  MX_FMC_Init();
  MX_I2C2_Init();
  MX_I2C4_Init();
  MX_SPI1_Init();
  MX_UART4_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();
  MX_DMA2D_Init();
  /* USER CODE BEGIN 2 */

  int P=10000;

   HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
   //htim3.Instance->CCR1=50;
   __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4, P);



  HAL_StatusTypeDef result;
   	uint8_t i;
   	for (i=1; i<128; i++)
   	{

   	  /* * the HAL wants a left aligned i2c address
   	   * &hi2c1 is the handle
   	   * (uint16_t)(i<<1) is the i2c address left aligned
   	   * retries 2
   	   * timeout 2*/

   		//ret = HAL_I2C_IsDeviceReady(&hi2c2, (uint16_t)(i<<1), 3, 5);

   	  result = HAL_I2C_IsDeviceReady(&hi2c2, (uint16_t)(i<<1), 3, 5);
   	  if (result != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT
   	  {
   		  printf("."); // No ACK received at that address
   	  }
   	  if (result == HAL_OK)
   	  {
   		  printf("0x%X", i); // Received an ACK at that address
   	  }
   	}
   	printf("\r\n");

   	HAL_StatusTypeDef result2;
   	   	uint8_t z;
   	   	for (z=1; z<128; z++)
   	   	{

   	   	   /** the HAL wants a left aligned i2c address
   	   	   * &hi2c1 is the handle
   	   	   * (uint16_t)(i<<1) is the i2c address left aligned
   	   	   * retries 2
   	   	   * timeout 2
*/
   	   		//ret = HAL_I2C_IsDeviceReady(&hi2c2, (uint16_t)(i<<1), 3, 5);

   	   	  result2 = HAL_I2C_IsDeviceReady(&hi2c4, (uint16_t)(z<<1), 3, 5);
   	   	  if (result2 != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT
   	   	  {
   	   		  printf("."); // No ACK received at that address
   	   	  }
   	   	  if (result2 == HAL_OK)
   	   	  {
   	   		  printf("0x%X", z); // Received an ACK at that address
   	   	  }
   	   	}
   	   	printf("\r\n");
6 REPLIES 6
TDK
Super User

Common issues with I2C:

  • Missing pullup resistors. Pullup should generally be in the 1-4.7 kOhm range.
  • Incorrect wiring.
  • Incorrect drive voltage--ensure VDD is compatible between the two.
  • Slave is holding SDA low due to previously interrupt communication. Power cycling can fix.

If you have a logic analyzer, look at SDA/SCL signals.

If you feel a post has answered your question, please click "Accept as Solution".

What might help is the initialization code, and a schematic/wiring diagram or exactly what you've built.

What device is connected to I2C4 ? What address is it supposed to respond at ?

Is the issue with the Slave or the Master? You're just showing code probing the address space.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Thanks for reply That 's really strange i dont understand it's not the first time that occur 
It's a compile error :

#include "i2c.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

I2C_HandleTypeDef hi2c2;
I2C_HandleTypeDef hi2c4;

/* 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.Timing = 0x009034B6;
  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();
  }

  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C2_Init 2 */

  /* USER CODE END I2C2_Init 2 */

}
/* I2C4 init function */
void MX_I2C4_Init(void)
{

  /* USER CODE BEGIN I2C4_Init 0 */

  /* USER CODE END I2C4_Init 0 */

  /* USER CODE BEGIN I2C4_Init 1 */

  /* USER CODE END I2C4_Init 1 */
  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x009034B6;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c4.Init.OwnAddress2 = 0;
  hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c4) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c4, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c4, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C4_Init 2 */

  /* USER CODE END I2C4_Init 2 */

}

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(i2cHandle->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */

  /* USER CODE END I2C2_MspInit 0 */

  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C2;
    PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_RCC_GPIOH_CLK_ENABLE();
    /**I2C2 GPIO Configuration
    PH4     ------> I2C2_SCL
    PH5     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

    /* I2C2 clock enable */
    __HAL_RCC_I2C2_CLK_ENABLE();
  /* USER CODE BEGIN I2C2_MspInit 1 */

  /* USER CODE END I2C2_MspInit 1 */
  }
  else if(i2cHandle->Instance==I2C4)
  {
  /* USER CODE BEGIN I2C4_MspInit 0 */

  /* USER CODE END I2C4_MspInit 0 */

  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C4;
    PeriphClkInitStruct.I2c4ClockSelection = RCC_I2C4CLKSOURCE_D3PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**I2C4 GPIO Configuration
    PD12     ------> I2C4_SCL
    PD13     ------> I2C4_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    /* I2C4 clock enable */
    __HAL_RCC_I2C4_CLK_ENABLE();
  /* USER CODE BEGIN I2C4_MspInit 1 */

  /* USER CODE END I2C4_MspInit 1 */
  }
}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{

  if(i2cHandle->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspDeInit 0 */

  /* USER CODE END I2C2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_I2C2_CLK_DISABLE();

    /**I2C2 GPIO Configuration
    PH4     ------> I2C2_SCL
    PH5     ------> I2C2_SDA
    */
    HAL_GPIO_DeInit(GPIOH, GPIO_PIN_4);

    HAL_GPIO_DeInit(GPIOH, GPIO_PIN_5);

  /* USER CODE BEGIN I2C2_MspDeInit 1 */

  /* USER CODE END I2C2_MspDeInit 1 */
  }
  else if(i2cHandle->Instance==I2C4)
  {
  /* USER CODE BEGIN I2C4_MspDeInit 0 */

  /* USER CODE END I2C4_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_I2C4_CLK_DISABLE();

    /**I2C4 GPIO Configuration
    PD12     ------> I2C4_SCL
    PD13     ------> I2C4_SDA
    */
    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_12);

    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_13);

  /* USER CODE BEGIN I2C4_MspDeInit 1 */

  /* USER CODE END I2C4_MspDeInit 1 */
  }
}

here is the error:

09:10:33 **** Incremental Build of configuration Debug for project STM32h743_i2cscan ****
make -j24 all 
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m7 -std=gnu11 -g3 -DDEBUG -DUSE_PWR_LDO_SUPPLY -DUSE_HAL_DRIVER -DSTM32H743xx -c -I../Core/Inc -I../Drivers/STM32H7xx_HAL_Driver/Inc -I../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32H7xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -o "Core/Src/main.o"
../Core/Src/main.c: In function 'main':
../Core/Src/main.c:134:3: warning: implicit declaration of function 'MX_I2C4_Init'; did you mean 'MX_I2C2_Init'? [-Wimplicit-function-declaration]
  134 |   MX_I2C4_Init();
      |   ^~~~~~~~~~~~
      |   MX_I2C2_Init
../Core/Src/main.c:188:52: error: 'hi2c4' undeclared (first use in this function); did you mean 'hi2c2'?
  188 |                   result2 = HAL_I2C_IsDeviceReady(&hi2c4, (uint16_t)(z<<1), 3, 5);
      |                                                    ^~~~~
      |                                                    hi2c2
../Core/Src/main.c:188:52: note: each undeclared identifier is reported only once for each function it appears in
../Core/Src/main.c:199:23: warning: implicit declaration of function 'SDRAM_InitSequence' [-Wimplicit-function-declaration]
  199 |                       SDRAM_InitSequence();
      |                       ^~~~~~~~~~~~~~~~~~
make: *** [Core/Src/subdir.mk:67: Core/Src/main.o] Error 1
"make -j24 all" terminated with exit code 2. Build might be incomplete.

09:10:34 Build Failed. 2 errors, 2 warnings. (took 611ms)

I don't understand why Hal inicialise the first i2c and not i2c4

Pavel A.
Super User

It looks like the source files that are compiled are out of sync with what you see in the IDE.

Make sure all files are saved, then refresh (F5).

 

 

It's like you've split the code into different files, and main.c has no reference too the instances or functions.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..