icm42670 - Driver for TDK ICM-42670-P 6-Axis IMU

group icm42670

ESP-IDF driver for TDK ICM-42670-P IMU (found on ESP-RS board)

Copyright (c) 2022 Jan Veeh (jan.veeh@motius.de)

ISC Licensed as described in the file LICENSE

Defines

ICM42670_I2C_ADDR_GND
ICM42670_I2C_ADDR_VCC
ICM42670_REG_MCLK_RDY
ICM42670_REG_DEVICE_CONFIG
ICM42670_REG_SIGNAL_PATH_RESET
ICM42670_REG_DRIVE_CONFIG1
ICM42670_REG_DRIVE_CONFIG2
ICM42670_REG_DRIVE_CONFIG3
ICM42670_REG_INT_CONFIG
ICM42670_REG_TEMP_DATA1
ICM42670_REG_TEMP_DATA0
ICM42670_REG_ACCEL_DATA_X1
ICM42670_REG_ACCEL_DATA_X0
ICM42670_REG_ACCEL_DATA_Y1
ICM42670_REG_ACCEL_DATA_Y0
ICM42670_REG_ACCEL_DATA_Z1
ICM42670_REG_ACCEL_DATA_Z0
ICM42670_REG_GYRO_DATA_X1
ICM42670_REG_GYRO_DATA_X0
ICM42670_REG_GYRO_DATA_Y1
ICM42670_REG_GYRO_DATA_Y0
ICM42670_REG_GYRO_DATA_Z1
ICM42670_REG_GYRO_DATA_Z0
ICM42670_REG_TMST_FSYNCH
ICM42670_REG_TMST_FSYNCL
ICM42670_REG_APEX_DATA4
ICM42670_REG_APEX_DATA5
ICM42670_REG_PWR_MGMT0
ICM42670_REG_GYRO_CONFIG0
ICM42670_REG_ACCEL_CONFIG0
ICM42670_REG_TEMP_CONFIG0
ICM42670_REG_GYRO_CONFIG1
ICM42670_REG_ACCEL_CONFIG1
ICM42670_REG_APEX_CONFIG0
ICM42670_REG_APEX_CONFIG1
ICM42670_REG_WOM_CONFIG
ICM42670_REG_FIFO_CONFIG1
ICM42670_REG_FIFO_CONFIG2
ICM42670_REG_FIFO_CONFIG3
ICM42670_REG_INT_SOURCE0
ICM42670_REG_INT_SOURCE1
ICM42670_REG_INT_SOURCE3
ICM42670_REG_INT_SOURCE4
ICM42670_REG_FIFO_LOST_PKT0
ICM42670_REG_FIFO_LOST_PKT1
ICM42670_REG_APEX_DATA0
ICM42670_REG_APEX_DATA1
ICM42670_REG_APEX_DATA2
ICM42670_REG_APEX_DATA3
ICM42670_REG_INTF_CONFIG0
ICM42670_REG_INTF_CONFIG1
ICM42670_REG_INT_STATUS_DRDY
ICM42670_REG_INT_STATUS
ICM42670_REG_INT_STATUS2
ICM42670_REG_INT_STATUS3
ICM42670_REG_FIFO_COUNTH
ICM42670_REG_FIFO_COUNTL
ICM42670_REG_FIFO_DATA
ICM42670_REG_WHO_AM_I
ICM42670_REG_BLK_SEL_W
ICM42670_REG_MADDR_W
ICM42670_REG_M_W
ICM42670_REG_BLK_SEL_R
ICM42670_REG_MADDR_R
ICM42670_REG_M_R
ICM42670_REG_TMST_CONFIG1
ICM42670_REG_FIFO_CONFIG5
ICM42670_REG_FIFO_CONFIG6
ICM42670_REG_FSYNC_CONFIG
ICM42670_REG_INT_CONFIG0
ICM42670_REG_INT_CONFIG1
ICM42670_REG_SENSOR_CONFIG3
ICM42670_REG_ST_CONFIG
ICM42670_REG_SELFTEST
ICM42670_REG_INTF_CONFIG6
ICM42670_REG_INTF_CONFIG10
ICM42670_REG_INTF_CONFIG7
ICM42670_REG_OTP_CONFIG
ICM42670_REG_INT_SOURCE6
ICM42670_REG_INT_SOURCE7
ICM42670_REG_INT_SOURCE8
ICM42670_REG_INT_SOURCE9
ICM42670_REG_INT_SOURCE10
ICM42670_REG_APEX_CONFIG2
ICM42670_REG_APEX_CONFIG3
ICM42670_REG_APEX_CONFIG4
ICM42670_REG_APEX_CONFIG5
ICM42670_REG_APEX_CONFIG9
ICM42670_REG_APEX_CONFIG10
ICM42670_REG_APEX_CONFIG11
ICM42670_REG_ACCEL_WOM_X_THR
ICM42670_REG_ACCEL_WOM_Y_THR
ICM42670_REG_ACCEL_WOM_Z_THR
ICM42670_REG_OFFSET_USER0
ICM42670_REG_OFFSET_USER1
ICM42670_REG_OFFSET_USER2
ICM42670_REG_OFFSET_USER3
ICM42670_REG_OFFSET_USER4
ICM42670_REG_OFFSET_USER5
ICM42670_REG_OFFSET_USER6
ICM42670_REG_OFFSET_USER7
ICM42670_REG_OFFSET_USER8
ICM42670_REG_ST_STATUS1
ICM42670_REG_ST_STATUS2
ICM42670_REG_FDR_CONFIG
ICM42670_REG_APEX_CONFIG12
ICM42670_REG_OTP_CTRL7
ICM42670_REG_XA_ST_DATA
ICM42670_REG_YA_ST_DATA
ICM42670_REG_ZA_ST_DATA
ICM42670_REG_XG_ST_DATA
ICM42670_REG_YG_ST_DATA
ICM42670_REG_ZG_ST_DATA

Enums

enum icm42670_gyro_pwr_mode_t

Values:

enumerator ICM42670_GYRO_DISABLE
enumerator ICM42670_GYRO_STANDBY
enumerator ICM42670_GYRO_ENABLE_LN_MODE
enum icm42670_accel_pwr_mode_t

Values:

enumerator ICM42670_ACCEL_DISABLE
enumerator ICM42670_ACCEL_ENABLE_LP_MODE
enumerator ICM42670_ACCEL_ENABLE_LN_MODE
enum icm42670_lp_clock_source_t

Values:

enumerator ICM42670_LP_CLK_WUO
enumerator ICM42670_LP_CLK_RCO
enum icm42670_gyro_fsr_t

Values:

enumerator ICM42670_GYRO_RANGE_2000DPS
enumerator ICM42670_GYRO_RANGE_1000DPS
enumerator ICM42670_GYRO_RANGE_500DPS
enumerator ICM42670_GYRO_RANGE_250DPS
enum icm42670_gyro_odr_t

Values:

enumerator ICM42670_GYRO_ODR_12_5HZ
enumerator ICM42670_GYRO_ODR_25HZ
enumerator ICM42670_GYRO_ODR_50HZ
enumerator ICM42670_GYRO_ODR_100HZ
enumerator ICM42670_GYRO_ODR_200HZ
enumerator ICM42670_GYRO_ODR_400HZ
enumerator ICM42670_GYRO_ODR_800HZ
enumerator ICM42670_GYRO_ODR_1_6KHZ
enum icm42670_accel_fsr_t

Values:

enumerator ICM42670_ACCEL_RANGE_16G
enumerator ICM42670_ACCEL_RANGE_8G
enumerator ICM42670_ACCEL_RANGE_4G
enumerator ICM42670_ACCEL_RANGE_2G
enum icm42670_accel_odr_t

Values:

enumerator ICM42670_ACCEL_ODR_1_5625HZ
enumerator ICM42670_ACCEL_ODR_3_125HZ
enumerator ICM42670_ACCEL_ODR_6_25HZ
enumerator ICM42670_ACCEL_ODR_12_5HZ
enumerator ICM42670_ACCEL_ODR_25HZ
enumerator ICM42670_ACCEL_ODR_50HZ
enumerator ICM42670_ACCEL_ODR_100HZ
enumerator ICM42670_ACCEL_ODR_200HZ
enumerator ICM42670_ACCEL_ODR_400HZ
enumerator ICM42670_ACCEL_ODR_800HZ
enumerator ICM42670_ACCEL_ODR_1_6KHZ
enum icm42670_temp_lfp_t

Values:

enumerator ICM42670_TEMP_LFP_BYPASSED
enumerator ICM42670_TEMP_LFP_180HZ
enumerator ICM42670_TEMP_LFP_72HZ
enumerator ICM42670_TEMP_LFP_34HZ
enumerator ICM42670_TEMP_LFP_16HZ
enumerator ICM42670_TEMP_LFP_8HZ
enumerator ICM42670_TEMP_LFP_4HZ
enum icm42670_gyro_lfp_t

Values:

enumerator ICM42670_GYRO_LFP_BYPASSED
enumerator ICM42670_GYRO_LFP_180HZ
enumerator ICM42670_GYRO_LFP_121HZ
enumerator ICM42670_GYRO_LFP_73HZ
enumerator ICM42670_GYRO_LFP_53HZ
enumerator ICM42670_GYRO_LFP_34HZ
enumerator ICM42670_GYRO_LFP_25HZ
enumerator ICM42670_GYRO_LFP_16HZ
enum icm42670_accel_lfp_t

Values:

enumerator ICM42670_ACCEL_LFP_BYPASSED
enumerator ICM42670_ACCEL_LFP_180HZ
enumerator ICM42670_ACCEL_LFP_121HZ
enumerator ICM42670_ACCEL_LFP_73HZ
enumerator ICM42670_ACCEL_LFP_53HZ
enumerator ICM42670_ACCEL_LFP_34HZ
enumerator ICM42670_ACCEL_LFP_25HZ
enumerator ICM42670_ACCEL_LFP_16HZ
enum icm42670_accel_avg_t

Values:

enumerator ICM42670_ACCEL_AVG_2X
enumerator ICM42670_ACCEL_AVG_4X
enumerator ICM42670_ACCEL_AVG_8X
enumerator ICM42670_ACCEL_AVG_16X
enumerator ICM42670_ACCEL_AVG_32X
enumerator ICM42670_ACCEL_AVG_64X
enum icm42670_int_mode_t

Values:

enumerator ICM42670_INT_MODE_PULSED
enumerator ICM42670_INT_MODE_LATCHED
enum icm42670_int_drive_t

Values:

enumerator ICM42670_INT_DRIVE_OPEN_DRAIN
enumerator ICM42670_INT_DRIVE_PUSH_PULL
enum icm42670_int_polarity_t

Values:

enumerator ICM42670_INT_POLARITY_ACTIVE_LOW
enumerator ICM42670_INT_POLARITY_ACTIVE_HIGH
enum icm42670_wom_int_dur_t

Values:

enumerator ICM42670_WOM_INT_DUR_FIRST
enumerator ICM42670_WOM_INT_DUR_SECOND
enumerator ICM42670_WOM_INT_DUR_THIRD
enumerator ICM42670_WOM_INT_DUR_FOURTH
enum icm42670_wom_int_mode_t

Values:

enumerator ICM42670_WOM_INT_MODE_ALL_OR
enumerator ICM42670_WOM_INT_MODE_ALL_AND
enum icm42670_wom_mode_t

Values:

enumerator ICM42670_WOM_MODE_REF_INITIAL
enumerator ICM42670_WOM_MODE_REF_LAST
enum icm42670_mreg_number_t

Values:

enumerator ICM42670_MREG1_RW
enumerator ICM42670_MREG2_RW
enumerator ICM42670_MREG3_RW

Functions

esp_err_t icm42670_init_desc(icm42670_t *dev, uint8_t addr, i2c_port_t port, gpio_num_t sda_gpio, gpio_num_t scl_gpio)

Initialize device descriptor.

Parameters:
  • dev – Device descriptor

  • addr – I2C device address, ICM42670_I2C_ADDR_... const

  • port – I2C port

  • sda_gpio – SDA GPIO pin

  • scl_gpio – SCL GPIO pin

Returns:

ESP_OK on success

esp_err_t icm42670_free_desc(icm42670_t *dev)

Free device descriptor.

Parameters:

dev – Device descriptor

Returns:

ESP_OK on success

esp_err_t icm42670_init(icm42670_t *dev)

Initialize device.

Parameters:

dev – Device descriptor

Returns:

ESP_OK on success

esp_err_t icm42670_set_idle_pwr_mode(icm42670_t *dev, bool enable_idle)

Set device power mode.

Parameters:
  • dev – Device descriptor

  • enable_idle – bool to enable idle mode

Returns:

ESP_OK on success

esp_err_t icm42670_set_gyro_pwr_mode(icm42670_t *dev, icm42670_gyro_pwr_mode_t pwr_mode)

Set gyro power mode.

Parameters:
  • dev – Device descriptor

  • pwr_mode – struct of type icm42670_gyro_pwr_mode_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_accel_pwr_mode(icm42670_t *dev, icm42670_accel_pwr_mode_t pwr_mode)

Set accel power mode.

Parameters:
  • dev – Device descriptor

  • pwr_mode – struct of type icm42670_accel_pwr_mode_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_low_power_clock(icm42670_t *dev, icm42670_lp_clock_source_t clock_source)

Set clock source in LP mode.

Parameters:
  • dev – Device descriptor

  • clock_source – struct of type icm42670_lp_clock_source_t

Returns:

ESP_OK on success

esp_err_t icm42670_read_temperature(icm42670_t *dev, float *temperature)

Read temperature from device.

Parameters:
  • dev – Device descriptor

  • temperature[out] temperature, degree C

Returns:

ESP_OK on success

esp_err_t icm42670_read_raw_data(icm42670_t *dev, uint8_t data_register, int16_t *data)

Read 16-bit raw data registers (accelerometer and gyro values)

Parameters:
  • dev – Device descriptor

  • data_register – data register to read from

  • data[out] accel or gyro data

Returns:

ESP_OK on success

esp_err_t icm42670_reset(icm42670_t *dev)

Performs a soft-reset.

Parameters:

dev – Device descriptor

Returns:

ESP_OK on success

esp_err_t icm42670_flush_fifo(icm42670_t *dev)

Wipes the FIFO.

Parameters:

dev – Device descriptor

Returns:

ESP_OK on success

esp_err_t icm42670_set_gyro_fsr(icm42670_t *dev, icm42670_gyro_fsr_t range)

Set the measurement FSR (Full Scale Range) of the gyro.

Parameters:
  • dev – Device descriptor

  • range – struct of type icm42670_gyro_fsr_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_gyro_odr(icm42670_t *dev, icm42670_gyro_odr_t odr)

Set the measurement ODR (Output Data Rate) of the gyro.

Parameters:
  • dev – Device descriptor

  • odr – struct of type icm42670_gyro_odr_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_accel_fsr(icm42670_t *dev, icm42670_accel_fsr_t range)

Set the measurement FSR (Full Scale Range) of the accelerometer.

Parameters:
  • dev – Device descriptor

  • range – struct of type icm42670_accel_fsr_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_accel_odr(icm42670_t *dev, icm42670_accel_odr_t odr)

Set the measurement ODR (Output Data Rate) of the accelerometer.

Parameters:
  • dev – Device descriptor

  • odr – struct of type icm42670_accel_odr_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_temp_lpf(icm42670_t *dev, icm42670_temp_lfp_t lpf_bw)

Set the digital Low-Pass-Filter (LPF) of the temperature sensor.

Parameters:
  • dev – Device descriptor

  • lpf_bw – struct of type icm42670_temp_lfp_t (bandwidth)

Returns:

ESP_OK on success

esp_err_t icm42670_set_gyro_lpf(icm42670_t *dev, icm42670_gyro_lfp_t lpf_bw)

Set the digital Low-Pass-Filter (LPF) of the gyro.

Parameters:
  • dev – Device descriptor

  • lpf_bw – struct of type icm42670_gyro_lfp_t (bandwidth)

Returns:

ESP_OK on success

esp_err_t icm42670_set_accel_lpf(icm42670_t *dev, icm42670_accel_lfp_t lpf_bw)

Set the digital Low-Pass-Filter (LPF) of the accelerometer.

Parameters:
  • dev – Device descriptor

  • lpf_bw – struct of type icm42670_accel_lfp_t (bandwidth)

Returns:

ESP_OK on success

esp_err_t icm42670_set_accel_avg(icm42670_t *dev, icm42670_accel_avg_t avg)

Set the averaging filter of the accelerometer (ONLY IN LOW POWER MODE (LPM)) This field can not be changed, when accel sensor is in LPM!

Parameters:
  • dev – Device descriptor

  • avg – struct of type icm42670_accel_avg_t (averaging)

Returns:

ESP_OK on success

esp_err_t icm42670_config_int_pin(icm42670_t *dev, uint8_t int_pin, icm42670_int_config_t config)

Configures the behaviour of an interrupt pin.

Parameters:
  • dev – Device descriptor

  • int_pin – interrupt pin (1 or 2)

  • config – struct of type icm42670_int_config_t

Returns:

ESP_OK on success

esp_err_t icm42670_set_int_sources(icm42670_t *dev, uint8_t int_pin, icm42670_int_source_t sources)

Configures the sources for an interrupt.

Parameters:
  • dev – Device descriptor

  • int_pin – interrupt pin (1 or 2)

  • sources – struct of type icm42670_int_source_t

Returns:

ESP_OK on success

esp_err_t icm42670_config_wom(icm42670_t *dev, icm42670_wom_config_t config)

Configures the Wake on Motion (WoM) behaviour WoM can only be configured if WoM is not enabled.

Parameters:
Returns:

ESP_OK on success

esp_err_t icm42670_enable_wom(icm42670_t *dev, bool enable)

Enable or Disable Wake on Motion (WoM)

Parameters:
  • dev – Device descriptor

  • enable – true to enable, false to disable

Returns:

ESP_OK on success

esp_err_t icm42670_get_mclk_rdy(icm42670_t *dev, bool *mclk_rdy)

Get the status of the internal clock.

Parameters:
  • dev – Device descriptor

  • mclk_rdy – true if internal clock is running

Returns:

ESP_OK on success

esp_err_t icm42670_get_accel_odr(icm42670_t *dev, icm42670_accel_odr_t *odr)

Get the output data rate (ODR) of the accel.

Parameters:
  • dev – Device descriptor

  • odr – pointer to icm42670_accel_odr_t

Returns:

ESP_OK on success

esp_err_t icm42670_get_accel_avg(icm42670_t *dev, icm42670_accel_avg_t *avg)

Get the status of the accel averaging.

Parameters:
  • dev – Device descriptor

  • avg – pointer to icm42670_accel_avg_t

Returns:

ESP_OK on success

struct icm42670_int_config_t
#include <icm42670.h>
struct icm42670_int_source_t
#include <icm42670.h>
struct icm42670_wom_config_t
#include <icm42670.h>
struct icm42670_t
#include <icm42670.h>

Device descriptor.