找回密码
 注册
搜索
查看: 1710|回复: 16

[讨论] I2C的一些疑惑

[复制链接]
发表于 2010-1-4 16:47:37 | 显示全部楼层 |阅读模式
最近调I2C设备,该设备读的时候不用指定寄存器地址,我很奇怪,如果不指定地址,它是如何知道要上哪读数据的呢?
该设备写的时候,也不需要一个字节指定写的地址,而是在写数据的高两位指定。对于I2C salve设备,每个设备对接收到的数据处理时不相同的,这个是写在由芯片里的驱动决定的吗?
我如何能确定数据被正确的写到了slave设备对应的寄存器上?
希望大家多多指教,不甚感激!
发表于 2010-1-4 21:38:57 | 显示全部楼层
I2C只是個通道,至於協議如何訂定,主要是看Host及Device之間。~~
点评回复

使用道具 举报

发表于 2010-1-5 13:37:18 | 显示全部楼层
slave addr肯定要的吧,至于reg access看slave端定义的msg fmt就可以了.i2c设备内部有 addr counter ,可能每次读都从一个固定的地址.举个例子,要访问0x05的reg,你要从0x00一直读到0x05.(读到buffer中),然后从buffer中读取你要的内容,msg format i2c规范中没有指定的,i2c规范只定义了诸如start,stop,restart,ack,nack的timming .slave adrr(7/10bit)以及不同速率的硬件电器特性.

个人见解
调试的方法:示波器就可以了.熟悉一下规范,再动手调试一下.掌握了,就很简单了.
点评回复

使用道具 举报

发表于 2010-1-5 13:43:55 | 显示全部楼层
想要确定读写是否正确,读:读有default value的reg,看是否与spec相同.写:写rw reg,再读回来,看是否正确,就可以了啊.
记得仔细研读i2c设备的spec,特别是host与slave之间的交互规则.每个设备的规则都有微小差异.
点评回复

使用道具 举报

 楼主| 发表于 2010-1-5 16:22:35 | 显示全部楼层
以下是引用reisky_zlh在2010-1-5 13:43:55的发言:
想要确定读写是否正确,读:读有default value的reg,看是否与spec相同.写:写rw reg,再读回来,看是否正确,就可以了啊.
记得仔细研读i2c设备的spec,特别是host与slave之间的交互规则.每个设备的规则都有微小差异.


这个器件,只有一个寄存器是可读的,但是没有给出寄存器地址。所有写的寄存器,都是 write only的,那我怎么知道我有没有写成功,或者有没有读成功呢?
点评回复

使用道具 举报

发表于 2010-1-6 13:08:19 | 显示全部楼层
我的msn是reisky_zlh@hotmail.com,可以交流一下.
点评回复

使用道具 举报

 楼主| 发表于 2010-1-6 15:47:49 | 显示全部楼层
以下是引用reisky_zlh在2010-1-6 13:08:19的发言:
我的msn是reisky_zlh@hotmail.com,可以交流一下.

我加你了
点评回复

使用道具 举报

发表于 2010-1-7 10:08:52 | 显示全部楼层
我也加你了啊,没上线?
点评回复

使用道具 举报

发表于 2010-1-8 21:55:07 | 显示全部楼层
我也碰到这种情况了,比如在FM芯片(RDA5802,RTC6802)的IIC通信中,就这样没有指定读写的位置。原来是从某个固定位置操作的?明天去验证下
点评回复

使用道具 举报

发表于 2010-1-27 20:06:39 | 显示全部楼层
slave设备内部会处理的,比如FM器件RDA580X系列,器件存在默认的读寄存器起始地址和写寄存器起始地址。在读的时候需要把从起始到目标的内存全部读出,写的时候要把起始到目标的所有寄存器都写值。
I2C协议本身在读写的时候是需要指定寄存器地址的。
点评回复

使用道具 举报

发表于 2010-1-28 09:16:25 | 显示全部楼层
受教了,呵呵 [em01]
点评回复

使用道具 举报

发表于 2010-6-3 09:32:11 | 显示全部楼层
看起来不错哦。。谢谢楼主分享
点评回复

使用道具 举报

发表于 2010-6-10 10:35:47 | 显示全部楼层
学习了!
点评回复

使用道具 举报

发表于 2010-6-10 19:33:14 | 显示全部楼层
人好 生活就美好
点评回复

使用道具 举报

发表于 2010-6-12 16:05:31 | 显示全部楼层
楼主高手。
点评回复

使用道具 举报

发表于 2010-6-12 17:03:26 | 显示全部楼层
肯定是指定了,在确定一下,目前MTK很多用的是模拟I2C的!
点评回复

使用道具 举报

发表于 2010-6-13 21:38:55 | 显示全部楼层
以下是引用reisky_zlh在2010-1-5 13:37:18的发言:
slave addr肯定要的吧,至于reg access看slave端定义的msg fmt就可以了.i2c设备内部有 addr counter ,可能每次读都从一个固定的地址.举个例子,要访问0x05的reg,你要从0x00一直读到0x05.(读到buffer中),然后从buffer中读取你要的内容,msg format i2c规范中没有指定的,i2c规范只定义了诸如start,stop,restart,ack,nack的timming .slave adrr(7/10bit)以及不同速率的硬件电器特性.

个人见解
调试的方法:示波器就可以了.熟悉一下规范,再动手调试一下.掌握了,就很简单了.



从中受益!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-15 16:34 , Processed in 0.047548 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表