Modified Arduino library for ICM_20948 IMU for Nucleo boards
util/ICM_20948_C.h@0:894b603d32ee, 2022-01-31 (annotated)
- 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?
User | Revision | Line number | New 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_ */ |