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
- i2c的个人理解
- Linux I2C驱动个人理解(一)
- Linux I2C驱动个人理解(二)
- I2C协议的理解
- i2c subsystem 的个人总结
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 对I2C协议的理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 简单的I2C协议理解
- 对i2c子系统的理解
- 简单的I2C协议理解
- java webservice 天气服务接口
- python 机器学习算法实现 深度学习笔记
- 小波使用 2
- Oracle 游标示例
- C++ Primer Chapter 9-4
- i2c的个人理解
- jsp中的内容都消失了,已解决。
- 程序员做事方法以及思路
- 变量提升
- Sublime text 3最新版破解方法
- MySQL中的describe关键字
- 微信小程序中的position问题
- linux io storage stack之我的理解
- Linux 环境下C/C++获取系统时间 && 每隔500ms循环一次代码实现