cancel
Showing results for 
Search instead for 
Did you mean: 

I2C blocking function fails to output the expected outputs

JTurn.2
Senior

I'm currently trying to learn about how the HAL blocking functions of I2C works on the STM32H7B3I-DK. However, the master device fails to receive any data unless HAL_I2C_Master_Transmit() is called before it.

For example, the following code doesn't produce an output even though it should print out "Hi" in the master device:

Master code:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C4_Init();
  MX_USART1_UART_Init();
  uint16_t DevAddress= (0x10 << 1);
  HAL_Delay(100);
  char Data[30];
  HAL_I2C_Master_Receive (&hi2c4, DevAddress, (uint8_t *)Data, strlen(Data), 100);
  HAL_UART_Transmit(&huart1,(uint8_t *)Data,strlen(Data),100);
 
  while (1)
  {
 
  }
}

Slave code:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C4_Init();
  MX_USART1_UART_Init();
  HAL_Delay(100);
  char Data[30]="Hi\r\n";
  HAL_I2C_Slave_Transmit(&hi2c4, (uint8_t *)Data, strlen(Data),  100);
  while (1)
  {
    
  }
}

But when I change the code to the below, the master does print out "Hi". But the problem is, it also prints out "Hello" and some garbage characters which is the data it sends to the slave device. Shouldn't the master device just print out "Hi"?

Master code:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C4_Init();
  MX_USART1_UART_Init();
  uint16_t DevAddress= (0x10 << 1);  
  char pData[30]="Hello\r\n";
  HAL_I2C_Master_Transmit (&hi2c4, DevAddress, (uint8_t *)pData, strlen(pData), 100);
  HAL_Delay(100);
  char Data[30];
  HAL_I2C_Master_Receive (&hi2c4, DevAddress, (uint8_t *)Data, strlen(Data), 100);
  HAL_UART_Transmit(&huart1,(uint8_t *)Data,strlen(Data),100);
 
  while (1)
  {
 
  }
}

slave code:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C4_Init();
  MX_USART1_UART_Init();
  char pData[30];
  HAL_I2C_Slave_Receive(&hi2c4, (uint8_t *)pData, sizeof(pData),  100);
  HAL_UART_Transmit(&huart1,(uint8_t *)pData,strlen(pData),100);
  HAL_Delay(100);
  char Data[30]="Hi\r\n";
  HAL_I2C_Slave_Transmit(&hi2c4, (uint8_t *)Data, strlen(Data),  100);
  while (1)
  {
 
  }
}

Here are the I2C configurations I am using:

Master:

static 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 = 0x00303D5B;
  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 */
 
}

slave:

static 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 = 0x00303D5B;
  hi2c4.Init.OwnAddress1 = 32;
  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 */
 
}

Thank you for clearing up my confusion!

0 REPLIES 0