当前位置: 首页 > article >正文

ICM20948 DMP代码详解(38)

接前一篇文章:ICM20948 DMP代码详解(37)

 

上一回继续解析inv_icm20948_set_slave_compass_id函数,解析了第3段代码,本回解析接下来的代码。为了便于理解和回顾,再次贴出该函数源码,在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 Compass
	result = inv_icm20948_setup_compass_akm(s);
 
	//Setup Compass mounting matrix into DMP
	result |= 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;
}

4)inv_icm20948_set_secondary函数

代码片段如下:

	// Set up the secondary I2C bus on 20630.
	inv_icm20948_set_secondary(s);

inv_icm20948_set_secondary函数在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948DataBaseDriver.c,代码如下:

/**
*  @brief      Set up the secondary I2C bus on 20630.
*  @param[in]  MPU state varible
*  @return     0 if successful.
*/
int inv_icm20948_set_secondary(struct inv_icm20948 *s)
{
	int r = 0;
	static uint8_t lIsInited = 0;

	if(lIsInited == 0)
    {
		r  = inv_icm20948_write_single_mems_reg(s, REG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR);
		r |= inv_icm20948_write_single_mems_reg(s, REG_I2C_MST_ODR_CONFIG, MIN_MST_ODR_CONFIG);

		lIsInited = 1;
	}

	return r;
}

REG_I2C_MST_CTRL、BIT_I2C_MST_P_NSR、REG_I2C_MST_ODR_CONFIG宏在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Defs.h中,定义如下:

/* bank 3 register map */
#define REG_I2C_MST_ODR_CONFIG  (BANK_3 | 0x0)

#define REG_I2C_MST_CTRL        (BANK_3 | 0x01)
#define BIT_I2C_MST_P_NSR               0x10

#define REG_I2C_MST_DELAY_CTRL  (BANK_3 | 0x02)

4109d01fc9fd4ff99c3fc421e4c354df.png

835bd08bfa134024a7c5f021d95291b9.png

448cddd0030e4050bf002dbce92e55bc.png

eb7494dc1a4a4de5b6a2b2b787938991.png

MIN_MST_ODR_CONFIG宏在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Defs.h中,定义如下:

#define MIN_MST_ODR_CONFIG       4

综上,以下代码片段的意思是:

r  = inv_icm20948_write_single_mems_reg(s, REG_I2C_MST_CTRL, BIT_I2C_MST_P_NSR);

写I2C_MST_CTRL寄存器的值为0x10,即I2C_MST_CLK[3:0]设置为0b0000;

93e76d6eabe64b42af74328660a74112.png

 MULT_MST_EN位为0;I2C_MST_P_NSR位为1。

以下代码片段的意思是:

		r |= inv_icm20948_write_single_mems_reg(s, REG_I2C_MST_ODR_CONFIG, MIN_MST_ODR_CONFIG);

写I2C_MST_ODR_CONFIG寄存器的值为4(0x04),即I2C_MST_ODR_CONFIG[3:0]设置为0b0000。

同时,设置lIsInited变量的值为1。

至此,inv_icm20948_set_secondary函数就解析完了。inv_icm20948_set_slave_compass_id函数后续内容的解析请看下回。

 


http://www.kler.cn/a/315880.html

相关文章:

  • 网络原理-网络层和数据链路层
  • 【Java Web】Ajax 介绍及 jQuery 实现
  • git命令提交项目
  • Leecode刷题C语言之统计好节点的数目
  • linux常见资源查询命令(持续更新)
  • 低代码牵手 AI 接口:开启智能化开发新征程
  • go libreoffice word 转pdf
  • 耦合微带线单元的网络参量和等效电路公式推导
  • C++在线开发服务器环境搭建
  • 记一次docker打包部署历程
  • openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群
  • Linux下实现ls命令的功能
  • 【C++】—— stack queue deque
  • 数据库三范式和ER图详解
  • 一种新的电子邮件攻击方式:AiTM
  • 【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架
  • 音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现
  • 详解 FFmpeg 中的 -map 选项
  • Qt-QLineEdit输入类控件(29)
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】011 - 第一个用户空间进程 init 进程 第一阶段初始化过程 源码分析
  • poi生成的ppt,powerPoint打开提示内容错误解决方案
  • 论文阅读:A Generalization of Transformer Networks to Graphs
  • [JavaEE] 网络初识(网络通信 及 TCP / UDP / IP 封装分用 )
  • 强大的重命名工具 | Bulk Rename Utility v4.0 便携版
  • 【Linux】入门【更详细,带实操】
  • flask + vue