ICM20948 DMP代码详解(36)
接前一篇文章:ICM20948 DMP代码详解(35)
上一回讲到了icm20948_sensor_setup() ---> inv_icm20948_initialize_auxiliary函数 ---> inv_icm20948_set_slave_compass_id函数,本回开始,就对于inv_icm20948_set_slave_compass_id函数进行解析。为了便于理解和回顾,再次贴出该函数源码,在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948DataBaseDriver.c中,如下:
int inv_icm20948_set_slave_compass_id(struct inv_icm20948 *s, int id)
{int result = 0;(void)id;//result = inv_icm20948_wakeup_mems(s);//if (result)// return result;inv_icm20948_prevent_lpen_control(s);activate_compass(s);inv_icm20948_init_secondary(s);// Set up the secondary I2C bus on 20630.inv_icm20948_set_secondary(s);//Setup Compassresult = inv_icm20948_setup_compass_akm(s);//Setup Compass mounting matrix into DMPresult |= inv_icm20948_compass_dmp_cal(s, s->mounting_matrix, s->mounting_matrix_secondary_compass);if (result)desactivate_compass(s);//result = inv_icm20948_sleep_mems(s);inv_icm20948_allow_lpen_control(s);return result;
}
inv_icm20948_set_slave_compass_id函数中调用了很多函数,一个一个来看。
1)inv_icm20948_prevent_lpen_control函数
代码片段如下:
inv_icm20948_prevent_lpen_control(s);
inv_icm20948_prevent_lpen_control函数在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948DataBaseDriver.c中,代码如下:
void inv_icm20948_prevent_lpen_control(struct inv_icm20948 *s)
{s->sAllowLpEn = 0;
}
这个函数和前文书讲过的inv_icm20948_allow_lpen_control函数是一对:
void inv_icm20948_allow_lpen_control(struct inv_icm20948 *s)
{s->sAllowLpEn = 1;inv_icm20948_set_chip_power_state(s, CHIP_LP_ENABLE, 1);
}
前一个是禁止低功耗模式,后一个是使能低功耗模式。当然,都只是设置结构体成员,并没有实际设置到寄存器中去。
2)activate_compass函数
activate_compass函数也在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948DataBaseDriver.c中,代码如下:
static void activate_compass(struct inv_icm20948 *s)
{s->s_compass_available = 1;
}
这个函数和下边的desactivate_compass函数是一对:
static void desactivate_compass(struct inv_icm20948 *s)
{s->s_compass_available = 0;
}
前一个是设置指南针(陀螺仪)可用状态,后一个是设置指南针(陀螺仪)不可用状态。当然,也都是只设置结构体成员,并没有实际设置到寄存器中去。
接下来是以下代码片段:
inv_icm20948_init_secondary(s);// Set up the secondary I2C bus on 20630.inv_icm20948_set_secondary(s);
这一段代码的解析,放在下一回中。