i2c的个人理解

来源:互联网 发布:怎么用c语言打印三角形 编辑:程序博客网 时间:2024/06/14 13:38

Android很多设备都是i2c接口,键盘、光感、罗盘、陀螺仪、摄像头,原生的linux系统对i2c子系统封装得很好,一般不会出问题,不需要自己研究底层协议。大部分情况调试i2c也不是一接入就可以,还是得结合波形观察。

地址:

每个i2c设备都有一个地址,我们通常说是7位地址,比如FT5X0X地址是0x5C,注册设备传入地址0x5C(0101 1101b),实际上底层通信是把这个地址左移一位再加上w/r位,w = 0,r=1,写地址就是0xB8,读地址0xB9。所以说这个设备是7位地址0x5C是对应上层说的,说是8位地址是对应底层协议说的。

   7 6 5 4 3 2 1       0

[slave address]     r/w 

底层地址表现方式:[0x5c<<1] | r/w


协议:

结合这个图说明,SDA是数据线,SCL线是时钟线,可以认为是脉冲。SCL、SDA电压2V,电压不足读写是不可能成功,注意时序。


开始:

SCL拉高,SDA从高往低拉。

停止:

SCL拉高,SDA从低往高拉。

重新开始:

SCL拉高,SDA从低往高拉,再从高往低拉,注意这个过程在一个周期内SCL高的时候执行。

数据传输----写:

主机将SCL低的时候,SDA才能变化,可以是高或者低,取决于写的数据。

数据传输-----读:

主机将SCL高的时候,读取SDA的高低。

响应:

主机/从机 每传8位数据后,从机/主机都要回复一个ack,在第9个时钟SCL拉高后,由从机/主机SDA拉低。第9个时钟后,SCL拉低后,对方释放SDA,也就是SDA变高。

不响应:

在第9个时钟,没检测到SDA低,可能对方在忙来不及回复或者读操作时候的最后一字节数据,可以等待再检测一次,也可以停止或者发出从新开始命令(Sr)。


下面是综合对上述的应用,也是协议的一部分。

写寄存器:

1、主机发起开始

2、发送写地址

3、等待ack

4、发送寄存器地址

5、等待ack

6、发送数据

7、等待ack

8、停止

需要多为数据,重复6、7步骤

8、主机发起停止

读寄存器:(这块验证不成功,读出来部分数据错误)

1、主机发起开始

2、发送写地址

3、等待ack

4、发送寄存器地址

5、等待ack

6、发送“开始”操作

7、发送读地址

8、等待ack

9、读sda数据

10、主机回复ack

11、多个数据重复9、10

12、最后一位数据是,主机回复noack,即拉高sda

13、主机发起停止

速率计算:

由SCL控制,比如下图一个周期5us,传输速率=1/(5us) == 200 Mbps



i2c标准速率:

标准模式:100k/bps

快速模式:400k/bps

高速模式:3.4M/bps

0 0
原创粉丝点击