如何使用 STM32 HAL I2C 从 PCT2075 获取温度
How do I use STM32 HAL I2C to get Temperature from PCT2075
我想通过使用 STM32 HAL I2C 从 PCT2075 获取温度。
即使我正在使用 HAL_I2C_Mem_Read() 函数,也只有我能看到 HAL ERROR 状态。
我也很困惑我可以使用什么作为从属地址。
在数据sheet中,slave address是1001 000,那我应该把slave address写成0x48还是(0x48<<1)?
我还有一个问题。
当我在I2C中配置GPIO引脚为PULLUP时,是不是不需要在电路中放上拉电阻?我知道GPIOS管脚内部有上拉电阻。
最后,我是否应该在获取温度之前将配置数据发送到从机。
https://www.nxp.com/docs/en/data-sheet/PCT2075.pdf
老实说,我不知道如何准确读取数据sheet。
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) 再次发送slave地址,1表示读操作。从机地址变为 1001 0001
4) 现在可以读取设备的温度寄存器了
我想通过使用 STM32 HAL I2C 从 PCT2075 获取温度。 即使我正在使用 HAL_I2C_Mem_Read() 函数,也只有我能看到 HAL ERROR 状态。
我也很困惑我可以使用什么作为从属地址。 在数据sheet中,slave address是1001 000,那我应该把slave address写成0x48还是(0x48<<1)?
我还有一个问题。 当我在I2C中配置GPIO引脚为PULLUP时,是不是不需要在电路中放上拉电阻?我知道GPIOS管脚内部有上拉电阻。
最后,我是否应该在获取温度之前将配置数据发送到从机。 https://www.nxp.com/docs/en/data-sheet/PCT2075.pdf 老实说,我不知道如何准确读取数据sheet。
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) 再次发送slave地址,1表示读操作。从机地址变为 1001 0001
4) 现在可以读取设备的温度寄存器了