How can I read data from an I2C temperature sensor (TMP102) using an STM32 microcontroller?
Good day guys, how can I read data from an I2C temperature sensor (TMP102) using an STM32 microcontroller? I am encountering the error
@Middleware & OS @Helper
Failed to read from the I2C bus: Remote I/O error despite confirming that the sensor is powered and the I2C connections are correctly set up. Here is my current code snippet, which attempts to read 10 bytes of data from the sensor:@Middleware & OS @Helper
Solution
Try this code instead
#include "stm32f1xx_hal.h"
I2C_HandleTypeDef hi2c1;
#define TMP102_ADDR (0x48 << 1) // TMP102 default address (0x48) shifted for HAL functions
#define TEMP_REG 0x00 // Temperature register address
uint8_t buffer[2];
void TMP102_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
Error_Handler();
}
}
float TMP102_ReadTemperature(void) {
uint8_t reg = TEMP_REG;
float temperature = 0.0;
if (HAL_I2C_Master_Transmit(&hi2c1, TMP102_ADDR, ®, 1, HAL_MAX_DELAY) != HAL_OK) {
Error_Handler();
}
if (HAL_I2C_Master_Receive(&hi2c1, TMP102_ADDR, buffer, 2, HAL_MAX_DELAY) != HAL_OK) {
Error_Handler();
}
int16_t rawTemp = (buffer[0] << 8) | buffer[1];
rawTemp >>= 4;
temperature = rawTemp * 0.0625;
return temperature;
}
void Error_Handler(void) {
while(1);
}
int main(void) {
HAL_Init();
TMP102_Init();
while (1) {
float temperature = TMP102_ReadTemperature();
HAL_Delay(1000);
}
}
#include "stm32f1xx_hal.h"
I2C_HandleTypeDef hi2c1;
#define TMP102_ADDR (0x48 << 1) // TMP102 default address (0x48) shifted for HAL functions
#define TEMP_REG 0x00 // Temperature register address
uint8_t buffer[2];
void TMP102_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
Error_Handler();
}
}
float TMP102_ReadTemperature(void) {
uint8_t reg = TEMP_REG;
float temperature = 0.0;
if (HAL_I2C_Master_Transmit(&hi2c1, TMP102_ADDR, ®, 1, HAL_MAX_DELAY) != HAL_OK) {
Error_Handler();
}
if (HAL_I2C_Master_Receive(&hi2c1, TMP102_ADDR, buffer, 2, HAL_MAX_DELAY) != HAL_OK) {
Error_Handler();
}
int16_t rawTemp = (buffer[0] << 8) | buffer[1];
rawTemp >>= 4;
temperature = rawTemp * 0.0625;
return temperature;
}
void Error_Handler(void) {
while(1);
}
int main(void) {
HAL_Init();
TMP102_Init();
while (1) {
float temperature = TMP102_ReadTemperature();
HAL_Delay(1000);
}
}