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

news/2024/11/7 22:35:30/

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)主设备发送停止信号;


http://www.ppmy.cn/news/622436.html

相关文章

洛谷B2050题解

三角形判断 又到了玩球的时间了 #include <iostream> using namespace std; int main(){int a,b,c;cin >> a >> b >> c;if(ab>c&&bc>a&&ca>b)//ture的条件。cout << 1;//tureelse//其他情况。cout << 0;//false…

洛谷B2050 三角形判断

三角形判断 题目描述 给定三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;判断这三条线段能否构成一个三角形。 输入格式 输入共一行&#xff0c;包含三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;数与数之间以一个空格分开。&#xff08;三条边的…

hdu2050

添加链接描述 #include<bits/stdc.h> using namespace std; int f[10001]; int main() {int c,n;f[1]2;f[2]7;for(int i3;i<10001;i) f[i]f[i-1]4*(i-1)1;cin>>c;while(c--){cin>>n;cout<<f[n]<<endl;}return 0; }

杭电OJ2050——折线分割平面(递推)C语言解析

题目传送门 折线分割平面 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53300 Accepted Submission(s): 34887 Problem Description 我们看到过很多直线分割平面的题目&#xff0c;今天的这个题目稍微有些变化&am…

c语言 error2050,c语言程序设计20509new.doc

c语言程序设计20509new.doc 【程序】题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;1.程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去       掉不满…

杭电2050(C++)

杭电2050 题目 AC代码 1 #include<stdio.h>2 int main()3 {4 int n, i, sum ;5 while(scanf("%d",&n)!EOF)6 {7 while(n--)8 {9 scanf("%d",&i) ; 10 sum 2*(i*i)-i 1; 11 …

2050 Programming Competition

【1001】开场白 Problem Description 来自世界各地的年青人在 https://2050.org.cn 握手团聚&#xff0c; 他们是航空航天的新生代&#xff0c;编程大赛的优胜者&#xff0c;35岁以下的创新者&#xff0c;科技公司的创始人&#xff0c;展望未来的科学家&#xff0c;天马行空的…

hdu 2050

折线分割平面 #include<bits/stdc.h> using namespace std; #define MAXN 10001 long long f[MAXN]; int main() {int n,m,i;scanf("%d",&n);f[1]2;for(i2;i<MAXN;i)f[i]f[i-1]4*(i-1)1;for(i0;i<n;i){scanf("%d",&m);printf("%…