Skip to content

Commit

Permalink
Merge pull request #85 from sparkfun/release_candidate
Browse files Browse the repository at this point in the history
v1.2.9
  • Loading branch information
PaulZC committed Dec 9, 2021
2 parents b27edc2 + a93f0df commit d5ae1eb
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 14 deletions.
2 changes: 0 additions & 2 deletions examples/Arduino/Example2_Advanced/Example2_Advanced.ino
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,6 @@ void setup()
SERIAL_PORT.println(myICM.statusString());
}

delay(1); // Give the ICM20948 time to change the sample mode (see issue #8)

// Set full scale ranges for both acc and gyr
ICM_20948_fss_t myFSS; // This uses a "Full Scale Settings" structure that can contain values for all configurable sensors

Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=SparkFun 9DoF IMU Breakout - ICM 20948 - Arduino Library
version=1.2.8
version=1.2.9
author=SparkFun Electronics <techsupport@sparkfun.com>
maintainer=SparkFun Electronics <sparkfun.com>
sentence=Use the low-power high-resolution ICM 20948 9 DoF IMU from Invensense with I2C or SPI. Version 1.2 of the library includes support for the InvenSense Digital Motion Processor (DMP™).
Expand Down
10 changes: 1 addition & 9 deletions src/ICM_20948.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ bool ICM_20948::isConnected(void)
ICM_20948_Status_e ICM_20948::setSampleMode(uint8_t sensor_id_bm, uint8_t lp_config_cycle_mode)
{
status = ICM_20948_set_sample_mode(&_device, (ICM_20948_InternalSensorID_bm)sensor_id_bm, (ICM_20948_LP_CONFIG_CYCLE_e)lp_config_cycle_mode);
delay(1); // Give the ICM20948 time to change the sample mode (see issue #8)
return status;
}

Expand Down Expand Up @@ -1704,16 +1705,7 @@ ICM_20948_Status_e ICM_20948_read_I2C(uint8_t reg, uint8_t *buff, uint32_t len,
_i2c->write(reg);
_i2c->endTransmission(false); // Send repeated start

uint32_t offset = 0;
uint32_t num_received = _i2c->requestFrom(addr, len);
// while(_i2c->available()){
// if(len > 0){
// *(buff + offset) = _i2c->read();
// len--;
// }else{
// break;
// }
// }

if (num_received == len)
{
Expand Down
54 changes: 53 additions & 1 deletion src/util/ICM_20948_C.c
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,26 @@ ICM_20948_Status_e ICM_20948_set_sample_mode(ICM_20948_Device_t *pdev, ICM_20948
{
return retval;
}

// Check the data was written correctly
retval = ICM_20948_execute_r(pdev, AGB0_REG_LP_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_LP_CONFIG_t));
if (retval != ICM_20948_Stat_Ok)
{
return retval;
}
if (sensors & ICM_20948_Internal_Acc)
{
if (reg.ACCEL_CYCLE != mode) retval = ICM_20948_Stat_Err;
}
if (sensors & ICM_20948_Internal_Gyr)
{
if (reg.GYRO_CYCLE != mode) retval = ICM_20948_Stat_Err;
}
if (sensors & ICM_20948_Internal_Mst)
{
if (reg.I2C_MST_CYCLE != mode) retval = ICM_20948_Stat_Err;
}

return retval;
}

Expand All @@ -646,6 +666,9 @@ ICM_20948_Status_e ICM_20948_set_full_scale(ICM_20948_Device_t *pdev, ICM_20948_
retval |= ICM_20948_execute_r(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
reg.ACCEL_FS_SEL = fss.a;
retval |= ICM_20948_execute_w(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
if (reg.ACCEL_FS_SEL != fss.a) retval |= ICM_20948_Stat_Err;
}
if (sensors & ICM_20948_Internal_Gyr)
{
Expand All @@ -654,6 +677,9 @@ ICM_20948_Status_e ICM_20948_set_full_scale(ICM_20948_Device_t *pdev, ICM_20948_
retval |= ICM_20948_execute_r(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
reg.GYRO_FS_SEL = fss.g;
retval |= ICM_20948_execute_w(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
if (reg.GYRO_FS_SEL != fss.g) retval |= ICM_20948_Stat_Err;
}
return retval;
}
Expand All @@ -674,6 +700,9 @@ ICM_20948_Status_e ICM_20948_set_dlpf_cfg(ICM_20948_Device_t *pdev, ICM_20948_In
retval |= ICM_20948_execute_r(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
reg.ACCEL_DLPFCFG = cfg.a;
retval |= ICM_20948_execute_w(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
if (reg.ACCEL_DLPFCFG != cfg.a) retval |= ICM_20948_Stat_Err;
}
if (sensors & ICM_20948_Internal_Gyr)
{
Expand All @@ -682,6 +711,9 @@ ICM_20948_Status_e ICM_20948_set_dlpf_cfg(ICM_20948_Device_t *pdev, ICM_20948_In
retval |= ICM_20948_execute_r(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
reg.GYRO_DLPFCFG = cfg.g;
retval |= ICM_20948_execute_w(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
if (reg.GYRO_DLPFCFG != cfg.g) retval |= ICM_20948_Stat_Err;
}
return retval;
}
Expand Down Expand Up @@ -709,6 +741,16 @@ ICM_20948_Status_e ICM_20948_enable_dlpf(ICM_20948_Device_t *pdev, ICM_20948_Int
reg.ACCEL_FCHOICE = 0;
}
retval |= ICM_20948_execute_w(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_ACCEL_CONFIG, (uint8_t *)&reg, sizeof(ICM_20948_ACCEL_CONFIG_t));
if (enable)
{
if (reg.ACCEL_FCHOICE != 1) retval |= ICM_20948_Stat_Err;
}
else
{
if (reg.ACCEL_FCHOICE != 0) retval |= ICM_20948_Stat_Err;
}
}
if (sensors & ICM_20948_Internal_Gyr)
{
Expand All @@ -724,6 +766,16 @@ ICM_20948_Status_e ICM_20948_enable_dlpf(ICM_20948_Device_t *pdev, ICM_20948_Int
reg.GYRO_FCHOICE = 0;
}
retval |= ICM_20948_execute_w(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
// Check the data was written correctly
retval |= ICM_20948_execute_r(pdev, AGB2_REG_GYRO_CONFIG_1, (uint8_t *)&reg, sizeof(ICM_20948_GYRO_CONFIG_1_t));
if (enable)
{
if (reg.GYRO_FCHOICE != 1) retval |= ICM_20948_Stat_Err;
}
else
{
if (reg.GYRO_FCHOICE != 0) retval |= ICM_20948_Stat_Err;
}
}
return retval;
}
Expand Down Expand Up @@ -2384,7 +2436,7 @@ ICM_20948_Status_e inv_icm20948_read_dmp_data(ICM_20948_Device_t *pdev, icm_2094
return result;
}

static uint8_t sensor_type_2_android_sensor(enum inv_icm20948_sensor sensor)
uint8_t sensor_type_2_android_sensor(enum inv_icm20948_sensor sensor)
{
switch (sensor)
{
Expand Down
2 changes: 1 addition & 1 deletion src/util/ICM_20948_C.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ extern int memcmp(const void *, const void *, size_t); // Avoid compiler warning
ICM_20948_Status_e inv_icm20948_set_dmp_sensor_period(ICM_20948_Device_t *pdev, enum DMP_ODR_Registers odr_reg, uint16_t interval);
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
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
static uint8_t sensor_type_2_android_sensor(enum inv_icm20948_sensor sensor);
uint8_t sensor_type_2_android_sensor(enum inv_icm20948_sensor sensor);
enum inv_icm20948_sensor inv_icm20948_sensor_android_2_sensor_type(int sensor);

ICM_20948_Status_e inv_icm20948_read_dmp_data(ICM_20948_Device_t *pdev, icm_20948_DMP_data_t *data);
Expand Down

0 comments on commit d5ae1eb

Please sign in to comment.