Supports

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 = -16384break;

        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 rawint16_t eof_outfloat 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;

}