blob: cac5addb33e72303b2ead6ed5426d26773f6414f [file] [log] [blame]
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef SENSOR_H
#define SENSOR_H
#include <zephyr/kernel.h>
#define SLEEP_TIME_MS 250
#define MEASUREMENT_CYCLES 3
#define MAX_BURST_READ_SIZE 10
/* General */
#define CHIP_ID_REGISTER_ADDRESS 0xD0
#define VARIANT_ID_REGISTER_ADDRESS 0xF0
#define CONF_REGISTER_ADDRESS 0x75
#define CTRL_MEAS_REGISTER_ADDRESS 0x74
#define CTRL_HUM_REGISTER_ADDRESS 0x72
#define RESET_REGISTER_ADDRESS 0xE0
#define SLEEP_MODE 0x0
#define FORCED_MODE 0x1
#define CTRL_MEAS_MODE_BIT_MSK 1 << 1 | 1
#define CTRL_MEAS_MODE_BIT_SHIFT 0
#define RESET_DEVICE 0xB6
#define SENSOR_MEMORY_SIZE_IN_BYTES 255
/* Calibration coeffcients */
#define TEMP_PAR_T1_REGISTER_ADDRESS_LSB 0xE9
#define TEMP_PAR_T1_REGISTER_ADDRESS_MSB 0xEA
#define TEMP_PAR_T2_REGISTER_ADDRESS_LSB 0x8A
#define TEMP_PAR_T2_REGISTER_ADDRESS_MSB 0x8B
#define TEMP_PAR_T3_REGISTER_ADDRESS 0x8C
#define HUMI_PAR_REGISTERS_START_ADDRESS 0xE1
#define HUMI_PAR_REGISTERS_COUNT 8
#define HUMI_PAR_H1_LSB_BUF_POSITION 1
#define HUMI_PAR_H1_MSB_BUF_POSITION 2
#define HUMI_PAR_H2_LSB_BUF_POSITION 1
#define HUMI_PAR_H2_MSB_BUF_POSITION 0
#define HUMI_PAR_H3_BUF_POSITION 3
#define HUMI_PAR_H4_BUF_POSITION 4
#define HUMI_PAR_H5_BUF_POSITION 5
#define HUMI_PAR_H6_BUF_POSITION 6
#define HUMI_PAR_H7_BUF_POSITION 7
#define HUMI_PAR_H1_REGISTER_ADDRESS_LSB 0xE2
#define HUMI_PAR_H1_LSB_BIT_MASK 0xFF
#define HUMI_PAR_H1_REGISTER_ADDRESS_MSB 0xE3
#define HUMI_PAR_H2_REGISTER_ADDRESS_LSB 0xE2
#define HUMI_PAR_H2_REGISTER_ADDRESS_MSB 0xE1
#define HUMI_PAR_H3_REGISTER_ADDRESS 0xE4
#define HUMI_PAR_H4_REGISTER_ADDRESS 0xE5
#define HUMI_PAR_H5_REGISTER_ADDRESS 0xE6
#define HUMI_PAR_H6_REGISTER_ADDRESS 0xE7
#define HUMI_PAR_H7_REGISTER_ADDRESS 0xE8
#define PRES_PAR_P1_REGISTER_ADDRESS_LSB 0x8E
#define PRES_PAR_P1_REGISTER_ADDRESS_MSB 0x8F
#define PRES_PAR_P2_REGISTER_ADDRESS_LSB 0x90
#define PRES_PAR_P2_REGISTER_ADDRESS_MSB 0x91
#define PRES_PAR_P3_REGISTER_ADDRESS 0x92
#define PRES_PAR_P4_REGISTER_ADDRESS_LSB 0x94
#define PRES_PAR_P4_REGISTER_ADDRESS_MSB 0x95
#define PRES_PAR_P5_REGISTER_ADDRESS_LSB 0x96
#define PRES_PAR_P5_REGISTER_ADDRESS_MSB 0x97
#define PRES_PAR_P6_REGISTER_ADDRESS 0x99
#define PRES_PAR_P7_REGISTER_ADDRESS 0x98
#define PRES_PAR_P8_REGISTER_ADDRESS_LSB 0x9C
#define PRES_PAR_P8_REGISTER_ADDRESS_MSB 0x9D
#define PRES_PAR_P9_REGISTER_ADDRESS_LSB 0x9E
#define PRES_PAR_P9_REGISTER_ADDRESS_MSB 0x9F
#define PRES_PAR_P10_REGISTER_ADDRESS 0xA0
/* IIR filter */
#define IIR_FILER_ORDER_BIT_MASK 1 << 4 | 1 << 3 | 1 << 2
#define IIR_FILER_ORDER_BIT_SHIFT 2
#define IIR_FILER_COEFF_3 0x2
/* Temperature measurement */
#define TEMPERATURE_OVERSAMPLING_2X 0x2
#define TEMP_OVERSAMPLING_BIT_MSK 1 << 7 | 1 << 6 | 1 << 5
#define TEMP_OVERSAMPLING_BIT_SHIFT 5
#define TEMP_ADC_DATA_MSB_0 0x22
#define TEMP_ADC_DATA_LSB_0 0x23
#define TEMP_ADC_DATA_XLSB_0 0x24
/* Pressure measurement */
#define PRESSURE_OVERSAMPLING_16X 0x5
#define PRES_OVERSAMPLING_BIT_MSK 1 << 4 | 1 << 3 | 1 << 2
#define PRES_OVERSAMPLING_BIT_SHIFT 2
#define PRES_ADC_DATA_MSB_0 0x1F
#define PRES_ADC_DATA_LSB_0 0x20
#define PRES_ADC_DATA_XLSB_0 0x21
/* Humidity measurement */
#define HUMIDITY_OVERSAMPLING_1X 0x1
#define HUMIDITY_OVERSAMPLING_BIT_MSK 1 << 2 | 1 << 1 | 1
#define HUMIDITY_OVERSAMPLING_BIT_SHIFT 0
#define HUM_ADC_DATA_MSB_0 0x25
#define HUM_ADC_DATA_LSB_0 0x26
/* Measurement status */
#define MEAS_STATUS_0_REG_ADDRESS 0x1D
#define MEAS_STATUS_1_REG_ADDRESS 0x2E
#define MEAS_STATUS_2_REG_ADDRESS 0x3F
#define MEASUREMENT_IN_PROGRESS_BIT_MASK 1 << 5
#define MEASUREMENT_NEW_DATA_BIT_MASK 1 << 7
struct calibration_coeffs {
/* Temperature */
uint16_t par_t1;
uint16_t par_t2;
uint8_t par_t3;
/* Humidity */
uint16_t par_h1;
uint16_t par_h2;
uint8_t par_h3;
uint8_t par_h4;
uint8_t par_h5;
uint8_t par_h6;
uint8_t par_h7;
/* Pressure */
uint16_t par_p1;
int16_t par_p2;
int8_t par_p3;
int16_t par_p4;
int16_t par_p5;
int8_t par_p6;
int8_t par_p7;
int16_t par_p8;
int16_t par_p9;
uint8_t par_p10;
};
/* Calculate the compensated temperature
* Note: 't_fine' is required for other measurements
*/
int32_t calculate_temperature(uint32_t adc_temp, int32_t *t_fine,
struct calibration_coeffs *cal_coeffs);
/* Calculate the compensated pressure
* Note: temperature must be calculated first
* to obtain the 't_fine'
*/
uint32_t calculate_pressure(uint32_t pres_adc, int32_t t_fine,
struct calibration_coeffs *cal_coeffs);
/* Calculate the relative humidity
* Note: temperature must be calculated first
* to obtain the 't_fine'
*/
uint32_t calculate_humidity(uint16_t hum_adc, int32_t t_fine,
struct calibration_coeffs *cal_coeffs);
#endif