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

ICM20948 DMP代码详解(37)

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

 

上一回开始分析icm20948_sensor_setup() ---> inv_icm20948_initialize_auxiliary函数 ---> 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_init_secondary(s);// Set up the secondary I2C bus on 20630.inv_icm20948_set_secondary(s);

3)inv_icm20948_init_secondary函数

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

void inv_icm20948_init_secondary(struct inv_icm20948 *s)
{s->secondary_state.slv_reg[0].addr = REG_I2C_SLV0_ADDR;s->secondary_state.slv_reg[0].reg  = REG_I2C_SLV0_REG;s->secondary_state.slv_reg[0].ctrl = REG_I2C_SLV0_CTRL;s->secondary_state.slv_reg[0].d0   = REG_I2C_SLV0_DO;s->secondary_state.slv_reg[1].addr = REG_I2C_SLV1_ADDR;s->secondary_state.slv_reg[1].reg  = REG_I2C_SLV1_REG;s->secondary_state.slv_reg[1].ctrl = REG_I2C_SLV1_CTRL;s->secondary_state.slv_reg[1].d0   = REG_I2C_SLV1_DO;s->secondary_state.slv_reg[2].addr = REG_I2C_SLV2_ADDR;s->secondary_state.slv_reg[2].reg  = REG_I2C_SLV2_REG;s->secondary_state.slv_reg[2].ctrl = REG_I2C_SLV2_CTRL;s->secondary_state.slv_reg[2].d0   = REG_I2C_SLV2_DO;s->secondary_state.slv_reg[3].addr = REG_I2C_SLV3_ADDR;s->secondary_state.slv_reg[3].reg  = REG_I2C_SLV3_REG;s->secondary_state.slv_reg[3].ctrl = REG_I2C_SLV3_CTRL;s->secondary_state.slv_reg[3].d0   = REG_I2C_SLV3_DO;/* Make sure that by default all channels are disabled To not inherit from a previous configuration from a previous run*/inv_icm20948_secondary_stop_channel(s, 0);inv_icm20948_secondary_stop_channel(s, 1);inv_icm20948_secondary_stop_channel(s, 2);inv_icm20948_secondary_stop_channel(s, 3);
}

REG_I2C_SLV0_ADDR等相关的宏在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Defs.h中,定义如下:

#define REG_I2C_SLV0_ADDR       (BANK_3 | 0x03)
#define REG_I2C_SLV0_REG        (BANK_3 | 0x04)
#define REG_I2C_SLV0_CTRL       (BANK_3 | 0x05)
#define REG_I2C_SLV0_DO         (BANK_3 | 0x06)#define REG_I2C_SLV1_ADDR       (BANK_3 | 0x07)
#define REG_I2C_SLV1_REG        (BANK_3 | 0x08)
#define REG_I2C_SLV1_CTRL       (BANK_3 | 0x09)
#define REG_I2C_SLV1_DO         (BANK_3 | 0x0A)#define REG_I2C_SLV2_ADDR       (BANK_3 | 0x0B)
#define REG_I2C_SLV2_REG        (BANK_3 | 0x0C)
#define REG_I2C_SLV2_CTRL       (BANK_3 | 0x0D)
#define REG_I2C_SLV2_DO         (BANK_3 | 0x0E)#define REG_I2C_SLV3_ADDR       (BANK_3 | 0x0F)
#define REG_I2C_SLV3_REG        (BANK_3 | 0x10)
#define REG_I2C_SLV3_CTRL       (BANK_3 | 0x11)
#define REG_I2C_SLV3_DO         (BANK_3 | 0x12)#define REG_I2C_SLV4_CTRL       (BANK_3 | 0x15)

对应ICM20948芯片手册中的以下内容:

663af272fbaa4649ad9ab2de4c16180f.png

d3c337139007424b851ccb68857b37d9.png

这里I2C_SLV0~I2C_SLV3的各个寄存器都是一个意思,因此只以I2C_SLV0_XXX寄存器为例进行解析。

1feef7ea89cd470eb73abc9116ab8180.png

3a6dd260388148d0a9583452610dae86.png

1847d84d46ed48d795cfec8abc48b67d.png

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

int inv_icm20948_secondary_stop_channel(struct inv_icm20948 *s, int index)
{return inv_icm20948_write_single_mems_reg(s, s->secondary_state.slv_reg[index].ctrl, 0);
}

s->secondary_state.slv_reg[index].ctrl对应的就是上边REG_I2C_SLVx_CTRL,把CTRL寄存器中的所有位都清零,也就是I2C_SLVx_EN、I2C_SLVx_BYTE_SW、I2C_SLVx_REG_SW、I2C_SLVx_GRP、I2C_SLVx_LENG[3:0]。

3a6dd260388148d0a9583452610dae86.png

综合来看,inv_icm20948_init_secondary函数的功能正如其注释中所说:确保默认情况下禁用所有(I2C SLAVE)通道,不从上次运行的先前配置继承。

7481d9120cf34bfab5957185df810d29.png

8b5d83d3cc3e4ad090b0f41c77f53a31.png

……

b6bd42d56e184da1b7939b00ca94397a.png

至此,inv_icm20948_init_secondary函数就解析完了。下一回继续后续内容的解析。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MyBatis】Java 数据持久层框架:认识 MyBatis
  • js进阶——作用域闭包
  • 【JS代码规范】如何优化if-else代码规范
  • 【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
  • 【C++篇】引领C++模板初体验:泛型编程的力量与妙用
  • ElasticSearch学习笔记
  • FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
  • 「C++系列」动态内存
  • 超越sora,最新文生视频CogVideoX-5b模型分享
  • ChatGPT 在国内使用的方法
  • aws 容器镜像仓库操作
  • 数据结构——二叉搜索树
  • Java调用数据库 笔记05(查询篇)
  • 植物大战僵尸【源代码分享+核心思路讲解】
  • 【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ES6语法详解(一)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript 基本功--面试宝典
  • Linux中的硬链接与软链接
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • windows下mongoDB的环境配置
  • 从0实现一个tiny react(三)生命周期
  • 工作手记之html2canvas使用概述
  • 前嗅ForeSpider教程:创建模板
  • 如何胜任知名企业的商业数据分析师?
  • 算法系列——算法入门之递归分而治之思想的实现
  • No resource identifier found for attribute,RxJava之zip操作符
  • FaaS 的简单实践
  • mysql面试题分组并合并列
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​人工智能书单(数学基础篇)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #pragma预处理命令
  • #QT(一种朴素的计算器实现方法)
  • #window11设置系统变量#
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)(1.11) SiK Radio v2(一)
  • (C++20) consteval立即函数
  • (C11) 泛型表达式
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (LeetCode C++)盛最多水的容器
  • (回溯) LeetCode 46. 全排列
  • (力扣题库)跳跃游戏II(c++)
  • (南京观海微电子)——I3C协议介绍
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四) 虚拟摄像头vivi体验
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .net 7 上传文件踩坑