STM32开发记录三: 硬件IIC调试(STHC3温湿度传感器)

2023-05-16

一、STM32_CubeMX配置

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

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

  hi2c4.Instance = I2C4;
  hi2c4.Init.Timing = 0x20A0C4DF;
  hi2c4.Init.OwnAddress1 = 0;
  hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_ENABLE;
  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();
  }

}




void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(i2cHandle->Instance==I2C3)
  {
  /* USER CODE BEGIN I2C3_MspInit 0 */

  /* USER CODE END I2C3_MspInit 0 */

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**I2C3 GPIO Configuration
    PC8     ------> I2C3_SCL
    PC9     ------> I2C3_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_I2C3;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* I2C3 clock enable */
    __HAL_RCC_I2C3_CLK_ENABLE();
  /* USER CODE BEGIN I2C3_MspInit 1 */

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

  /* USER CODE END I2C4_MspInit 0 */

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**I2C4 GPIO Configuration
    PC6     ------> I2C4_SCL
    PC7     ------> I2C4_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_I2C4;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

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

  /* USER CODE END I2C4_MspInit 1 */
  }
}

 二、测试源码

#define SHTC3_ADDR					(0x70)
#define SHTC3_CMD_DEV_WRITE 		(0xE0)		//(SHTC3_ADDR<<1)
#define SHTC3_CMD_DEV_READ			(0xE1)		//((SHTC3_ADDR<<1)|0x01)
#define SHTC3_CMD_SOFT_RESET		0x805D		//软件复位命令
#define SHTC3_CMD_READ_ID			0xEFC8		//读取SHTC3 ID命令
#define SHTC3_CMD_WAKEUP			0x3517
#define SHTC3_CMD_READ_HUM_DATA 	0x5c24
#define SHTC3_CMD_READ_TEMP_DATA	0x7866
#define SHTC3_CMD_READ_SLEEP		0xB098
typedef struct
{
	uint8_t HumidityMSB;
	uint8_t HumidityLSB;
	uint8_t HumidityCRC;

	uint8_t temperatureMSB;
	uint8_t temperatureLSB;
	uint8_t temperatureCRC;
}Sthc3MeasureData;

uint8_t Sthc3WriteByte(uint16_t Cmd)
{
	uint8_t WriteCmd[2];
	WriteCmd[0] = (uint8_t)(Cmd>>8);
	WriteCmd[1] = (uint8_t)(Cmd);

	if(HAL_I2C_Master_Transmit(&hi2c4, (uint16_t)SHTC3_CMD_DEV_WRITE , (uint8_t*)&WriteCmd, sizeof(WriteCmd), 1000) != HAL_OK)
	{
		Error_Handler();
		printf("err (L=%d)\n", __LINE__);
	}

	while (HAL_I2C_GetState(&hi2c4) != HAL_I2C_STATE_READY);
	return 0;
}

uint16_t Sthc3ReadWord(uint16_t Cmd)
{
	uint8_t WriteCmd[2];
	uint16_t ReadData;
	
	WriteCmd[0] = (uint8_t)(Cmd>>8);
	WriteCmd[1] = (uint8_t)(Cmd);
	
	
	if(HAL_I2C_Master_Transmit(&hi2c4, (uint16_t)SHTC3_CMD_DEV_WRITE , (uint8_t*)WriteCmd,  sizeof(WriteCmd), 1000) != HAL_OK) 
	{
		Error_Handler();
	}

	while (HAL_I2C_GetState(&hi2c4) != HAL_I2C_STATE_READY);

	if(HAL_I2C_Master_Receive(&hi2c4, SHTC3_CMD_DEV_READ , (uint8_t*)&ReadData, 2, 1000) != HAL_OK) //接收word数据
	{
		Error_Handler();
	}
	return ReadData;
}


void Sthc3ReadHumiAndTemp(void)
{
	uint8_t WriteCmd[2];
	float hum,temp;
	Sthc3MeasureData Sthc3Data = {0};
	uint8_t HumValue, TempValue;

	
	WriteCmd[0] = (uint8_t)(SHTC3_CMD_READ_HUM_DATA>>8);
	WriteCmd[1] = (uint8_t)(SHTC3_CMD_READ_HUM_DATA);

	if(HAL_I2C_Master_Transmit(&hi2c4, SHTC3_CMD_DEV_WRITE , (uint8_t*)WriteCmd,  sizeof(WriteCmd), 1000) != HAL_OK) 
	{
		Error_Handler();
	}

	
	HAL_I2C_Master_Receive(&hi2c4, SHTC3_CMD_DEV_READ, (uint8_t *)&Sthc3Data, sizeof(Sthc3Data), 1000);

	hum = (Sthc3Data.HumidityMSB << 8)|(Sthc3Data.HumidityLSB);
	temp = (Sthc3Data.temperatureMSB << 8 )|Sthc3Data.temperatureLSB;
	HumValue = (uint8_t)(100*((float)hum/65535));				//湿度
	TempValue = (uint8_t)((175*((float)temp/65535)) - 45);		//温度

	printf("\nH:%d, T=%d\n", HumValue, TempValue);
}

void Sthc3SensorI2cReadTask(void *argument)
{
	uint16_t DevID = 0;
	uint16_t ReadData = 0;

	Sthc3WriteByte(SHTC3_CMD_WAKEUP);
	HAL_Delay(1000);


	ReadData = Sthc3ReadWord(SHTC3_CMD_READ_ID);
	DevID = (ReadData<<8)|ReadData>>8;

	printf("\n(0x%04x)ID=0x%04x\n", DevID, DevID&0x083F);
	for(;;)
	{
		Sthc3ReadHumiAndTemp();
		vTaskDelay(1000/portTICK_RATE_MS);	
	}
}

逻辑分析仪抓取波形:

 ​​​​​​​

 结论:

        1、接上从机传感器之后,CLK,  SDA电平被拉低。查看发现调试板子上拉硬件为10K,于是改为4.7K,拉低问题同样存在。重新换了从机电平信号正常,但数据结尾是NAK。

         2、再查看PCB图,发现硬件CLK,SDA两个pin脚顺序错误,交换后读取设备ID正常。

         3、源码参考如下:

              xiaoshubaoVIP/STM32G473_Code: STM32G473测试code (github.com)

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32开发记录三: 硬件IIC调试(STHC3温湿度传感器) 的相关文章

  • 来自IT公司速查手册的各大IT公司薪资和待遇内幕

    来自IT公司速查手册的各大IT公司薪资和待遇内幕 xff08 转载于 http xuchaoyi99 cnblogs com xff09 编号 1 杭州 诺基亚 2 南京 趋势科技 Trend 3 北京 联想 xff08 北京 xff09
  • GCC中SIMD指令的应用方法

    X86架构上的多媒体应用开发 xff0c 如果能够使用SIMD指令进行优化 xff0c 性能将大大提高 目前 xff0c IA 32的SIMD指令包括MMX xff0c SSE xff0c SSE2等几级 在GCC的开发环境中 xff0c
  • ffmpeg mplayer x264 代码重点详解 详细分析

    ffmpeg和mplayer中求平均值得方法 1 ordinary c language level define avg2 a b a 43 b 43 1 gt gt 1 define avg4 a b c d a 43 b 43 c 4
  • 基于Region Proposal的深度学习目标检测简述

    转载链接 开篇需要跟大家道歉 xff0c 一切忙没时间的理由都是借口 xff0c 实际上就是偷懒了 xff0c 这么久才更新 xff0c 非常抱歉 xff01 本篇争取以最简明的叙述 xff0c 帮助大家理解下基于Region Propos
  • 3D电视,你知道多少?

    1 3D电视常见知识 系统概述篇 1 什么是3D电视 xff1f 答 xff1a 3D电视是一种能够模拟实际景物的真实空间关系的新型电视 xff0c 它利用人眼的视觉特性产生立体感 xff0c 让观众感受到观看的影像是具有深度特性的三维立体
  • 程序员成熟的标志《程序员成长路线图:从入门到优秀》

    对好书进行整理 xff0c 把好内容共享 我见证过许多的程序员的成长 xff0c 他们很多人在进入成熟期之后 xff0c 技术上相对较高 xff0c 一般项目开发起来比较自信 xff0c 没有什么太大的困难 xff0c 有的职位上也有所提升
  • 前端工程师的价值体现在哪里?

    这是一个很老的话题 前端工程师的价值体现在哪里 xff1f 有人说 xff1a 前端工程师之于网站的价值犹如化妆师之于明星的价值 一位好的Web前端开发工程师在知识体系上既要有广度 xff0c 又要有深度 当然 xff0c Web前端工程师
  • 设计公共API的六个注意事项

    摘要 xff1a 俗话说 xff1a 好东西就要贡献出来和大家一起分享 xff0c 尤其是在互联网业务高度发达的今天 xff0c 如果你的创业公司提供了一项很酷的技术或者服务 xff0c 并且其他用户也非常喜欢该产品 xff0c 在这种情况
  • 从工具的奴隶到工具的主人

    摘要 xff1a 我们每个人都是工具的奴隶 随着我们的学习 xff0c 我们不断的加深自己对工具的认识 xff0c 从而从它们里面解脱出来 现在我就来说一下我作为各种工具的奴隶 xff0c 以及逐渐摆脱它们的思想控制的历史吧 当我高中毕业进
  • C语言 常用API

    MySQL的C语言API接口 1 首先当然是连接数据库 xff0c 函数原型如下 xff1a MYSQL STDCALL mysql real connect MYSQL mysql const char host const char u
  • linux下的C语言开发

    linux下的C语言开发 xff08 开篇 xff09 在很多人的眼里 xff0c C语言和linux常常是分不开的 这其中的原因很多 xff0c 其中最重要的一部分我认为是linux本身就是C语言的杰出作品 当然 xff0c linux操
  • C读写ini文件

    read write ini file with c function 64 file testini c chinayaosir blog http blog csdn net chinayaosir connect ini databa
  • 职场必知的20条黄金法则

    时间紧张 xff0c 先记一笔 xff0c 后续优化与完善 1 办公室里只有两种人 xff0c 角主和龙套 职场上 xff0c 想要过的省力 xff0c 不想往上爬 xff0c 那就只能做一生的龙套 作龙套的处坏就是 xff1a 死送你先去
  • 检测是浏览器还是手机,需求为是否支持FLASH,此文为检测是否支持FLASH的代码(含demo下载)

    步骤 xff1a 1 导入swfobject js文件 2 写一个函数 3 在需要用的地方调用方法 xff0c 此处为页面加载时调用 以下为示例代码 xff1a Java代码 lt script src 61 34 Public js sw
  • Jetson NX安装opencv3.2.0报错及问题汇总

    先放一个完整的cmake命令 cmake D CMAKE BUILD TYPE 61 Release D ENABLE PRECOMPILED HEADERS 61 OFF D CMAKE EXE LINKER FLAGS 61 lcbla
  • Ubuntu16.04环境下安装python3.8

    一 首先下载安装包 xff1a python官网 xff1a https www python org downloads 下载相应版本的python xff0c 如下图所示为Linux版本的安装包 二 配置依赖环境 xff0c 如果不进行
  • 超好用的网站推荐(持续更新)

    1 在线学习 1 1 网课学习 网易公开课 链接 xff1a https open 163 com 中国大学MOOC 链接 xff1a https www icourse163 org 哔哩哔哩 链接 xff1a https www bil
  • ROS基础篇(五)-- C++如何实现Topic & Service(roscpp)

    文章目录 1 Client library与roscpp1 1 Client Library简介1 2 roscpp 2 节点初始化 关闭与NodeHandle3 Topic in roscpp3 1 Topic通信3 2 创建Person
  • ROS基础篇(一)-- 最新学习路线,快从这里开始

    资料目录 ROS官网必看资料Diego Robot系列机器人开发目录古月居大神专栏创客智造系列博客文字补充 ROS官网必看资料 学习ros在查看国内相关资料的同时 xff0c 一定要学会首先翻看官网英文文档 xff0c 尤其是教程 Code
  • Git基础篇(二)-- Git安装与配置

    文章目录 1 下载与安装2 Git配置2 1 初始配置2 2 Git项目搭建 3 和服务器同步3 1 GitHub3 2 Gitee 参考 1 下载与安装 1 下载 打开 Git 官网 xff0c 下载 Git 对应操作系统的版本 xff0

随机推荐