Übersetzung bearbeiten
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_ADDR0x58
#define SENSOR_REG_DATA0x04
#define SENSOR_REG_EOF0x20
#define SENSOR_REG_SHIFT0x21
/*============================================================================*/
/* 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 PMAX100000.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 Druck;
float Temperatur;
} 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->Druck= Sensor_ConvertPressure(pressure_raw);
sensor_data->Temperatur= 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, Temperatur: %.2f C\r\n",
sensor_data->Druck, sensor_data->Temperatur);
#endif
return SUCCESS;
}