diff --git a/lib/ICM20948.h b/lib/ICM20948.h new file mode 100644 index 0000000000000000000000000000000000000000..0b4c76583f49a9d7a63a58d49bb1ecc80bd55204 --- /dev/null +++ b/lib/ICM20948.h @@ -0,0 +1,180 @@ +#ifndef _ICM20948_H_ +#define _ICM20948_H_ + +#include <hardware/i2c.h> + +#include <math.h> + +// typedef uint8_t bool; +#define true 1 +#define false 0 + +#define ICM20948_DEVICE 0X00 + +/* define ICM-20948 Device I2C address*/ +#define I2C_ADD_ICM20948 0x68 +#define I2C_ADD_ICM20948_AK09916 0x0C +#define I2C_ADD_ICM20948_AK09916_READ 0x80 +#define I2C_ADD_ICM20948_AK09916_WRITE 0x00 + +/* define ICM-20948 Register */ +/* user bank 0 register */ +#define REG_ADD_WIA 0x00 // WIA : WHO_AM_I +#define REG_VAL_WIA 0xEA +#define REG_ADD_USER_CTRL 0x03 +#define REG_VAL_BIT_DMP_EN 0x80 +#define REG_VAL_BIT_FIFO_EN 0x40 +#define REG_VAL_BIT_I2C_MST_EN 0x20 +#define REG_VAL_BIT_I2C_IF_DIS 0x10 +#define REG_VAL_BIT_DMP_RST 0x08 +#define REG_VAL_BIT_DIAMOND_DMP_RST 0x04 +#define REG_ADD_PWR_MIGMT_1 0x06 +#define REG_VAL_ALL_RGE_RESET 0x80 +#define REG_VAL_RUN_MODE 0x01 // Non low-power mode +#define REG_ADD_LP_CONFIG 0x05 +#define REG_ADD_PWR_MGMT_1 0x06 +#define REG_ADD_PWR_MGMT_2 0x07 +#define REG_ADD_ACCEL_XOUT_H 0x2D +#define REG_ADD_ACCEL_XOUT_L 0x2E +#define REG_ADD_ACCEL_YOUT_H 0x2F +#define REG_ADD_ACCEL_YOUT_L 0x30 +#define REG_ADD_ACCEL_ZOUT_H 0x31 +#define REG_ADD_ACCEL_ZOUT_L 0x32 +#define REG_ADD_GYRO_XOUT_H 0x33 +#define REG_ADD_GYRO_XOUT_L 0x34 +#define REG_ADD_GYRO_YOUT_H 0x35 +#define REG_ADD_GYRO_YOUT_L 0x36 +#define REG_ADD_GYRO_ZOUT_H 0x37 +#define REG_ADD_GYRO_ZOUT_L 0x38 +#define REG_ADD_EXT_SENS_DATA_00 0x3B +#define FIFO_EN_1 0x66 +#define FIFO_EN_2 0x67 +#define ACCEL_FIFO_EN +#define GYRO_Z_FIFO_EN +#define GYRO_Y_FIFO_EN +#define GYRO_X_FIFO_EN +#define TEMP_FIFO_EN + +#define REG_ADD_REG_BANK_SEL 0x7F +#define REG_VAL_REG_BANK_0 0x00 +#define REG_VAL_REG_BANK_1 0x10 +#define REG_VAL_REG_BANK_2 0x20 +#define REG_VAL_REG_BANK_3 0x30 + +#define FIFO_COUNT_H 0x70 +#define FIFO_COUNT_L 0x71 + +/* user bank 1 register */ +/* user bank 2 register */ +#define REG_ADD_GYRO_SMPLRT_DIV 0x00 +#define REG_ADD_GYRO_CONFIG_1 0x01 +#define REG_VAL_BIT_GYRO_DLPCFG_2 0x10 /* bit[5:3] */ +#define REG_VAL_BIT_GYRO_DLPCFG_4 0x20 /* bit[5:3] */ +#define REG_VAL_BIT_GYRO_DLPCFG_6 0x30 /* bit[5:3] */ +#define REG_VAL_BIT_GYRO_FS_250DPS 0x00 /* bit[2:1] */ +#define REG_VAL_BIT_GYRO_FS_500DPS 0x02 /* bit[2:1] */ +#define REG_VAL_BIT_GYRO_FS_1000DPS 0x04 /* bit[2:1] */ +#define REG_VAL_BIT_GYRO_FS_2000DPS 0x06 /* bit[2:1] */ +#define REG_VAL_BIT_GYRO_DLPF 0x01 /* bit[0] */ +#define REG_ADD_ACCEL_SMPLRT_DIV_1 0x10 +#define REG_ADD_ACCEL_SMPLRT_DIV_2 0x11 +#define REG_ADD_ACCEL_CONFIG 0x14 +#define REG_VAL_BIT_ACCEL_DLPCFG_2 0x10 /* bit[5:3] */ +#define REG_VAL_BIT_ACCEL_DLPCFG_4 0x20 /* bit[5:3] */ +#define REG_VAL_BIT_ACCEL_DLPCFG_6 0x30 /* bit[5:3] */ +#define REG_VAL_BIT_ACCEL_FS_2g 0x00 /* bit[2:1] */ +#define REG_VAL_BIT_ACCEL_FS_4g 0x02 /* bit[2:1] */ +#define REG_VAL_BIT_ACCEL_FS_8g 0x04 /* bit[2:1] */ +#define REG_VAL_BIT_ACCEL_FS_16g 0x06 /* bit[2:1] */ +#define REG_VAL_BIT_ACCEL_DLPF 0x01 /* bit[0] */ + +/* user bank 3 register */ +#define REG_ADD_I2C_SLV0_ADDR 0x03 +#define REG_ADD_I2C_SLV0_REG 0x04 +#define REG_ADD_I2C_SLV0_CTRL 0x05 +#define REG_VAL_BIT_SLV0_EN 0x80 +#define REG_VAL_BIT_MASK_LEN 0x07 +#define REG_ADD_I2C_SLV0_DO 0x06 +#define REG_ADD_I2C_SLV1_ADDR 0x07 +#define REG_ADD_I2C_SLV1_REG 0x08 +#define REG_ADD_I2C_SLV1_CTRL 0x09 +#define REG_ADD_I2C_SLV1_DO 0x0A +/* define ICM-20948 Register end */ + +/* define ICM-20948 MAG Register */ +#define REG_ADD_MAG_WIA1 0x00 +#define REG_VAL_MAG_WIA1 0x48 +#define REG_ADD_MAG_WIA2 0x01 +#define REG_VAL_MAG_WIA2 0x09 +#define REG_ADD_MAG_ST2 0x10 +#define REG_ADD_MAG_DATA 0x11 +#define REG_ADD_MAG_CNTL2 0x31 +#define REG_VAL_MAG_MODE_PD 0x00 +#define REG_VAL_MAG_MODE_SM 0x01 +#define REG_VAL_MAG_MODE_10HZ 0x02 +#define REG_VAL_MAG_MODE_20HZ 0x04 +#define REG_VAL_MAG_MODE_50HZ 0x05 +#define REG_VAL_MAG_MODE_100HZ 0x08 +#define REG_VAL_MAG_MODE_ST 0x10 +/* define ICM-20948 MAG Register end */ + +#define MAG_DATA_LEN 6 + +typedef enum { + IMU_EN_SENSOR_TYPE_NULL = 0, + IMU_EN_SENSOR_TYPE_ICM20948, + IMU_EN_SENSOR_TYPE_MAX +} IMU_EN_SENSOR_TYPE; + +typedef struct imu_st_angles_data_tag { + float fYaw; + float fPitch; + float fRoll; +} IMU_ST_ANGLES_DATA; + +typedef struct imu_st_sensor_data_tag { + int16_t s16X; + int16_t s16Y; + int16_t s16Z; +} IMU_ST_SENSOR_DATA; + +typedef struct icm20948_st_avg_data_tag { + uint8_t u8Index; + int16_t s16AvgBuffer[8]; +} ICM20948_ST_AVG_DATA; + + +void imuAHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, + float mx, float my, float mz); +float invSqrt(float x); + +void icm20948init(); +bool icm20948GyroRead(float *ps16X, float *ps16Y, float *ps16Z); +bool icm20948AccelRead(float *ps16X, float *ps16Y, float *ps16Z); +bool icm20948MagRead(float *ps16X, float *ps16Y, float *ps16Z); +bool icm20948MagCheck(void); +void icm20948CalAvgValue(uint8_t *pIndex, int16_t *pAvgBuffer, int16_t InVal, + int32_t *pOutVal); +void icm20948GyroOffset(); +void icm20948ReadSecondary(uint8_t u8I2CAddr, uint8_t u8RegAddr, uint8_t u8Len, + uint8_t *pu8data); +void icm20948WriteSecondary(uint8_t u8I2CAddr, uint8_t u8RegAddr, + uint8_t u8data); +bool icm20948Check(); + +bool reserved_addr(uint8_t addr); + +void imuInit(IMU_EN_SENSOR_TYPE *penMotionSensorType); + +void I2C_WriteOneByte(uint8_t reg, uint8_t value); +char I2C_ReadOneByte(uint8_t reg); + +int dataReady(); +bool imuDataGet(IMU_ST_ANGLES_DATA *pstAngles, + IMU_ST_SENSOR_DATA *pstGyroRawData, + IMU_ST_SENSOR_DATA *pstAccelRawData, + IMU_ST_SENSOR_DATA *pstMagnRawData); +void setContinuousMode(); + + +#endif //_ICM20948_H_ \ No newline at end of file