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