43#define CHIP_NAME "ScioSense ENS160"
44#define MANUFACTURER_NAME "ScioSense"
45#define SUPPLY_VOLTAGE_MIN 1.71f
46#define SUPPLY_VOLTAGE_MAX 1.98f
47#define MAX_CURRENT 79.0f
48#define TEMPERATURE_MIN -40.0f
49#define TEMPERATURE_MAX 85.0f
50#define DRIVER_VERSION 1000
55#define ENS160_REG_PART_ID 0x00
56#define ENS160_REG_OPMODE 0x10
57#define ENS160_REG_CONFIG 0x11
58#define ENS160_REG_COMMAND 0x12
59#define ENS160_REG_TEMP_IN 0x13
60#define ENS160_REG_RH_IN 0x15
61#define ENS160_REG_DEVICE_STATUS 0x20
62#define ENS160_REG_DATA_AQI 0x21
63#define ENS160_REG_DATA_TVOC 0x22
64#define ENS160_REG_DATA_ECO2 0x24
65#define ENS160_REG_DATA_ETOH 0x22
66#define ENS160_REG_DATA_T 0x30
67#define ENS160_REG_DATA_RH 0x32
68#define ENS160_REG_DATA_MISR 0x38
69#define ENS160_REG_GPR_WRITE 0x40
70#define ENS160_REG_GPR_READ 0x48
83static uint8_t a_ens160_iic_spi_read(
ens160_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
100 if (handle->
spi_read(reg_input, buf, len) != 0)
120static uint8_t a_ens160_iic_spi_write(
ens160_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
138 for (i = 0; i < len; i++)
140 reg_input = reg_index << 1;
141 reg_input &= ~(1 << 0);
143 if (handle->
spi_write(reg_input, &buf[i], 1) != 0)
170 handle->
iic_spi = (uint8_t)interface;
212 handle->
iic_addr = (uint8_t)addr_pin;
263 prev = (uint8_t)mode;
337 prev = (uint8_t)0xF0;
378 handle->
debug_print(
"ens160: get config failed.\n");
383 prev |= polarity << 6;
387 handle->
debug_print(
"ens160: set config failed.\n");
424 handle->
debug_print(
"ens160: get config failed.\n");
461 handle->
debug_print(
"ens160: get config failed.\n");
470 handle->
debug_print(
"ens160: set config failed.\n");
507 handle->
debug_print(
"ens160: get config failed.\n");
544 handle->
debug_print(
"ens160: get config failed.\n");
553 handle->
debug_print(
"ens160: set config failed.\n");
590 handle->
debug_print(
"ens160: get config failed.\n");
627 handle->
debug_print(
"ens160: get config failed.\n");
636 handle->
debug_print(
"ens160: set config failed.\n");
673 handle->
debug_print(
"ens160: get config failed.\n");
710 handle->
debug_print(
"ens160: get config failed.\n");
719 handle->
debug_print(
"ens160: set config failed.\n");
756 handle->
debug_print(
"ens160: get config failed.\n");
793 handle->
debug_print(
"ens160: set command failed.\n");
834 handle->
debug_print(
"ens160: set command failed.\n");
843 handle->
debug_print(
"ens160: set command failed.\n");
851 handle->
debug_print(
"ens160: read data failed.\n");
890 handle->
debug_print(
"ens160: set command failed.\n");
899 handle->
debug_print(
"ens160: set command failed.\n");
933 buf[0] = (raw >> 0) & 0xFF;
934 buf[1] = (raw >> 8) & 0xFF;
938 handle->
debug_print(
"ens160: set temp in failed.\n");
975 handle->
debug_print(
"ens160: get temp in failed.\n");
979 *raw = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1009 buf[0] = (raw >> 0) & 0xFF;
1010 buf[1] = (raw >> 8) & 0xFF;
1014 handle->
debug_print(
"ens160: set rh in failed.\n");
1051 handle->
debug_print(
"ens160: get rh in failed.\n");
1055 *raw = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1088 handle->
debug_print(
"ens160: get status failed.\n");
1125 handle->
debug_print(
"ens160: read aqi failed.\n");
1162 handle->
debug_print(
"ens160: read tvoc failed.\n");
1166 *tvoc_ppb = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1199 handle->
debug_print(
"ens160: read eco2 failed.\n");
1203 *eco2_ppm = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1236 handle->
debug_print(
"ens160: read etoh failed.\n");
1240 *etoh_ppb = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1273 handle->
debug_print(
"ens160: get data failed.\n");
1277 *raw = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1310 handle->
debug_print(
"ens160: get data failed.\n");
1314 *raw = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1347 handle->
debug_print(
"ens160: get checksum failed.\n");
1383 handle->
debug_print(
"ens160: set params failed.\n");
1418 handle->
debug_print(
"ens160: get params failed.\n");
1453 handle->
debug_print(
"ens160: get params output failed.\n");
1483 *reg = (uint16_t)((celsius_deg + 273.15f) * 64.0f);
1510 *celsius_deg = (uint16_t)(((
float)(reg) / 64.0f) - 273.15f);
1537 *reg = (uint16_t)(percentage * 512.0f);
1564 *percentage = ((float)(reg) / 512.0f);
1591 *reg = (uint16_t)(log2f(ohm) * 2048.0f);
1618 *ohm = powf(2.0f, (
float)reg / 2048.0f);
1638 uint16_t *resistance0, uint16_t *resistance1,
1639 uint16_t *resistance2, uint16_t *resistance3)
1650 *resistance0 = (uint16_t)((uint16_t)raw[1] << 8) | raw[0];
1651 *resistance1 = (uint16_t)((uint16_t)raw[3] << 8) | raw[2];
1652 *resistance2 = (uint16_t)((uint16_t)raw[5] << 8) | raw[4];
1653 *resistance3 = (uint16_t)((uint16_t)raw[7] << 8) | raw[6];
1694 handle->
debug_print(
"ens160: get status failed.\n");
1708 handle->
debug_print(
"ens160: read aqi failed.\n");
1712 raw[0] = prev2 & 0x7;
1717 handle->
debug_print(
"ens160: read tvoc failed.\n");
1721 raw[1] = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1722 raw[3] = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1727 handle->
debug_print(
"ens160: read eco2 failed.\n");
1731 raw[2] = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1746 handle->
debug_print(
"ens160: get params output failed.\n");
1750 raw[0] = (uint16_t)((uint16_t)params[1] << 8) | params[0];
1751 raw[1] = (uint16_t)((uint16_t)params[3] << 8) | params[2];
1752 raw[2] = (uint16_t)((uint16_t)params[5] << 8) | params[4];
1753 raw[3] = (uint16_t)((uint16_t)params[7] << 8) | params[6];
1778 handle->
debug_print(
"ens160: iic deinit failed.\n");
1789 handle->
debug_print(
"ens160: spi deinit failed.\n");
1824 handle->
debug_print(
"ens160: iic_init is null.\n");
1830 handle->
debug_print(
"ens160: iic_deinit is null.\n");
1836 handle->
debug_print(
"ens160: iic_read is null.\n");
1842 handle->
debug_print(
"ens160: iic_write is null.\n");
1848 handle->
debug_print(
"ens160: spi_init is null.\n");
1854 handle->
debug_print(
"ens160: spi_deinit is null.\n");
1860 handle->
debug_print(
"ens160: spi_read is null.\n");
1866 handle->
debug_print(
"ens160: spi_write is null.\n");
1872 handle->
debug_print(
"ens160: delay_ms is null.\n");
1878 handle->
debug_print(
"ens160: receive_callback is null.\n");
1887 handle->
debug_print(
"ens160: iic init failed.\n");
1896 handle->
debug_print(
"ens160: spi init failed.\n");
1905 (void)a_ens160_close(handle);
1909 id = (uint16_t)((uint16_t)buf[1] << 8) | buf[0];
1913 (void)a_ens160_close(handle);
1951 handle->
debug_print(
"ens160: set mode failed.\n");
1955 res = a_ens160_close(handle);
1989 return a_ens160_iic_spi_write(handle, reg, buf, len);
2016 return a_ens160_iic_spi_read(handle, reg, buf, len);
#define ENS160_REG_OPMODE
#define ENS160_REG_COMMAND
#define ENS160_REG_DATA_T
#define ENS160_REG_DATA_MISR
#define ENS160_REG_GPR_WRITE
#define ENS160_REG_GPR_READ
#define SUPPLY_VOLTAGE_MAX
#define ENS160_REG_CONFIG
#define ENS160_REG_DATA_ETOH
#define ENS160_REG_DATA_AQI
#define MANUFACTURER_NAME
#define ENS160_REG_TEMP_IN
#define SUPPLY_VOLTAGE_MIN
#define ENS160_REG_PART_ID
chip register definition
#define ENS160_REG_DATA_ECO2
#define ENS160_REG_DATA_TVOC
#define CHIP_NAME
chip register definition
#define ENS160_REG_DEVICE_STATUS
#define ENS160_REG_DATA_RH
driver ens160 header file
ens160_mode_t
ens160 mode enumeration definition
uint8_t ens160_resistance_convert_to_register(ens160_handle_t *handle, float ohm, uint16_t *reg)
convert the resistance to the register raw data
ens160_address_t
ens160 address enumeration definition
uint8_t ens160_get_status(ens160_handle_t *handle, uint8_t *status)
get status
uint8_t ens160_resistance_convert_to_data(ens160_handle_t *handle, uint16_t reg, float *ohm)
convert the register raw data to the resistance
uint8_t ens160_set_params(ens160_handle_t *handle, uint8_t params[8])
set params
uint8_t ens160_deinit(ens160_handle_t *handle)
close the chip
uint8_t ens160_set_addr_pin(ens160_handle_t *handle, ens160_address_t addr_pin)
set the iic address pin
uint8_t ens160_set_interrupt_pin_drive(ens160_handle_t *handle, ens160_pin_drive_t drive)
set interrupt pin drive
ens160_pin_polarity_t
ens160 pin polarity enumeration definition
uint8_t ens160_read_eco2(ens160_handle_t *handle, uint16_t *eco2_ppm)
read eco2
struct ens160_info_s ens160_info_t
ens160 information structure definition
uint8_t ens160_get_data_interrupt_pin_asserted(ens160_handle_t *handle, ens160_bool_t *enable)
get data interrupt pin asserted
uint8_t ens160_humidity_convert_to_data(ens160_handle_t *handle, uint16_t reg, float *percentage)
convert the register raw data to the humidity
uint8_t ens160_info(ens160_info_t *info)
get chip's information
uint8_t ens160_clear(ens160_handle_t *handle)
clear
uint8_t ens160_get_temperature_compensation(ens160_handle_t *handle, uint16_t *raw)
get temperature compensation
uint8_t ens160_temperature_convert_to_register(ens160_handle_t *handle, float celsius_deg, uint16_t *reg)
convert the temperature to the register raw data
uint8_t ens160_get_params_output(ens160_handle_t *handle, uint8_t params[8])
get params output
uint8_t ens160_get_params(ens160_handle_t *handle, uint8_t params[8])
get params
uint8_t ens160_get_interrupt_pin_polarity(ens160_handle_t *handle, ens160_pin_polarity_t *polarity)
get interrupt pin polarity
uint8_t ens160_set_interface(ens160_handle_t *handle, ens160_interface_t interface)
set the chip interface
uint8_t ens160_soft_reset(ens160_handle_t *handle)
soft reset
uint8_t ens160_read_tvoc(ens160_handle_t *handle, uint16_t *tvoc_ppb)
read tvoc
uint8_t ens160_set_interrupt_pin_polarity(ens160_handle_t *handle, ens160_pin_polarity_t polarity)
set interrupt pin polarity
uint8_t ens160_set_mode(ens160_handle_t *handle, ens160_mode_t mode)
set mode
uint8_t ens160_humidity_convert_to_register(ens160_handle_t *handle, float percentage, uint16_t *reg)
convert the humidity to the register raw data
uint8_t ens160_get_interrupt_pin_drive(ens160_handle_t *handle, ens160_pin_drive_t *drive)
get interrupt pin drive
uint8_t ens160_set_humidity_compensation(ens160_handle_t *handle, uint16_t raw)
set humidity compensation
ens160_interface_t
ens160 interface enumeration definition
uint8_t ens160_set_interrupt(ens160_handle_t *handle, ens160_bool_t enable)
enable or disable interrupt
uint8_t ens160_get_mode(ens160_handle_t *handle, ens160_mode_t *mode)
get mode
uint8_t ens160_set_general_purpose_read_interrupt_pin_asserted(ens160_handle_t *handle, ens160_bool_t enable)
set general purpose read interrupt pin asserted
uint8_t ens160_read_aqi(ens160_handle_t *handle, uint8_t *uba)
read aqi
uint8_t ens160_irq_handler(ens160_handle_t *handle)
irq handler
uint8_t ens160_temperature_convert_to_data(ens160_handle_t *handle, uint16_t reg, float *celsius_deg)
convert the register raw data to the temperature
uint8_t ens160_get_interface(ens160_handle_t *handle, ens160_interface_t *interface)
get the chip interface
uint8_t ens160_get_humidity_compensation(ens160_handle_t *handle, uint16_t *raw)
get humidity compensation
uint8_t ens160_get_general_purpose_read_interrupt_pin_asserted(ens160_handle_t *handle, ens160_bool_t *enable)
get general purpose read interrupt pin asserted
ens160_bool_t
ens160 bool enumeration definition
uint8_t ens160_get_addr_pin(ens160_handle_t *handle, ens160_address_t *addr_pin)
get the iic address pin
uint8_t ens160_get_interrupt(ens160_handle_t *handle, ens160_bool_t *enable)
get interrupt
ens160_pin_drive_t
ens160 pin drive enumeration definition
uint8_t ens160_get_calculation_temperature(ens160_handle_t *handle, uint16_t *raw)
get calculation temperature
uint8_t ens160_get_app_version(ens160_handle_t *handle, uint8_t *major, uint8_t *minor, uint8_t *release)
get app version
struct ens160_handle_s ens160_handle_t
ens160 handle structure definition
uint8_t ens160_resistance_split(ens160_handle_t *handle, uint8_t raw[8], uint16_t *resistance0, uint16_t *resistance1, uint16_t *resistance2, uint16_t *resistance3)
resistance split
uint8_t ens160_get_calculation_humidity(ens160_handle_t *handle, uint16_t *raw)
get calculation humidity
uint8_t ens160_nop(ens160_handle_t *handle)
nop
uint8_t ens160_set_temperature_compensation(ens160_handle_t *handle, uint16_t raw)
set temperature compensation
uint8_t ens160_init(ens160_handle_t *handle)
initialize the chip
uint8_t ens160_set_data_interrupt_pin_asserted(ens160_handle_t *handle, ens160_bool_t enable)
set data interrupt pin asserted
uint8_t ens160_get_checksum(ens160_handle_t *handle, uint8_t *checksum)
get checksum
uint8_t ens160_read_etoh(ens160_handle_t *handle, uint16_t *etoh_ppb)
read etoh
uint8_t ens160_get_reg(ens160_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
get the chip register
uint8_t ens160_set_reg(ens160_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
set the chip register
uint8_t(* spi_init)(void)
void(* delay_ms)(uint32_t ms)
uint8_t(* spi_read)(uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* spi_write)(uint8_t reg, uint8_t *buf, uint16_t len)
void(* debug_print)(const char *const fmt,...)
uint8_t(* iic_init)(void)
uint8_t(* spi_deinit)(void)
void(* receive_callback)(uint8_t type, uint16_t *dat)
uint8_t(* iic_write)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_read)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_deinit)(void)
float supply_voltage_max_v
char manufacturer_name[32]
float supply_voltage_min_v