I2C Code with STM32F4/F7/H7(Sensor ID:0x58)
Sensor_0x58.H
/**
******************************************************************************
* @file Sensor_0x58.h
* @brief Generic driver for sensors with I2C address 0x58
* @version V2.0
* @date 2025-07-19
* @note Supports all Sencoch sensors with I2C address 0x58
* Based on STM32F4xx/F7xx/H7xx Standard Peripheral Library
******************************************************************************
*/
#ifndef __SENSOR_0X58_H
#define __SENSOR_0X58_H
#include "myiic.h"
#include "main.h"
/*============================================================================*/
/* Sensor I2C Configuration */
/*============================================================================*/
#define SENSOR_I2C_ADDR 0x58
#define SENSOR_REG_DATA 0x04
#define SENSOR_REG_EOF 0x20
#define SENSOR_REG_SHIFT 0x21
/*============================================================================*/
/* Sensor Parameters */
/*============================================================================*/
/*
* NOTE: Modify PMIN and PMAX according to your specific sensor model
*
* Common Ranges for I2C ADD 0x58 Sensors (unit: Pa):
* 0 ~ 0.5kPa: PMIN = 0.0f, PMAX = 500.0f
* 0 ~ 5kPa: PMIN = 0.0f, PMAX = 5000.0f
* 0 ~ 1000kPa: PMIN = 0.0f, PMAX = 1000000.0f
* -1 ~ 1kPa: PMIN = -1000.0f, PMAX = 1000.0f
* -5 ~ 5kPa: PMIN = -5000.0f, PMAX = 5000.0f
* -100 ~ 100kPa: PMIN = -100000.0f, PMAX = 100000.0f
*/
#define PMIN -100000.0f
#define PMAX 100000.0f
/*============================================================================*/
/* Data Structure */
/*============================================================================*/
typedef struct {
uint8_t pressure_data[5];
int32_t pressure_AD;
int16_t temperature_AD;
uint8_t temp_calib_offset_code;
uint8_t temp_calib_gain_exp;
int16_t eof_out;
float shift_n;
float pressure;
float temperature;
} SensorData;
/*============================================================================*/
/* Function Prototypes */
/*============================================================================*/
void Sensor_Init(void);
uint8_t Sensor_ReadData(SensorData *sensor_data);
#endif /* __SENSOR_0X58_H */
Sensor_0x58.c
/**
******************************************************************************
* @file Sensor_0x58.c
* @brief Generic driver for sensors with I2C address 0x58
* @version V2.0
* @date 2025-07-19
* @note Supports all Sencoch sensors with I2C address 0x58
* Based on STM32F4xx/F7xx/H7xx Standard Peripheral Library
******************************************************************************
*/
#include "Sensor_0x58.h"
#include "usart.h"
#include <math.h>
/*============================================================================*/
/* Private Functions */
/*============================================================================*/
static uint8_t Sensor_ReadCalibration(SensorData *sensor_data)
{
sensor_data->temp_calib_offset_code = i2c_read(SENSOR_I2C_ADDR, SENSOR_REG_EOF);
sensor_data->temp_calib_gain_exp = i2c_read(SENSOR_I2C_ADDR, SENSOR_REG_SHIFT);
if (sensor_data->temp_calib_offset_code == FAILED ||
sensor_data->temp_calib_gain_exp == FAILED) {
return FAILED;
}
switch (sensor_data->temp_calib_offset_code) {
case 0x0C: sensor_data->eof_out = 4096; break;
case 0x8C: sensor_data->eof_out = -4096; break;
case 0x0D: sensor_data->eof_out = 8192; break;
case 0x8D: sensor_data->eof_out = -8192; break;
case 0x0E: sensor_data->eof_out = 16384; break;
case 0x8E: sensor_data->eof_out = -16384; break;
default: sensor_data->eof_out = 0; break;
}
sensor_data->shift_n = pow(2, sensor_data->temp_calib_gain_exp / 10.0f);
return SUCCESS;
}
static float Sensor_ConvertPressure(int32_t raw)
{
const int32_t TWO_POW_21 = 2097152;
return ((float)raw / TWO_POW_21) * (PMAX - PMIN);
}
static float Sensor_ConvertTemperature(int16_t raw, int16_t eof_out, float shift_n)
{
return ((float)(raw - eof_out) / shift_n) + 25.0f;
}
/*============================================================================*/
/* Public Functions */
/*============================================================================*/
void Sensor_Init(void)
{
/* I2C pins are initialized by IIC_Init() in main */
}
uint8_t Sensor_ReadData(SensorData *sensor_data)
{
int32_t pressure_raw;
int16_t temp_raw;
uint8_t result;
result = IIC_Read_nByte(SENSOR_I2C_ADDR, SENSOR_REG_DATA, 5, sensor_data->pressure_data);
if (result != SUCCESS) {
return FAILED;
}
pressure_raw = ((int32_t)sensor_data->pressure_data[0] << 16) |
((int32_t)sensor_data->pressure_data[1] << 8) |
(int32_t)sensor_data->pressure_data[2];
if (pressure_raw & 0x800000) {
pressure_raw |= 0xFF000000;
}
temp_raw = ((int16_t)sensor_data->pressure_data[3] << 8) |
(int16_t)sensor_data->pressure_data[4];
sensor_data->pressure_AD = pressure_raw;
sensor_data->temperature_AD = temp_raw;
result = Sensor_ReadCalibration(sensor_data);
if (result != SUCCESS) {
return FAILED;
}
sensor_data->pressure = Sensor_ConvertPressure(pressure_raw);
sensor_data->temperature = Sensor_ConvertTemperature(temp_raw,
sensor_data->eof_out,
sensor_data->shift_n);
#if DEBUG
printf("\r\n--- Sensor Data ---\r\n");
printf("Pressure_AD: %ld (0x%08lX)\r\n", pressure_raw, pressure_raw);
printf("Temperature_AD: %d (0x%04X)\r\n", temp_raw, temp_raw);
printf("EOFOut: %d, shiftN: %.2f\r\n", sensor_data->eof_out, sensor_data->shift_n);
printf("Pressure: %.2f Pa, Temperature: %.2f C\r\n",
sensor_data->pressure, sensor_data->temperature);
#endif
return SUCCESS;
}