通过KXTF9-2050芯片分析I2C协议

2023-11-19

1、I2C协议

参见博客:《I2C通信协议详解和通信流程分析》

2、I2C驱动的框架分析

(1)驱动框架分为两层:物理层和协议层。物理层是通用的,取决于主设备;协议层则每个从设备都不同。
(2)物理层:物理层可以理解成通用层,就是上面的介绍的I2C协议,只要是I2C接口的传感器都遵守I2C协议,不同的I2C设备在物理层是相同的。
(3)协议层:每个设备的功能和寄存器都是不同的,主设备要和从设备通信,需要在I2C协议的基础上,还要根据从设备的通信协议。比如不同的从设备与不同的寄存器,对寄存器的操作顺序有先后的要求等。

3、传感器的接口

传感器接口分为模拟接口和数字接口
(1)模拟接口:模拟接口是用接口电平变化来作为输出的。譬如模拟接口的压力传感器,在压力不同时输出电平在0~3.3V范围内变化,每一个电压对应一个压力。SOC需要用AD接口来对接这种传感器对它输出的数据进行AD转换,转换得到数字电压值,再用数字电压值去校准得到压力值;
(2)数字接口:数字接口是后来发展出来的,数字接口的sensor是在模拟接口的sensor基础上,内部集成了AD转换,直接输出一个数字值的参数,这样SoC直接通过总线接口初始化、读取传感器输出的参数即可(譬如gsensor、电容触摸屏IC)。

4、芯片介绍

KXTF9-2050芯片是重力加速度传感器,用在手机、平板、智能手表等设备上,用来感受人的手的移动,获取一些运动的方向性信息用来给系统作为输入参量。比如前几年比较火的手机游戏就有通过手机的晃动幅度来控制游戏里的人物,其中就用到了重力加速度传感器。KXTF9-2050芯片功能比较单一,就是检测加速度变化的,都是作为从设备使用。

5、芯片定义的I2C通讯术语

在这里插入图片描述

(1)S:I2C协议里的开始信号;
(2)Sr:重复的开始信号,在和gsensor的一次通信过程中,可以有多个开始信号;
(3)SAD:从设备的地址,也急速gsensor自己在I2C总线上的地址;
(4)W:写标志位,表示主设备是要往gsensor寄存器里写数据;
(5)R:读标志位,表示主设备是要从gsensor寄存器里读数据;
(6)ACK:I2C协议里的ACK响应信号;
(7)NACK:不需要ACK响应信号;
(8)RA:gsensor中寄存器的地址;
(9)Data:主设备和gsensor通信中的有效数据;
(10)P:I2C协议中的停止位;

6、芯片在I2C总线上的地址

在这里插入图片描述

查询芯片手册可知,KXTF9-2050芯片的从设备地址是0b0001111,但是要注意从设备的地址是7位的。

7、主设备往KXTF9-2050芯片写数据

7.1、写单个字节

在这里插入图片描述

(1)主设备先发送起始信号,然后发送从设备地址+写标志位(0b00011110);
(2)gsonsor芯片发一个ACK信号;
(3)主设备发送要访问的gsensor内部寄存器的地址;
(4)gsonsor芯片发一个ACK信号;
(5)主设备发送要写入寄存器的数据;
(6)gsonsor芯片收到并发送一个ACK信号;
(7)主设备发送停止信号,结束本次通信;

7.2、写多个字节

在这里插入图片描述

(1)主设备先发送起始信号,然后发送从设备地址+写标志位(0b00011110);
(2)gsonsor芯片发一个ACK信号;
(3)主设备发送要访问的gsensor内部多个寄存器的基地址;
(4)gsonsor芯片发一个ACK信号;
(5)主设备发送要写入寄存器的数据;
(6)gsonsor芯片收到并发送一个ACK信号,gsensor会自动把要写入的寄存器地址增加,下次主设备发送过来的数据会写入下一个寄存器;
(7)主设备再次发送要写入寄存器的数据;
(8)gsensor芯片发送ACK信号;
(9)主设备发送完数据,发送停止信号,结束本次通信;

8、主设备从KXTF9-2050芯片读数据

8.1、读单个字节

在这里插入图片描述

(1)主设备先发送起始信号,然后发送从设备地址+写标志位(0b00011110);
(2)gsonsor芯片发一个ACK信号;
(3)主设备发送要访问的gsensor内部寄存器的地址;
(4)gsonsor芯片发一个ACK信号;
(5)主设备再次发送一个开始信号,然后发送从设备地址+读标志位(0b00011111);
(6)gsonsor芯片发一个ACK信号;
(7)gsonsor芯片发送对应寄存器的数据;
(8)主设备在ACK的时钟周期不需要回ACK信号;
(9)主设备发送停止信号;

8.2、读多个字节

在这里插入图片描述

(1)主设备先发送起始信号,然后发送从设备地址+写标志位(0b00011110);
(2)gsonsor芯片发一个ACK信号;
(3)主设备发送要访问的gsensor内部寄存器的基地址;
(4)gsonsor芯片发一个ACK信号;
(5)主设备再次发送一个开始信号,然后发送从设备地址+读标志位(0b00011111);
(6)gsonsor芯片发一个ACK信号;
(7)gsonsor芯片发送对应寄存器的数据,然后将寄存器的地址增加;
(8)主设备在ACK的时钟周期不需要回ACK信号;
(9)主设备发送ACK信号;
(10)从设备发送下一个寄存器的数据;
(11)在最后一次发送寄存器数据的时候,主设备不用回ACK信号;
(12)主设备发送停止信号;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过KXTF9-2050芯片分析I2C协议 的相关文章

  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https

随机推荐

  • STM32 高级定时器周期、频率、占空比、对外输出电压详解

    STM32 高级定时器 最近在研究电机 对TIM定时器研究了一些 将一些存在疑惑的问题 通过试验和示波器分析 得到以下结论 供大家学习参考 1 介绍输出电压高低判断 输出比较时 OC1对外输出电压为示波器可以读取的电压 也是我们最终使用的电
  • c语言 凯撒加密

    为了防止信息被别人轻易窃取 需要把电码明文通过加密方式变换成为密文 输入一个以回车符为结束标志的字符串 少于80个字符 再输入一个整数offset 用凯撒密码将其加密后输出 恺撒密码是一种简单的替换加密技术 将明文中的所有字母都在字母表上偏
  • 解决Docker容器中Mysql中文乱码问题

    进入容器 修改 etc mysql my cnf 添加如下配置 client port 3306 socket var lib mysql mysql sock default character set utf8 mysqld port
  • Microsoft Office 2010安装

    哈喽 大家好 今天一起学习的是office2010的安装 有兴趣的小伙伴也可以来一起试试手 一 测试演示参数 演示操作系统 Windows 7 不建议win10及以上操作系统使用 系统类型 64位 演示版本 SW DVD5 Office P
  • python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项

    一 python库camelot安装及使用中的一些注意事项 1 camelot方法有两种解析模式 流解析 stream 格子解析 lattice 其中格子解析能够保留表格完整的样式 对于复杂表格来说要优于流解析模式 同时 camelot方法
  • word2016怎么显示修改痕迹

    写需求文档时 想保留每次和产品沟通后修改的痕迹 避免扯皮 这就使用到了 word的审阅功能 1 点击 审阅 点击图中1的图片 点击高级选项进行修改内容的标记设置
  • 2022.04.11【读书笔记】

    文章目录 摘要 研究意义 转录组学意义 技术比较 研究方法 细胞筛选 文库构建 测序 实验方法 实验流程 常见问题 分析内容 重点 分析内容总览 细胞亚群分类 细胞类型频率统计 Marker基因分析 富集分析 样本差异分析 逆时分析 WGC
  • Java查询Mysql数据库时区问题(相差13/14)个小时

    一 CST GMT UTC 1 1 CST 这个代号缩写 并不是一个统一标准 目前 可以同时代表如下 4 个不同版本的时区概念 China Standard Time 中国标准时区 UTC 8 Cuba Standard Time 古巴标准
  • JAVA 泛型中的 的应用场景

    在JAVA 泛型中 经常看到
  • 《市场调查与分析》:在校大学生对微信小程序的使用情况

    目录 一 研究背景和目的 1 1调查背景 1 2调查目的 二 调查内容 三 调查方式 四 调查对象及范围 五 抽样设计 六 调查问卷 七 调查分析 7 1问卷数据 7 2问卷信度效度分析 7 3调查基本情况 八 调查结论 8 1小程序的使用
  • 【Python基础】Python中读取图片的6种方式

    Python进行图片处理 第一步就是读取图片 这里给大家整理了6种图片的读取方式 并将读取的图片装换成numpy ndarray 格式 首先需要准备一张照片 假如你有女朋友的话 可以用女朋友的 没有的话 那还学啥Python 赶紧找对象去吧
  • html修改display属性的值,web开发设计--JS的innerHTML/display属性

    1 innerHTML 属性 innerHTML 属性用于获取或替换 HTML 元素的内容 语法 Object innerHTML 注意 1 Object是获取的元素对象 如通过document getElementById ID 获取的元
  • 获取多选下拉框(select标签设置multiple属性)的值

  • 给elasticsearch设置密码

    1 在elasticsearch yml中添加如下配置 xpack security enabled true xpack license self generated type basic xpack security transprt
  • Redis 缓存穿透、缓存击穿和缓存雪崩

    目录 Redis 缓存穿透 缓存击穿和缓存雪崩 Redis 缓存穿透 查不到 Redis缓存穿透的解决方案 方案一 接口校验 方案二 缓存空对象 方案三 布隆过滤器 Redis 缓存击穿 Redis 缓存击穿的解决方案 Redis 缓存雪崩
  • 数据库系统原理——ER模型与关系模型

    犹记得第一次看 数据库系统原理 时看天书的感觉 云里雾里 现在已经是第二次参阅这本书了 顿时有所感悟 哦 原来是这样 现在呢 开窍了一点 写下来且当作为笔记 ER模型 ER模型的基本元素是 实体 联系和属性 实体 是一个数据对象 指应用中可
  • 第19课 微信小程序安装使用mpvue脚手架

    第19课 微信小程序安装使用mpvue脚手架 详情地址 http mpvue com mpvue quickstart 安装前检查环境 安装脚手架之前需要电脑已安装node与npm 首先按住 shift 鼠标右键 按下 在此处打开命令行窗口
  • 关于Redis数据过期策略

    1 Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间 返回1表明设置成功 返回0表明key不存在或者不能成功设置过期时间 在key上设置了过期时间后key将在指定的秒数后被自动删除 被指定了过
  • vsCode开发STM32设置头文件宏定义

    一 问题描述 使用 HAL 库新建 STM32 工程后 使用 vsCode 打开工程文件夹 会提示找不到头文件 以及比变量没有定义 如 uint32 t 不是一个有效类型等错误提示 如下图所示 二 原因分析 vsCode 中没有配置头文件路
  • 通过KXTF9-2050芯片分析I2C协议

    1 I2C协议 参见博客 I2C通信协议详解和通信流程分析 2 I2C驱动的框架分析 1 驱动框架分为两层 物理层和协议层 物理层是通用的 取决于主设备 协议层则每个从设备都不同 2 物理层 物理层可以理解成通用层 就是上面的介绍的I2C协