Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
C
Comp2215 Pico Alarm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
jma1g20
Comp2215 Pico Alarm
Commits
86d6ab86
Commit
86d6ab86
authored
3 years ago
by
jma1g20
Browse files
Options
Downloads
Patches
Plain Diff
Upload New File
parent
e9030462
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
lib/ICM20948.h
+180
-0
180 additions, 0 deletions
lib/ICM20948.h
with
180 additions
and
0 deletions
lib/ICM20948.h
0 → 100644
+
180
−
0
View file @
86d6ab86
#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
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment