42#define CHIP_NAME "TE MS5611"
43#define MANUFACTURER_NAME "TE"
44#define SUPPLY_VOLTAGE_MIN 1.8f
45#define SUPPLY_VOLTAGE_MAX 3.6f
46#define MAX_CURRENT 1.4f
47#define TEMPERATURE_MIN -40.0f
48#define TEMPERATURE_MAX 85.0f
49#define DRIVER_VERSION 1000
54#define MS5611_PRESSURE_SENSITIVITY_INDEX 1
55#define MS5611_PRESSURE_OFFSET_INDEX 2
56#define MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX 3
57#define MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX 4
58#define MS5611_REFERENCE_TEMPERATURE_INDEX 5
59#define MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX 6
64#define MS5611_COMMAND_RESET 0x1E
65#define MS5611_COMMAND_PRESSURE 0x40
66#define MS5611_COMMAND_TEMPERATURE 0x50
67#define MS5611_COMMAND_ADC_READ 0x00
68#define MS5611_COMMAND_PROM_READ_ADDRESS_0 0xA0
81static uint8_t a_ms5611_iic_spi_read(
ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
94 if (handle->
spi_read(reg, buf, len) != 0)
114static uint8_t a_ms5611_iic_spi_write(
ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
127 if (handle->
spi_write(reg, buf, len) != 0)
145static uint8_t a_ms5611_crc_check(uint16_t *n_prom, uint8_t crc)
153 crc_read = n_prom[7];
154 n_prom[7] = (0xFF00U & (n_prom[7]));
155 for (cnt = 0; cnt < 16; cnt++)
159 n_rem ^= (uint16_t)((n_prom[cnt >> 1]) & 0x00FF);
163 n_rem ^= (uint16_t)(n_prom[cnt >> 1] >> 8);
165 for (n_bit = 8; n_bit > 0; n_bit--)
167 if ((n_rem & 0x8000U) != 0)
169 n_rem = (n_rem << 1) ^ 0x3000;
173 n_rem = (n_rem << 1);
177 n_rem = (0x000F & (n_rem >> 12));
178 n_prom[7] = crc_read;
203 for (i = 0; i < 8; i++)
212 handle->
coeff[i] = (uint16_t)((uint16_t)buf[0]) << 8 | (uint16_t)buf[1];
214 if (a_ms5611_crc_check(handle->
coeff, (uint8_t)(handle->
coeff[7] & 0x0F)) != 0)
238 handle->
iic_spi = (uint8_t)interface;
280 handle->
iic_addr = (uint8_t)addr_pin;
440 uint32_t *pressure_raw,
float *pressure_mbar)
465 handle->
debug_print(
"ms5611: start temperature failed.\n");
496 *temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
497 ((uint32_t)(buf[2]) << 0);
502 handle->
debug_print(
"ms5611: start pressure failed.\n");
533 *pressure_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
534 ((uint32_t)(buf[2]) << 0);
536 dt = (int32_t)(*temperature_raw) -
538 temp = 2000 + ((int64_t)dt *
542 t2 = (3 * ((int64_t)dt * (int64_t)dt)) >> 33;
543 off2 = 61 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16;
544 sens2 = 29 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16;
547 off2 += 17 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500);
548 sens2 += 9 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500);
553 t2 = (5 * ((int64_t)dt * (int64_t)dt)) >> 38;
563 p = ((((*pressure_raw) * sens) >> 21) - off) >> 15;
564 *temperature_c = ((float)temp - (float)t2) / 100.0f;
565 *pressure_mbar = (float)p / 100.0f;
602 handle->
debug_print(
"ms5611: start temperature failed.\n");
633 *temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
634 ((uint32_t)(buf[2]) << 0);
636 dt = (int32_t)(*temperature_raw) -
638 temp = 2000 + ((int64_t)dt *
642 t2 = (3 * ((int64_t)dt * (int64_t)dt)) >> 33;
646 t2 = (5 * ((int64_t)dt * (int64_t)dt)) >> 38;
648 *temperature_c = ((float)temp - (float)t2) / 100.0f;
670 uint32_t temperature_raw;
690 handle->
debug_print(
"ms5611: start temperature failed.\n");
721 temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
722 ((uint32_t)(buf[2]) << 0);
727 handle->
debug_print(
"ms5611: start pressure failed.\n");
758 *pressure_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
759 ((uint32_t)(buf[2]) << 0);
761 dt = (int32_t)(temperature_raw) -
763 temp = 2000 + ((int64_t)dt *
767 off2 = 61 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16;
768 sens2 = 29 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16;
771 off2 += 17 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500);
772 sens2 += 9 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500);
786 p = ((((*pressure_raw) * sens) >> 21) - off) >> 15;
787 *pressure_mbar = (float)p / 100.0f;
806 handle->
debug_print(
"ms5611: iic deinit failed.\n");
819 handle->
debug_print(
"ms5611: spi deinit failed.\n");
856 handle->
debug_print(
"ms5611: iic_init is null.\n");
862 handle->
debug_print(
"ms5611: iic_deinit is null.\n");
868 handle->
debug_print(
"ms5611: iic_read is null.\n");
874 handle->
debug_print(
"ms5611: iic_write is null.\n");
880 handle->
debug_print(
"ms5611: spi_init is null.\n");
886 handle->
debug_print(
"ms5611: spi_deinit is null.\n");
892 handle->
debug_print(
"ms5611: spi_read is null.\n");
898 handle->
debug_print(
"ms5611: spi_write is null.\n");
904 handle->
debug_print(
"ms5611: delay_ms is null.\n");
936 res = a_ms5611_prom_read(handle);
939 handle->
debug_print(
"ms5611: prom read failed.\n");
980 res = a_ms5611_close(handle);
1017 return a_ms5611_iic_spi_write(handle, reg, buf, len);
1044 return a_ms5611_iic_spi_read(handle, reg, buf, len);
#define MS5611_COMMAND_ADC_READ
#define MS5611_COMMAND_PROM_READ_ADDRESS_0
#define SUPPLY_VOLTAGE_MAX
#define MS5611_COMMAND_RESET
chip command definition
#define MS5611_COMMAND_TEMPERATURE
#define MS5611_PRESSURE_SENSITIVITY_INDEX
coeff index definition
#define MS5611_PRESSURE_OFFSET_INDEX
#define MS5611_COMMAND_PRESSURE
#define MANUFACTURER_NAME
#define MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX
#define SUPPLY_VOLTAGE_MIN
#define MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX
#define CHIP_NAME
chip register definition
#define MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX
#define MS5611_REFERENCE_TEMPERATURE_INDEX
driver ms5611 header file
struct ms5611_info_s ms5611_info_t
ms5611 information structure definition
ms5611_osr_t
ms5611 osr enumeration definition
uint8_t ms5611_get_pressure_osr(ms5611_handle_t *handle, ms5611_osr_t *osr)
get pressure osr
ms5611_address_t
ms5611 address enumeration definition
uint8_t ms5611_reset(ms5611_handle_t *handle)
reset the chip
uint8_t ms5611_read_pressure(ms5611_handle_t *handle, uint32_t *pressure_raw, float *pressure_mbar)
read the pressure
uint8_t ms5611_info(ms5611_info_t *info)
get chip's information
uint8_t ms5611_deinit(ms5611_handle_t *handle)
close the chip
uint8_t ms5611_set_pressure_osr(ms5611_handle_t *handle, ms5611_osr_t osr)
set pressure osr
uint8_t ms5611_set_addr_pin(ms5611_handle_t *handle, ms5611_address_t addr_pin)
set the iic address pin
uint8_t ms5611_read_temperature_pressure(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c, uint32_t *pressure_raw, float *pressure_mbar)
read the temperature and pressure
ms5611_interface_t
ms5611 interface enumeration definition
uint8_t ms5611_read_temperature(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c)
read the temperature
uint8_t ms5611_get_interface(ms5611_handle_t *handle, ms5611_interface_t *interface)
get the chip interface
struct ms5611_handle_s ms5611_handle_t
ms5611 handle structure definition
uint8_t ms5611_init(ms5611_handle_t *handle)
initialize the chip
uint8_t ms5611_get_addr_pin(ms5611_handle_t *handle, ms5611_address_t *addr_pin)
get the iic address pin
uint8_t ms5611_set_interface(ms5611_handle_t *handle, ms5611_interface_t interface)
set the chip interface
uint8_t ms5611_get_temperature_osr(ms5611_handle_t *handle, ms5611_osr_t *osr)
get temperature osr
uint8_t ms5611_set_temperature_osr(ms5611_handle_t *handle, ms5611_osr_t osr)
set temperature osr
uint8_t ms5611_set_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
set the chip register
uint8_t ms5611_get_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
get 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)
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