#ifndef __ICM42688P_H__ #define __ICM42688P_H__ #include "spi.h" #include "gpio.h" #include "sensors.h" //#define SPI_CS_Enable() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET) //#define SPI_CS_Disable() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET) // expected value in UB0_REG_WHO_AM_I reg #define WHO_AM_I 0x47 // Accesible from all user banks #define REG_BANK_SEL 0x76 // User Bank 0 #define UB0_REG_DEVICE_CONFIG 0x11 // break #define UB0_REG_DRIVE_CONFIG 0x13 #define UB0_REG_INT_CONFIG 0x14 // break #define UB0_REG_FIFO_CONFIG 0x16 // break #define UB0_REG_TEMP_DATA1 0x1D #define UB0_REG_TEMP_DATA0 0x1E #define UB0_REG_ACCEL_DATA_X1 0x1F #define UB0_REG_ACCEL_DATA_X0 0x20 #define UB0_REG_ACCEL_DATA_Y1 0x21 #define UB0_REG_ACCEL_DATA_Y0 0x22 #define UB0_REG_ACCEL_DATA_Z1 0x23 #define UB0_REG_ACCEL_DATA_Z0 0x24 #define UB0_REG_GYRO_DATA_X1 0x25 #define UB0_REG_GYRO_DATA_X0 0x26 #define UB0_REG_GYRO_DATA_Y1 0x27 #define UB0_REG_GYRO_DATA_Y0 0x28 #define UB0_REG_GYRO_DATA_Z1 0x29 #define UB0_REG_GYRO_DATA_Z0 0x2A #define UB0_REG_TMST_FSYNCH 0x2B #define UB0_REG_TMST_FSYNCL 0x2C #define UB0_REG_INT_STATUS 0x2D #define UB0_REG_FIFO_COUNTH 0x2E #define UB0_REG_FIFO_COUNTL 0x2F #define UB0_REG_FIFO_DATA 0x30 #define UB0_REG_APEX_DATA0 0x31 #define UB0_REG_APEX_DATA1 0x32 #define UB0_REG_APEX_DATA2 0x33 #define UB0_REG_APEX_DATA3 0x34 #define UB0_REG_APEX_DATA4 0x35 #define UB0_REG_APEX_DATA5 0x36 #define UB0_REG_INT_STATUS2 0x37 #define UB0_REG_INT_STATUS3 0x38 // break #define UB0_REG_SIGNAL_PATH_RESET 0x4B #define UB0_REG_INTF_CONFIG0 0x4C #define UB0_REG_INTF_CONFIG1 0x4D #define UB0_REG_PWR_MGMT0 0x4E #define UB0_REG_GYRO_CONFIG0 0x4F #define UB0_REG_ACCEL_CONFIG0 0x50 #define UB0_REG_GYRO_CONFIG1 0x51 #define UB0_REG_GYRO_ACCEL_CONFIG0 0x52 #define UB0_REG_ACCEL_CONFIG1 0x53 #define UB0_REG_TMST_CONFIG 0x54 // break #define UB0_REG_APEX_CONFIG0 0x56 #define UB0_REG_SMD_CONFIG 0x57 // break #define UB0_REG_FIFO_CONFIG1 0x5F #define UB0_REG_FIFO_CONFIG2 0x60 #define UB0_REG_FIFO_CONFIG3 0x61 #define UB0_REG_FSYNC_CONFIG 0x62 #define UB0_REG_INT_CONFIG0 0x63 #define UB0_REG_INT_CONFIG1 0x64 #define UB0_REG_INT_SOURCE0 0x65 #define UB0_REG_INT_SOURCE1 0x66 // break #define UB0_REG_INT_SOURCE3 0x68 #define UB0_REG_INT_SOURCE4 0x69 // break #define UB0_REG_FIFO_LOST_PKT0 0x6C #define UB0_REG_FIFO_LOST_PKT1 0x6D // break #define UB0_REG_SELF_TEST_CONFIG 0x70 // break #define UB0_REG_WHO_AM_I 0x75 // User Bank 1 #define UB1_REG_SENSOR_CONFIG0 0x03 // break #define UB1_REG_GYRO_CONFIG_STATIC2 0x0B #define UB1_REG_GYRO_CONFIG_STATIC3 0x0C #define UB1_REG_GYRO_CONFIG_STATIC4 0x0D #define UB1_REG_GYRO_CONFIG_STATIC5 0x0E #define UB1_REG_GYRO_CONFIG_STATIC6 0x0F #define UB1_REG_GYRO_CONFIG_STATIC7 0x10 #define UB1_REG_GYRO_CONFIG_STATIC8 0x11 #define UB1_REG_GYRO_CONFIG_STATIC9 0x12 #define UB1_REG_GYRO_CONFIG_STATIC10 0x13 // break #define UB1_REG_XG_ST_DATA 0x5F #define UB1_REG_YG_ST_DATA 0x60 #define UB1_REG_ZG_ST_DATA 0x61 #define UB1_REG_TMSTVAL0 0x62 #define UB1_REG_TMSTVAL1 0x63 #define UB1_REG_TMSTVAL2 0x64 // break #define UB1_REG_INTF_CONFIG4 0x7A #define UB1_REG_INTF_CONFIG5 0x7B #define UB1_REG_INTF_CONFIG6 0x7C // User Bank 2 #define UB2_REG_ACCEL_CONFIG_STATIC2 0x03 #define UB2_REG_ACCEL_CONFIG_STATIC3 0x04 #define UB2_REG_ACCEL_CONFIG_STATIC4 0x05 // break #define UB2_REG_XA_ST_DATA 0x3B #define UB2_REG_YA_ST_DATA 0x3C #define UB2_REG_ZA_ST_DATA 0x3D // User Bank 4 #define UB4_REG_APEX_CONFIG1 0x40 #define UB4_REG_APEX_CONFIG2 0x41 #define UB4_REG_APEX_CONFIG3 0x42 #define UB4_REG_APEX_CONFIG4 0x43 #define UB4_REG_APEX_CONFIG5 0x44 #define UB4_REG_APEX_CONFIG6 0x45 #define UB4_REG_APEX_CONFIG7 0x46 #define UB4_REG_APEX_CONFIG8 0x47 #define UB4_REG_APEX_CONFIG9 0x48 // break #define UB4_REG_ACCEL_WOM_X_THR 0x4A #define UB4_REG_ACCEL_WOM_Y_THR 0x4B #define UB4_REG_ACCEL_WOM_Z_THR 0x4C #define UB4_REG_INT_SOURCE6 0x4D #define UB4_REG_INT_SOURCE7 0x4E #define UB4_REG_INT_SOURCE8 0x4F #define UB4_REG_INT_SOURCE9 0x50 #define UB4_REG_INT_SOURCE10 0x51 // break #define UB4_REG_OFFSET_USER0 0x77 #define UB4_REG_OFFSET_USER1 0x78 #define UB4_REG_OFFSET_USER2 0x79 #define UB4_REG_OFFSET_USER3 0x7A #define UB4_REG_OFFSET_USER4 0x7B #define UB4_REG_OFFSET_USER5 0x7C #define UB4_REG_OFFSET_USER6 0x7D #define UB4_REG_OFFSET_USER7 0x7E #define UB4_REG_OFFSET_USER8 0x7F // BANK 1 // #define GYRO_CONFIG_STATIC2 0x0B #define GYRO_NF_ENABLE 0x00 #define GYRO_NF_DISABLE 0x01 #define GYRO_AAF_ENABLE 0x00 #define GYRO_AAF_DISABLE 0x02 // BANK 2 // #define ACCEL_CONFIG_STATIC2 0x03 #define ACCEL_AAF_ENABLE 0x00 #define ACCEL_AAF_DISABLE 0x01 #define gyrX() _gyr[0] #define gyrY() _gyr[1] #define gyrZ() _gyr[2] #define gyrX1() _gyr1[0] #define gyrY1() _gyr1[1] #define gyrZ1() _gyr1[2] #define accX() _acc[0] #define accY() _acc[1] #define accZ() _acc[2] #define accX1() _acc1[0] #define accY1() _acc1[1] #define accZ1() _acc1[2] #define X_AXIS 0 #define Y_AXIS 2 #define Z_AXIS 4 #define GYRO 0 #define ACCEL 1 #define ALL 5 #define FSR_0 0 #define FSR_1 1 #define FSR_2 2 #define FSR_3 3 #define FSR_4 4 #define FSR_5 5 #define FSR_6 6 #define FSR_7 7 #define ODR_32KHZ 1 #define ODR_16KHZ 2 #define ODR_8KHZ 3 #define ODR_4KHZ 4 #define ODR_2KHZ 5 #define ODR_1KHZ 6 #define ODR_200HZ 7 #define ODR_100HZ 8 #define ODR_50HZ 9 #define ODR_25KHZ 10 #define ODR_12_5KHZ 11 #define ODR_6_25KHZ 12 #define ODR_3_125HZ 13 #define ODR_1_5625HZ 14 #define ODR_500HZ 15 /** * @struct sAccelConfig0_t * @brief Register:Accel_Config0 * @n -------------------------------------------------------------------------------------------------------------------------------------- ------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | ACCEL_FS_SEL | Reserved | ACCEL_ODR | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n ACCEL_FS_SEL :Full scale select for accelerometer UI interface output * @n 000: ¡À16g (default) * @n 001: ¡À8g * @n 010: ¡À4g * @n 011: ¡À2g * @n 100: Reserved * @n 101: Reserved * @n 110: Reserved * @n 111: Reserved * @n ACCEL_ODR :Accelerometer ODR selection for UI interface output * @n 0000: Reserved * @n 0001: 32kHz (LN mode) * @n 0010: 16kHz (LN mode) * @n 0011: 8kHz (LN mode) * @n 0100: 4kHz (LN mode) * @n 0101: 2kHz (LN mode) * @n 0110: 1kHz (LN mode) (default) * @n 0111: 200Hz (LP or LN mode) * @n 1000: 100Hz (LP or LN mode) * @n 1001: 50Hz (LP or LN mode) * @n 1010: 25Hz (LP or LN mode) * @n 1011: 12.5Hz (LP or LN mode) * @n 1100: 6.25Hz (LP mode) * @n 1101: 3.125Hz (LP mode) * @n 1110: 1.5625Hz (LP mode) * @n 1111: 500Hz (LP or LN mode) */ typedef struct { uint8_t accelODR: 4; uint8_t reserved: 1; uint8_t accelFsSel: 3; } __attribute__ ((packed)) sAccelConfig0_t; /** * @struct sGyroConfig0_t * @brief Register:Gyro_Config0 * @n -------------------------------------------------------------------------------------------------------------------------------------- ------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | GYRO_FS_SEL | Reserved | GYRO_ODR | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n GYRO_FS_SEL : Full scale select for gyroscope UI interface output * @n 000: ¡À2000dps (default) * @n 001: ¡À1000dps * @n 010: ¡À500dps * @n 011: ¡À250dps * @n 100: ¡À125dps * @n 101: ¡À62.5dps * @n 110: ¡À31.25dps * @n 111: ¡À15.625dps * @n GYRO_ODR :Gyroscope ODR selection for UI interface output * @n 0000: Reserved * @n 0001: 32kHz * @n 0010: 16kHz * @n 0011: 8kHz * @n 0100: 4kHz * @n 0101: 2kHz * @n 0110: 1kHz (default) * @n 0111: 200Hz * @n 1000: 100Hz * @n 1001: 50Hz * @n 1010: 25Hz * @n 1011: 12.5Hz * @n 1100: Reserved * @n 1101: Reserved * @n 1110: Reserved * @n 1111: 500Hz */ typedef struct { uint8_t gyroODR: 4; uint8_t reserved: 1; uint8_t gyroFsSel: 3; } __attribute__ ((packed)) sGyroConfig0_t; /** * @struct sAccelConfig1_t * @brief Register:Accel_Config1 * @n -------------------------------------------------------------------------------------------------------------------------------------- ------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | Reserved | ACCEL_UI_FILT_ORD | ACCEL_DEC2_M2_ORD | Reserved | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n ACCEL_UI_FILT_ORD : Selects order of ACCEL UI filter * @n 00: 1st Order * @n 01: 2nd Order * @n 10: 3rd Order * @n 11: Reserved * @n ACCEL_DEC2_M2_ORD : Order of Accelerometer DEC2_M2 filter * @n 00: Reserved * @n 01: Reserved * @n 10: 3rd order * @n 11: Reserved */ typedef struct { uint8_t reserved: 1; uint8_t accelDec2M2ORD: 2; uint8_t accelUIFiltORD: 2; uint8_t reserved2: 3; } __attribute__ ((packed)) sAccelConfig1_t; /** * @struct sGyroAccelConfig0_t * @brief Register:Gyro_Accel_Config0 * @n -------------------------------------------------------------------------------------------------------------------------------------- ------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | ACCEL_UI_FILT_BW | GYRO_UI_FILT_BW | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n ACCEL_UI_FILT_BW : Bandwidth for Accel LPF * @n LN Mode: * @n 0 BW=ODR/2 * @n 1 BW=max(400Hz, ODR)/4 (default) * @n 2 BW=max(400Hz, ODR)/5 * @n 3 BW=max(400Hz, ODR)/8 * @n 4 BW=max(400Hz, ODR)/10 * @n 5 BW=max(400Hz, ODR)/16 * @n 6 BW=max(400Hz, ODR)/20 * @n 7 BW=max(400Hz, ODR)/40 * @n 8 to 13: Reserved * @n 14 Low Latency option: Trivial decimation @ ODR of Dec2 filter output. Dec2 * @n runs at max(400Hz, ODR) * @n 15 Low Latency option: Trivial decimation @ ODR of Dec2 filter output. Dec2 * @n runs at max(200Hz, 8*ODR) * @n LP Mode: * @n 0 Reserved * @n 1 1x AVG filter (default) * @n 2 to 5 Reserved * @n 6 16x AVG filter * @n 7 to 15 Reserved * @n GYRO_UI_FILT_BW :Bandwidth for Gyro LPF * @n LN Mode: * @n 0 BW=ODR/2 * @n 1 BW=max(400Hz, ODR)/4 (default) * @n 2 BW=max(400Hz, ODR)/5 * @n 3 BW=max(400Hz, ODR)/8 * @n 4 BW=max(400Hz, ODR)/10 * @n 5 BW=max(400Hz, ODR)/16 * @n 6 BW=max(400Hz, ODR)/20 * @n 7 BW=max(400Hz, ODR)/40 * @n 8 to 13: Reserved * @n 14 Low Latency option: Trivial decimation @ ODR of Dec2 filter output. Dec2 runs at max(400Hz, ODR) * @n 15 Low Latency option: Trivial decimation @ ODR of Dec2 filter output. Dec2 runs at max(200Hz, 8*ODR) */ typedef struct { uint8_t gyroUIFiltBW: 4; uint8_t accelUIFiltBW: 4; } __attribute__ ((packed)) sGyroAccelConfig0_t; /** * @struct sGyroConfig1_t * @brief Register:Gyro_Config1 * @n -------------------------------------------------------------------------------------------------------------------------------------- ------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | TEMP_FILT_BW | reserved | GYRO_UI_FILT_ORD | GYRO_DEC2_M2_ORD | * @n ---------------------------------------------------------------------------------------------------------------------------------------------------------- * @n TEMP_FILT_BW : Set the bandwidth of the temperature signal DLPF * @n 000: DLPF BW = 4000Hz; DLPF Latency = 0.125ms (default) * @n 001: DLPF BW = 170Hz; DLPF Latency = 1ms * @n 010: DLPF BW = 82Hz; DLPF Latency = 2ms * @n 011: DLPF BW = 40Hz; DLPF Latency = 4ms * @n 100: DLPF BW = 20Hz; DLPF Latency = 8ms * @n 101: DLPF BW = 10Hz; DLPF Latency = 16ms * @n 110: DLPF BW = 5Hz; DLPF Latency = 32ms * @n 111: DLPF BW = 5Hz; DLPF Latency = 32ms * @n GYRO_UI_FILT_ORD :Selects order of GYRO UI filter * @n 00: 1st Order * @n 01: 2nd Order * @n 10: 3rd Order * @n 11: Reserved * @n GYRO_DEC2_M2_ORD :Selects order of GYRO DEC2_M2 Filter * @n 00: Reserved * @n 01: Reserved * @n 10: 3rd Order * @n 11: Reserved */ typedef struct { uint8_t gyroDec2M2ODR: 2; uint8_t gyroUIFiltODR: 2; uint8_t reserved: 1; uint8_t agyroFiltBW: 3; } __attribute__ ((packed)) sGyroConfig1_t; /** * @struct sAccelConfigStatic4_t * @brief Register:Accel_Config_Static4 * @n -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | ACCEL_AAF_BITSHIFT | ACCEL_AAF_DELTSQR[11:8] | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n ACCEL_AAF_BITSHIFT Controls bandwidth of the accelerometer anti-alias filter * @n ACCEL_AAF_DELTSQR[11:8] Controls bandwidth of the accelerometer anti-alias filter */ typedef struct { uint8_t accelAAFDeltsqr: 4; uint8_t accelAAFBitshift: 4; } __attribute__ ((packed)) sAccelConfigStatic4_t; /** * @struct sAccelConfigStatic2_t * @brief Register:Accel_Config_Static2 * @n -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | Reserved | ACCEL_AAF_DELT | ACCEL_AAF_DIS | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n ACCEL_AAF_DELT Controls bandwidth of the accelerometer anti-alias filter * @n ACCEL_AAF_DIS 0: Enable accelerometer anti-aliasing filter (default) * @n 1: Disable accelerometer anti-aliasing filter */ typedef struct { uint8_t accelAAFDis: 1; uint8_t accelAAFDelt: 6; uint8_t reserved: 1; } __attribute__ ((packed)) sAccelConfigStatic2_t; /** * @struct sGyroConfigStatic2_t * @brief Register:Gyro_Config_Static2 * @n -------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ * @n | Reserved | GYRO_AAF_DIS | GYRO_NF_DIS | * @n ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ * @n GYRO_AAF_DIS :0: Enable gyroscope anti-aliasing filter (default) * @n 1: Disable gyroscope anti-aliasing filter * @n GYRO_NF_DIS 0: Enable Notch Filter (default) * @n 1: Disable Notch Filter */ typedef struct { uint8_t gyroNFDis: 1; uint8_t gyroAAFDis: 1; uint8_t reserved: 6; } __attribute__ ((packed)) sGyroConfigStatic2_t; /** * @struct sGyroConfigStatic5_t * @brief Register:Gyro_Config_Static5 * @n -------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ * @n | GYRO_AAF_BITSHIFT | GYRO_AAF_DELTSQR[11:8] | * @n ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ * @n GYRO_AAF_BITSHIFT :Controls bandwidth of the gyroscope anti-alias filter * @n GYRO_AAF_DELTSQR[11:8] Controls bandwidth of the gyroscope anti-alias filter */ typedef struct { uint8_t gyroAAFDeltsqr: 4; uint8_t gyroAAFBitshift: 4; } __attribute__ ((packed)) sGyroConfigStatic5_t; /** * @struct sGyroConfigStatic9_t * @brief Register:Gyro_Config_Static9 * @n -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- * @n | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n | Reserved | GYRO_Z_NF_COSWZ_SEL[0] | GYRO_Y_NF_COSWZ_SEL[0] | GYRO_X_NF_COSWZ_SEL[0] | GYRO_Z_NF_COSWZ[8] | GYRO_Y_NF_COSWZ[8] | GYRO_X_NF_COSWZ[8] | * @n ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * @n GYRO_Z_NF_COSWZ_SEL[0] :Used for gyroscope Z-axis notch filter frequency selection * @n GYRO_Y_NF_COSWZ_SEL[0] :Used for gyroscope Y-axis notch filter frequency selection * @n GYRO_X_NF_COSWZ_SEL[0] :Used for gyroscope X-axis notch filter frequency selection * @n GYRO_Z_NF_COSWZ[8] :Used for gyroscope Z-axis notch filter frequency selection * @n GYRO_Y_NF_COSWZ[8] :Used for gyroscope Y-axis notch filter frequency selection * @n GYRO_X_NF_COSWZ[8] :Used for gyroscope X-axis notch filter frequency selection */ typedef struct { uint8_t gyroNFCoswzX8: 1; uint8_t gyroNFCoswzY8: 1; uint8_t gyroNFCoswzZ8: 1; uint8_t gyroNFCoswzSelX: 1; uint8_t gyroNFCoswzSelY: 1; uint8_t gyroNFCoswzSelZ: 1; uint8_t reserved:2; } __attribute__ ((packed)) sGyroConfigStatic9_t; enum GyroFS{ dps2000 = 0x00, dps1000 = 0x01, dps500 = 0x02, dps250 = 0x03, dps125 = 0x04, dps62_5 = 0x05, dps31_25 = 0x06, dps15_625 = 0x07 }; enum AccelFS{ gpm16 = 0x00, gpm8 = 0x01, gpm4 = 0x02, gpm2 = 0x03 }; extern float _acc[3]; extern float _gyr[3]; extern float _acc1[3]; extern float _gyr1[3]; extern float _accelScale; extern float _gyroScale; int ICM42688Begin(void); int ICM42688_readRegisters(uint8_t subAddress, uint8_t* dest,uint8_t len); int8_t ICM42688_Init(void); int ICM42688_GetData(IMU_Data *mIMU_Data); int getAGT(void); #endif