接前一篇文章:ICM20948 DMP代码详解(16)
前一篇文章讲到了inv_icm20948_set_chip_power_state函数中尚需解析的3个函数中的第1个函数:inv_icm20948_write_single_mems_reg_core。并没有完全讲完,本回继续解析。为了便于理解和回顾,再次贴出该函数源码,在在C:\Users\ns\Ykq\eMD-SmartMotion-ICM20948-1.1.1\EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Transport.c中,如下:
/**
* @brief Write single byte of data to a register on MEMs with no power control
* @param[in] Register address
* @param[in] Data to be written
* @return 0 if successful.
*/
int inv_icm20948_write_single_mems_reg_core(struct inv_icm20948 *s, uint16_t reg, const uint8_t data)
{
int result = 0;
unsigned char regOnly = (unsigned char)(reg & 0x7F);
result |= inv_set_bank(s, reg >> 7);
result |= inv_icm20948_write_reg(s, regOnly, &data, 1);
return result;
}
这个函数本身实际上已经解析完了,先设置bank,后写bank中的寄存器。
但是传入该函数的参数并没有完全交代清楚,这里说明一下。在inv_icm20948_set_chip_power_state函数中,调用inv_icm20948_write_single_mems_reg_core函数的代码如下:
status = inv_icm20948_write_single_mems_reg_core(s, REG_PWR_MGMT_1, s->base_state.pwr_mgmt_1);
REG_PWR_MGMT_1宏在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Defs.h中定义,如下:
#define REG_PWR_MGMT_1 (BANK_0 | 0x06)
对应于ICM20948手册中的PWR_MGMT_1寄存器,如下所示:
前文讲到,在inv_icm20948_set_chip_power_state函数中有awitch,两个case对应了不同的位,分别是BIT_SLEEP和BIT_LP_EN。这两个宏定义和上边的REG_PWR_MGMT_1是在一起的,代码如下:
#define REG_PWR_MGMT_1 (BANK_0 | 0x06)
#define BIT_H_RESET 0x80
#define BIT_SLEEP 0x40
#define BIT_LP_EN 0x20
#define BIT_CLK_PLL 0x01
对应到芯片手册中,就是上边PWR_MGMT_1寄存器的SLEEP位(bit6)和LP_EN位(bit5)。
至此,inv_icm20948_write_single_mems_reg_core函数就解析完了。
inv_icm20948_set_chip_power_state函数中尚需解析的其余两个函数:inv_icm20948_get_lpen_control函数和inv_icm20948_sleep_100us函数,放在下一回解析。