c - 如何使用 STM32 HAL I2C 从 PCT2075 获取温度

标签 c stm32 i2c

我想使用 STM32 HAL I2C 从 PCT2075 获取温度。 即使我使用 HAL_I2C_Mem_Read() 函数,也只有我可以看到 HAL ERROR 状态。

我也很困惑我可以使用什么作为从属地址。 在数据表中,从机地址是1001 000。那么我应该将从机地址写为0x48或(0x48<<1)?

我还有一个问题。 当我将I2C中的GPIO引脚配置为PULLUP时,是不需要在电路中放置PUll上拉电阻吗?我知道GPIOS引脚有内部上拉电阻。

最后,我应该在获取温度之前将配置数据发送到从站吗? https://www.nxp.com/docs/en/data-sheet/PCT2075.pdf 老实说,我不知道如何准确阅读数据表。

static void MX_I2C1_Init(void)
{
  /* USER CODE END I2C1_Init 1 */
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 400000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0x48;
  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 */
}

main()
{
retVal = HAL_I2C_Master_Transmit(&hi2c1, slave_addr, &send, I2C_MEMADD_SIZE_8BIT, 500);

retVal = HAL_I2C_Mem_Read(&hi2c1, slave_addr, 0x00u, I2C_MEMADD_SIZE_16BIT, &TempReadBuffer[0], 16, 500);
retVal = HAL_I2C_Mem_Read(&hi2c1, slave_addr, 0x00u, I2C_MEMADD_SIZE_16BIT, &TempReadBuffer[0], 16, 500);
}

retVal = HALL_ERROR

最佳答案

遵循数据表中的图 12。

1) 首先发送从机地址为0(用于写操作)。从地址变为1001 0000

2) 发送指针地址 - 对于温度,它是 0000 0000。(参见第 10 页)

3) 再次发送从机地址,1表示读操作。从地址变为 1001 0001

4) 现在您可以读取设备的温度寄存器了。

关于c - 如何使用 STM32 HAL I2C 从 PCT2075 获取温度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57882537/

相关文章:

stm32 - 如何保护stm32f10x的读flash

c++ - C i2c芯片读取MCP9800突然开始失败

c - 双后增量的结果 - 在 if 语句及其主体中

c - 警告 : linux kernel module functions undefined

c - 加载简单内核模块时出现可疑返回码

c - ARM Cortex M4 处理器中耗时的测试 C 代码中出现错误 SEGV

c - STM32 HAL GPIO中断计数太多

arduino - 我无法让 DS3231 RTC 工作

arduino - WeMos D1 Mini (ESP8266) I2C 从模式不接收任何传入数据

将二进制补码转换为符号数值