Modified Arduino library for ICM_20948 IMU for Nucleo boards

Committer:
saloutos
Date:
Mon Jan 31 03:25:31 2022 +0000
Revision:
0:894b603d32ee
modified ICM_20948 Arduino library for Nucleo boards

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saloutos 0:894b603d32ee 1 /*
saloutos 0:894b603d32ee 2
saloutos 0:894b603d32ee 3 This is a C-compatible interface to the features presented by the ICM 20948 9-axis device
saloutos 0:894b603d32ee 4 The imementation of the interface is flexible
saloutos 0:894b603d32ee 5
saloutos 0:894b603d32ee 6 */
saloutos 0:894b603d32ee 7
saloutos 0:894b603d32ee 8 #ifndef _ICM_20948_C_H_
saloutos 0:894b603d32ee 9 #define _ICM_20948_C_H_
saloutos 0:894b603d32ee 10
saloutos 0:894b603d32ee 11 #include <stdint.h>
saloutos 0:894b603d32ee 12 #include <stdbool.h>
saloutos 0:894b603d32ee 13 #include <stddef.h>
saloutos 0:894b603d32ee 14
saloutos 0:894b603d32ee 15 #include "ICM_20948_REGISTERS.h"
saloutos 0:894b603d32ee 16 #include "ICM_20948_ENUMERATIONS.h" // This is to give users access to usable value definiitons
saloutos 0:894b603d32ee 17 #include "AK09916_ENUMERATIONS.h"
saloutos 0:894b603d32ee 18 #include "ICM_20948_DMP.h"
saloutos 0:894b603d32ee 19
saloutos 0:894b603d32ee 20 #ifdef __cplusplus
saloutos 0:894b603d32ee 21 extern "C"
saloutos 0:894b603d32ee 22 {
saloutos 0:894b603d32ee 23 #endif /* __cplusplus */
saloutos 0:894b603d32ee 24
saloutos 0:894b603d32ee 25 extern int memcmp(const void *, const void *, size_t); // Avoid compiler warnings
saloutos 0:894b603d32ee 26
saloutos 0:894b603d32ee 27 // Define if the DMP will be supported
saloutos 0:894b603d32ee 28 // Note: you must have 14290/14301 Bytes of program memory available to store the DMP firmware!
saloutos 0:894b603d32ee 29 //#define ICM_20948_USE_DMP // Uncomment this line to enable DMP support. You can of course use ICM_20948_USE_DMP as a compiler flag too
saloutos 0:894b603d32ee 30
saloutos 0:894b603d32ee 31 // There are two versions of the InvenSense DMP firmware for the ICM20948 - with slightly different sizes
saloutos 0:894b603d32ee 32 #define DMP_CODE_SIZE 14301 /* eMD-SmartMotion-ICM20948-1.1.0-MP */
saloutos 0:894b603d32ee 33 //#define DMP_CODE_SIZE 14290 /* ICM20948_eMD_nucleo_1.0 */
saloutos 0:894b603d32ee 34
saloutos 0:894b603d32ee 35
saloutos 0:894b603d32ee 36 #define ICM_20948_I2C_ADDR_AD0 0x68 // Or 0x69 when AD0 is high
saloutos 0:894b603d32ee 37 #define ICM_20948_I2C_ADDR_AD1 0x69 //
saloutos 0:894b603d32ee 38 #define ICM_20948_WHOAMI 0xEA
saloutos 0:894b603d32ee 39
saloutos 0:894b603d32ee 40 #define MAG_AK09916_I2C_ADDR 0x0C
saloutos 0:894b603d32ee 41 #define MAG_AK09916_WHO_AM_I 0x4809
saloutos 0:894b603d32ee 42 #define MAG_REG_WHO_AM_I 0x00
saloutos 0:894b603d32ee 43
saloutos 0:894b603d32ee 44 /** @brief Max size that can be read across I2C or SPI data lines */
saloutos 0:894b603d32ee 45 #define INV_MAX_SERIAL_READ 16
saloutos 0:894b603d32ee 46 /** @brief Max size that can be written across I2C or SPI data lines */
saloutos 0:894b603d32ee 47 #define INV_MAX_SERIAL_WRITE 16
saloutos 0:894b603d32ee 48
saloutos 0:894b603d32ee 49 typedef enum
saloutos 0:894b603d32ee 50 {
saloutos 0:894b603d32ee 51 ICM_20948_Stat_Ok = 0x00, // The only return code that means all is well
saloutos 0:894b603d32ee 52 ICM_20948_Stat_Err, // A general error
saloutos 0:894b603d32ee 53 ICM_20948_Stat_NotImpl, // Returned by virtual functions that are not implemented
saloutos 0:894b603d32ee 54 ICM_20948_Stat_ParamErr,
saloutos 0:894b603d32ee 55 ICM_20948_Stat_WrongID,
saloutos 0:894b603d32ee 56 ICM_20948_Stat_InvalSensor, // Tried to apply a function to a sensor that does not support it (e.g. DLPF to the temperature sensor)
saloutos 0:894b603d32ee 57 ICM_20948_Stat_NoData,
saloutos 0:894b603d32ee 58 ICM_20948_Stat_SensorNotSupported,
saloutos 0:894b603d32ee 59 ICM_20948_Stat_DMPNotSupported, // DMP not supported (no #define ICM_20948_USE_DMP)
saloutos 0:894b603d32ee 60 ICM_20948_Stat_DMPVerifyFail, // DMP was written but did not verify correctly
saloutos 0:894b603d32ee 61 ICM_20948_Stat_FIFONoDataAvail, // FIFO contains no data
saloutos 0:894b603d32ee 62 ICM_20948_Stat_FIFOIncompleteData, // FIFO contained incomplete data
saloutos 0:894b603d32ee 63 ICM_20948_Stat_FIFOMoreDataAvail, // FIFO contains more data
saloutos 0:894b603d32ee 64 ICM_20948_Stat_UnrecognisedDMPHeader,
saloutos 0:894b603d32ee 65 ICM_20948_Stat_UnrecognisedDMPHeader2,
saloutos 0:894b603d32ee 66 ICM_20948_Stat_InvalDMPRegister, // Invalid DMP Register
saloutos 0:894b603d32ee 67
saloutos 0:894b603d32ee 68 ICM_20948_Stat_NUM,
saloutos 0:894b603d32ee 69 ICM_20948_Stat_Unknown,
saloutos 0:894b603d32ee 70 } ICM_20948_Status_e;
saloutos 0:894b603d32ee 71
saloutos 0:894b603d32ee 72 typedef enum
saloutos 0:894b603d32ee 73 {
saloutos 0:894b603d32ee 74 ICM_20948_Internal_Acc = (1 << 0),
saloutos 0:894b603d32ee 75 ICM_20948_Internal_Gyr = (1 << 1),
saloutos 0:894b603d32ee 76 ICM_20948_Internal_Mag = (1 << 2),
saloutos 0:894b603d32ee 77 ICM_20948_Internal_Tmp = (1 << 3),
saloutos 0:894b603d32ee 78 ICM_20948_Internal_Mst = (1 << 4), // I2C Master Ineternal
saloutos 0:894b603d32ee 79 } ICM_20948_InternalSensorID_bm; // A bitmask of internal sensor IDs
saloutos 0:894b603d32ee 80
saloutos 0:894b603d32ee 81 typedef union
saloutos 0:894b603d32ee 82 {
saloutos 0:894b603d32ee 83 int16_t i16bit[3];
saloutos 0:894b603d32ee 84 uint8_t u8bit[6];
saloutos 0:894b603d32ee 85 } ICM_20948_axis3bit16_t;
saloutos 0:894b603d32ee 86
saloutos 0:894b603d32ee 87 typedef union
saloutos 0:894b603d32ee 88 {
saloutos 0:894b603d32ee 89 int16_t i16bit;
saloutos 0:894b603d32ee 90 uint8_t u8bit[2];
saloutos 0:894b603d32ee 91 } ICM_20948_axis1bit16_t;
saloutos 0:894b603d32ee 92
saloutos 0:894b603d32ee 93 typedef struct
saloutos 0:894b603d32ee 94 {
saloutos 0:894b603d32ee 95 uint8_t a : 2;
saloutos 0:894b603d32ee 96 uint8_t g : 2;
saloutos 0:894b603d32ee 97 uint8_t reserved_0 : 4;
saloutos 0:894b603d32ee 98 } ICM_20948_fss_t; // Holds full-scale settings to be able to extract measurements with units
saloutos 0:894b603d32ee 99
saloutos 0:894b603d32ee 100 typedef struct
saloutos 0:894b603d32ee 101 {
saloutos 0:894b603d32ee 102 uint8_t a;
saloutos 0:894b603d32ee 103 uint8_t g;
saloutos 0:894b603d32ee 104 } ICM_20948_dlpcfg_t; // Holds digital low pass filter settings. Members are type ICM_20948_ACCEL_CONFIG_DLPCFG_e
saloutos 0:894b603d32ee 105
saloutos 0:894b603d32ee 106 typedef struct
saloutos 0:894b603d32ee 107 {
saloutos 0:894b603d32ee 108 uint16_t a;
saloutos 0:894b603d32ee 109 uint8_t g;
saloutos 0:894b603d32ee 110 } ICM_20948_smplrt_t;
saloutos 0:894b603d32ee 111
saloutos 0:894b603d32ee 112 typedef struct
saloutos 0:894b603d32ee 113 {
saloutos 0:894b603d32ee 114 uint8_t I2C_MST_INT_EN : 1;
saloutos 0:894b603d32ee 115 uint8_t DMP_INT1_EN : 1;
saloutos 0:894b603d32ee 116 uint8_t PLL_RDY_EN : 1;
saloutos 0:894b603d32ee 117 uint8_t WOM_INT_EN : 1;
saloutos 0:894b603d32ee 118 uint8_t REG_WOF_EN : 1;
saloutos 0:894b603d32ee 119 uint8_t RAW_DATA_0_RDY_EN : 1;
saloutos 0:894b603d32ee 120 uint8_t FIFO_OVERFLOW_EN_4 : 1;
saloutos 0:894b603d32ee 121 uint8_t FIFO_OVERFLOW_EN_3 : 1;
saloutos 0:894b603d32ee 122 uint8_t FIFO_OVERFLOW_EN_2 : 1;
saloutos 0:894b603d32ee 123 uint8_t FIFO_OVERFLOW_EN_1 : 1;
saloutos 0:894b603d32ee 124 uint8_t FIFO_OVERFLOW_EN_0 : 1;
saloutos 0:894b603d32ee 125 uint8_t FIFO_WM_EN_4 : 1;
saloutos 0:894b603d32ee 126 uint8_t FIFO_WM_EN_3 : 1;
saloutos 0:894b603d32ee 127 uint8_t FIFO_WM_EN_2 : 1;
saloutos 0:894b603d32ee 128 uint8_t FIFO_WM_EN_1 : 1;
saloutos 0:894b603d32ee 129 uint8_t FIFO_WM_EN_0 : 1;
saloutos 0:894b603d32ee 130 } ICM_20948_INT_enable_t;
saloutos 0:894b603d32ee 131
saloutos 0:894b603d32ee 132 typedef union
saloutos 0:894b603d32ee 133 {
saloutos 0:894b603d32ee 134 ICM_20948_axis3bit16_t raw;
saloutos 0:894b603d32ee 135 struct
saloutos 0:894b603d32ee 136 {
saloutos 0:894b603d32ee 137 int16_t x;
saloutos 0:894b603d32ee 138 int16_t y;
saloutos 0:894b603d32ee 139 int16_t z;
saloutos 0:894b603d32ee 140 } axes;
saloutos 0:894b603d32ee 141 } ICM_20948_axis3named_t;
saloutos 0:894b603d32ee 142
saloutos 0:894b603d32ee 143 typedef struct
saloutos 0:894b603d32ee 144 {
saloutos 0:894b603d32ee 145 ICM_20948_axis3named_t acc;
saloutos 0:894b603d32ee 146 ICM_20948_axis3named_t gyr;
saloutos 0:894b603d32ee 147 ICM_20948_axis3named_t mag;
saloutos 0:894b603d32ee 148 union
saloutos 0:894b603d32ee 149 {
saloutos 0:894b603d32ee 150 ICM_20948_axis1bit16_t raw;
saloutos 0:894b603d32ee 151 int16_t val;
saloutos 0:894b603d32ee 152 } tmp;
saloutos 0:894b603d32ee 153 ICM_20948_fss_t fss; // Full-scale range settings for this measurement
saloutos 0:894b603d32ee 154 uint8_t magStat1;
saloutos 0:894b603d32ee 155 uint8_t magStat2;
saloutos 0:894b603d32ee 156 } ICM_20948_AGMT_t;
saloutos 0:894b603d32ee 157
saloutos 0:894b603d32ee 158 typedef struct
saloutos 0:894b603d32ee 159 {
saloutos 0:894b603d32ee 160 ICM_20948_Status_e (*write)(uint8_t regaddr, uint8_t *pdata, uint32_t len, void *user);
saloutos 0:894b603d32ee 161 ICM_20948_Status_e (*read)(uint8_t regaddr, uint8_t *pdata, uint32_t len, void *user);
saloutos 0:894b603d32ee 162 // void (*delay)(uint32_t ms);
saloutos 0:894b603d32ee 163 void *user;
saloutos 0:894b603d32ee 164 } ICM_20948_Serif_t; // This is the vtable of serial interface functions
saloutos 0:894b603d32ee 165 extern const ICM_20948_Serif_t NullSerif; // Here is a default for initialization (NULL)
saloutos 0:894b603d32ee 166
saloutos 0:894b603d32ee 167 typedef struct
saloutos 0:894b603d32ee 168 {
saloutos 0:894b603d32ee 169 const ICM_20948_Serif_t *_serif; // Pointer to the assigned Serif (Serial Interface) vtable
saloutos 0:894b603d32ee 170 bool _dmp_firmware_available; // Indicates if the DMP firmware has been included. It
saloutos 0:894b603d32ee 171 bool _firmware_loaded; // Indicates if DMP has been loaded
saloutos 0:894b603d32ee 172 uint8_t _last_bank; // Keep track of which bank was selected last - to avoid unnecessary writes
saloutos 0:894b603d32ee 173 uint8_t _last_mems_bank; // Keep track of which bank was selected last - to avoid unnecessary writes
saloutos 0:894b603d32ee 174 int32_t _gyroSF; // Use this to record the GyroSF, calculated by inv_icm20948_set_gyro_sf
saloutos 0:894b603d32ee 175 int8_t _gyroSFpll;
saloutos 0:894b603d32ee 176 uint32_t _enabled_Android_0; // Keep track of which Android sensors are enabled: 0-31
saloutos 0:894b603d32ee 177 uint32_t _enabled_Android_1; // Keep track of which Android sensors are enabled: 32-
saloutos 0:894b603d32ee 178 uint32_t _enabled_Android_intr_0; // Keep track of which Android sensor interrupts are enabled: 0-31
saloutos 0:894b603d32ee 179 uint32_t _enabled_Android_intr_1; // Keep track of which Android sensor interrupts are enabled: 32-
saloutos 0:894b603d32ee 180 uint16_t _dataOutCtl1; // Diagnostics: record the setting of DATA_OUT_CTL1
saloutos 0:894b603d32ee 181 uint16_t _dataOutCtl2; // Diagnostics: record the setting of DATA_OUT_CTL2
saloutos 0:894b603d32ee 182 uint16_t _dataRdyStatus; // Diagnostics: record the setting of DATA_RDY_STATUS
saloutos 0:894b603d32ee 183 uint16_t _motionEventCtl; // Diagnostics: record the setting of MOTION_EVENT_CTL
saloutos 0:894b603d32ee 184 uint16_t _dataIntrCtl; // Diagnostics: record the setting of DATA_INTR_CTL
saloutos 0:894b603d32ee 185 } ICM_20948_Device_t; // Definition of device struct type
saloutos 0:894b603d32ee 186
saloutos 0:894b603d32ee 187 ICM_20948_Status_e ICM_20948_init_struct(ICM_20948_Device_t *pdev); // Initialize ICM_20948_Device_t
saloutos 0:894b603d32ee 188
saloutos 0:894b603d32ee 189 // ICM_20948_Status_e ICM_20948_Startup( ICM_20948_Device_t* pdev ); // For the time being this performs a standardized startup routine
saloutos 0:894b603d32ee 190
saloutos 0:894b603d32ee 191 ICM_20948_Status_e ICM_20948_link_serif(ICM_20948_Device_t *pdev, const ICM_20948_Serif_t *s); // Links a SERIF structure to the device
saloutos 0:894b603d32ee 192
saloutos 0:894b603d32ee 193 // use the device's serif to perform a read or write
saloutos 0:894b603d32ee 194 ICM_20948_Status_e ICM_20948_execute_r(ICM_20948_Device_t *pdev, uint8_t regaddr, uint8_t *pdata, uint32_t len); // Executes a R or W witht he serif vt as long as the pointers are not null
saloutos 0:894b603d32ee 195 ICM_20948_Status_e ICM_20948_execute_w(ICM_20948_Device_t *pdev, uint8_t regaddr, uint8_t *pdata, uint32_t len);
saloutos 0:894b603d32ee 196
saloutos 0:894b603d32ee 197 // Single-shot I2C on Master IF
saloutos 0:894b603d32ee 198 ICM_20948_Status_e ICM_20948_i2c_controller_periph4_txn(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr);
saloutos 0:894b603d32ee 199 ICM_20948_Status_e ICM_20948_i2c_master_single_w(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data);
saloutos 0:894b603d32ee 200 ICM_20948_Status_e ICM_20948_i2c_master_single_r(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data);
saloutos 0:894b603d32ee 201
saloutos 0:894b603d32ee 202 // Device Level
saloutos 0:894b603d32ee 203 ICM_20948_Status_e ICM_20948_set_bank(ICM_20948_Device_t *pdev, uint8_t bank); // Sets the bank
saloutos 0:894b603d32ee 204 ICM_20948_Status_e ICM_20948_sw_reset(ICM_20948_Device_t *pdev); // Performs a SW reset
saloutos 0:894b603d32ee 205 ICM_20948_Status_e ICM_20948_sleep(ICM_20948_Device_t *pdev, bool on); // Set sleep mode for the chip
saloutos 0:894b603d32ee 206 ICM_20948_Status_e ICM_20948_low_power(ICM_20948_Device_t *pdev, bool on); // Set low power mode for the chip
saloutos 0:894b603d32ee 207 ICM_20948_Status_e ICM_20948_set_clock_source(ICM_20948_Device_t *pdev, ICM_20948_PWR_MGMT_1_CLKSEL_e source); // Choose clock source
saloutos 0:894b603d32ee 208 ICM_20948_Status_e ICM_20948_get_who_am_i(ICM_20948_Device_t *pdev, uint8_t *whoami); // Return whoami in out prarmeter
saloutos 0:894b603d32ee 209 ICM_20948_Status_e ICM_20948_check_id(ICM_20948_Device_t *pdev); // Return 'ICM_20948_Stat_Ok' if whoami matches ICM_20948_WHOAMI
saloutos 0:894b603d32ee 210 ICM_20948_Status_e ICM_20948_data_ready(ICM_20948_Device_t *pdev); // Returns 'Ok' if data is ready
saloutos 0:894b603d32ee 211
saloutos 0:894b603d32ee 212 // Interrupt Configuration
saloutos 0:894b603d32ee 213 ICM_20948_Status_e ICM_20948_int_pin_cfg(ICM_20948_Device_t *pdev, ICM_20948_INT_PIN_CFG_t *write, ICM_20948_INT_PIN_CFG_t *read); // Set the INT pin configuration
saloutos 0:894b603d32ee 214 ICM_20948_Status_e ICM_20948_int_enable(ICM_20948_Device_t *pdev, ICM_20948_INT_enable_t *write, ICM_20948_INT_enable_t *read); // Write and or read the interrupt enable information. If non-null the write operation occurs before the read, so as to verify that the write was successful
saloutos 0:894b603d32ee 215
saloutos 0:894b603d32ee 216 // WoM Threshold Level Configuration
saloutos 0:894b603d32ee 217 ICM_20948_Status_e ICM_20948_wom_threshold(ICM_20948_Device_t *pdev, ICM_20948_ACCEL_WOM_THR_t *write, ICM_20948_ACCEL_WOM_THR_t *read); // Write and or read the Wake on Motion threshold. If non-null the write operation occurs before the read, so as to verify that the write was successful
saloutos 0:894b603d32ee 218
saloutos 0:894b603d32ee 219 // Internal Sensor Options
saloutos 0:894b603d32ee 220 ICM_20948_Status_e ICM_20948_set_sample_mode(ICM_20948_Device_t *pdev, ICM_20948_InternalSensorID_bm sensors, ICM_20948_LP_CONFIG_CYCLE_e mode); // Use to set accel, gyro, and I2C master into cycled or continuous modes
saloutos 0:894b603d32ee 221 ICM_20948_Status_e ICM_20948_set_full_scale(ICM_20948_Device_t *pdev, ICM_20948_InternalSensorID_bm sensors, ICM_20948_fss_t fss);
saloutos 0:894b603d32ee 222 ICM_20948_Status_e ICM_20948_set_dlpf_cfg(ICM_20948_Device_t *pdev, ICM_20948_InternalSensorID_bm sensors, ICM_20948_dlpcfg_t cfg);
saloutos 0:894b603d32ee 223 ICM_20948_Status_e ICM_20948_enable_dlpf(ICM_20948_Device_t *pdev, ICM_20948_InternalSensorID_bm sensors, bool enable);
saloutos 0:894b603d32ee 224 ICM_20948_Status_e ICM_20948_set_sample_rate(ICM_20948_Device_t *pdev, ICM_20948_InternalSensorID_bm sensors, ICM_20948_smplrt_t smplrt);
saloutos 0:894b603d32ee 225
saloutos 0:894b603d32ee 226 // Interface Things
saloutos 0:894b603d32ee 227 ICM_20948_Status_e ICM_20948_i2c_master_passthrough(ICM_20948_Device_t *pdev, bool passthrough);
saloutos 0:894b603d32ee 228 ICM_20948_Status_e ICM_20948_i2c_master_enable(ICM_20948_Device_t *pdev, bool enable);
saloutos 0:894b603d32ee 229 ICM_20948_Status_e ICM_20948_i2c_master_reset(ICM_20948_Device_t *pdev);
saloutos 0:894b603d32ee 230 ICM_20948_Status_e ICM_20948_i2c_controller_configure_peripheral(ICM_20948_Device_t *pdev, uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap, uint8_t dataOut);
saloutos 0:894b603d32ee 231
saloutos 0:894b603d32ee 232 // Higher Level
saloutos 0:894b603d32ee 233 ICM_20948_Status_e ICM_20948_get_agmt(ICM_20948_Device_t *pdev, ICM_20948_AGMT_t *p);
saloutos 0:894b603d32ee 234
saloutos 0:894b603d32ee 235 // FIFO
saloutos 0:894b603d32ee 236
saloutos 0:894b603d32ee 237 ICM_20948_Status_e ICM_20948_enable_FIFO(ICM_20948_Device_t *pdev, bool enable);
saloutos 0:894b603d32ee 238 ICM_20948_Status_e ICM_20948_reset_FIFO(ICM_20948_Device_t *pdev);
saloutos 0:894b603d32ee 239 ICM_20948_Status_e ICM_20948_set_FIFO_mode(ICM_20948_Device_t *pdev, bool snapshot);
saloutos 0:894b603d32ee 240 ICM_20948_Status_e ICM_20948_get_FIFO_count(ICM_20948_Device_t *pdev, uint16_t *count);
saloutos 0:894b603d32ee 241 ICM_20948_Status_e ICM_20948_read_FIFO(ICM_20948_Device_t *pdev, uint8_t *data, uint8_t len);
saloutos 0:894b603d32ee 242
saloutos 0:894b603d32ee 243 // DMP
saloutos 0:894b603d32ee 244
saloutos 0:894b603d32ee 245 ICM_20948_Status_e ICM_20948_enable_DMP(ICM_20948_Device_t *pdev, bool enable);
saloutos 0:894b603d32ee 246 ICM_20948_Status_e ICM_20948_reset_DMP(ICM_20948_Device_t *pdev);
saloutos 0:894b603d32ee 247 ICM_20948_Status_e ICM_20948_firmware_load(ICM_20948_Device_t *pdev);
saloutos 0:894b603d32ee 248 ICM_20948_Status_e ICM_20948_set_dmp_start_address(ICM_20948_Device_t *pdev, unsigned short address);
saloutos 0:894b603d32ee 249
saloutos 0:894b603d32ee 250 /** @brief Loads the DMP firmware from SRAM
saloutos 0:894b603d32ee 251 * @param[in] data pointer where the image
saloutos 0:894b603d32ee 252 * @param[in] size size if the image
saloutos 0:894b603d32ee 253 * @param[in] load_addr address to loading the image
saloutos 0:894b603d32ee 254 * @return 0 in case of success, -1 for any error
saloutos 0:894b603d32ee 255 */
saloutos 0:894b603d32ee 256 ICM_20948_Status_e inv_icm20948_firmware_load(ICM_20948_Device_t *pdev, const unsigned char *data, unsigned short size, unsigned short load_addr);
saloutos 0:894b603d32ee 257 /**
saloutos 0:894b603d32ee 258 * @brief Write data to a register in DMP memory
saloutos 0:894b603d32ee 259 * @param[in] DMP memory address
saloutos 0:894b603d32ee 260 * @param[in] number of byte to be written
saloutos 0:894b603d32ee 261 * @param[out] output data from the register
saloutos 0:894b603d32ee 262 * @return 0 if successful.
saloutos 0:894b603d32ee 263 */
saloutos 0:894b603d32ee 264 ICM_20948_Status_e inv_icm20948_write_mems(ICM_20948_Device_t *pdev, unsigned short reg, unsigned int length, const unsigned char *data);
saloutos 0:894b603d32ee 265 /**
saloutos 0:894b603d32ee 266 * @brief Read data from a register in DMP memory
saloutos 0:894b603d32ee 267 * @param[in] DMP memory address
saloutos 0:894b603d32ee 268 * @param[in] number of byte to be read
saloutos 0:894b603d32ee 269 * @param[in] input data from the register
saloutos 0:894b603d32ee 270 * @return 0 if successful.
saloutos 0:894b603d32ee 271 */
saloutos 0:894b603d32ee 272 ICM_20948_Status_e inv_icm20948_read_mems(ICM_20948_Device_t *pdev, unsigned short reg, unsigned int length, unsigned char *data);
saloutos 0:894b603d32ee 273
saloutos 0:894b603d32ee 274 ICM_20948_Status_e inv_icm20948_set_dmp_sensor_period(ICM_20948_Device_t *pdev, enum DMP_ODR_Registers odr_reg, uint16_t interval);
saloutos 0:894b603d32ee 275 ICM_20948_Status_e inv_icm20948_enable_dmp_sensor(ICM_20948_Device_t *pdev, enum inv_icm20948_sensor sensor, int state); // State is actually boolean
saloutos 0:894b603d32ee 276 ICM_20948_Status_e inv_icm20948_enable_dmp_sensor_int(ICM_20948_Device_t *pdev, enum inv_icm20948_sensor sensor, int state); // State is actually boolean
saloutos 0:894b603d32ee 277 uint8_t sensor_type_2_android_sensor(enum inv_icm20948_sensor sensor);
saloutos 0:894b603d32ee 278 enum inv_icm20948_sensor inv_icm20948_sensor_android_2_sensor_type(int sensor);
saloutos 0:894b603d32ee 279
saloutos 0:894b603d32ee 280 ICM_20948_Status_e inv_icm20948_read_dmp_data(ICM_20948_Device_t *pdev, icm_20948_DMP_data_t *data);
saloutos 0:894b603d32ee 281 ICM_20948_Status_e inv_icm20948_set_gyro_sf(ICM_20948_Device_t *pdev, unsigned char div, int gyro_level);
saloutos 0:894b603d32ee 282
saloutos 0:894b603d32ee 283 // ToDo:
saloutos 0:894b603d32ee 284
saloutos 0:894b603d32ee 285 /*
saloutos 0:894b603d32ee 286 Want to access magnetometer throught the I2C master interface...
saloutos 0:894b603d32ee 287
saloutos 0:894b603d32ee 288 // If using the I2C master to read from the magnetometer
saloutos 0:894b603d32ee 289 // Enable the I2C master to talk to the magnetometer through the ICM 20948
saloutos 0:894b603d32ee 290 myICM.i2cMasterEnable( true );
saloutos 0:894b603d32ee 291 SERIAL_PORT.print(F("Enabling the I2C master returned ")); SERIAL_PORT.println(myICM.statusString());
saloutos 0:894b603d32ee 292 myICM.i2cControllerConfigurePeripheral ( 0, MAG_AK09916_I2C_ADDR, REG_ST1, 9, true, true, false, false, false );
saloutos 0:894b603d32ee 293 SERIAL_PORT.print(F("Configuring the magnetometer peripheral returned ")); SERIAL_PORT.println(myICM.statusString());
saloutos 0:894b603d32ee 294
saloutos 0:894b603d32ee 295 // Operate the I2C master in duty-cycled mode
saloutos 0:894b603d32ee 296 myICM.setSampleMode( (ICM_20948_Internal_Mst | ICM_20948_Internal_Gyr), ICM_20948_Sample_Mode_Cycled ); // options: ICM_20948_Sample_Mode_Continuous or ICM_20948_Sample_Mode_Cycled
saloutos 0:894b603d32ee 297 */
saloutos 0:894b603d32ee 298
saloutos 0:894b603d32ee 299 #ifdef __cplusplus
saloutos 0:894b603d32ee 300 }
saloutos 0:894b603d32ee 301 #endif /* __cplusplus */
saloutos 0:894b603d32ee 302
saloutos 0:894b603d32ee 303 #endif /* _ICM_20948_C_H_ */