打印

求助!I2C器件的热插拔问题!

[复制链接]
4497|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kuliuyisi|  楼主 | 2007-5-6 12:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
chunyang| | 2007-5-6 14:07 | 只看该作者

I2C的热插拔并不是真正的热插拔

与USB不同,I2C只能做到硬件准许热插拔,但软件加载无法自动实现,I2C标准中没有相关内容,你需要在底层引入直接控制才行。

使用特权

评论回复
板凳
yewuyi| | 2007-5-6 14:45 | 只看该作者

嘿嘿,SCL/SDA锁死的问题又来了……

使用特权

评论回复
地板
kuliuyisi|  楼主 | 2007-5-6 22:27 | 只看该作者

我使用PCA9511这样的支持热插拔的I2C缓冲器行吗?

加了缓冲器后,在热插拔时,对总线电容没有大的影响,就可支持热插拔了,软件还会出现2楼所说的软件无法自动加载吗?我该如何做才能实现真正的热插拔呢?

使用特权

评论回复
5
chunyang| | 2007-5-7 07:47 | 只看该作者

USB规范已要求了软件的自动加载

但I2C没有,你得自己在底层编程才行,否则仅能保证物理热插拔不会损坏器件,但无法实现功能上的热插拔,这还需软件的支持,PC平台本身是不够的。

使用特权

评论回复
6
kuliuyisi|  楼主 | 2007-5-7 12:23 | 只看该作者

I2C的底层编程指的是什么?

是不是在底层控制SCL、SDA,比如SCL高电平时SDA的下降沿启动传输等这样的控制吗?还需要什么软件的控制?为何PC平台本身不够?
能否这样实现I2C的热插拔:插上I2C器件后,利用USB的控制寄存器模拟一次断电,然后重枚举的过程,这样是不是就相当于不是热插拔了?不知道不是实际断开连接然后重新加载USB固件行不行。
您有没有什么好的建议呢?谢谢!

使用特权

评论回复
7
chunyang| | 2007-5-7 16:21 | 只看该作者

I2C不能自动侦测新“终端”的接入

得用软件不断侦听或加入自动检测电路,在检测到新终端接入后才加载固件程序。

使用特权

评论回复
8
kuliuyisi|  楼主 | 2007-5-7 19:28 | 只看该作者

谢谢,您让我了解了问题的原因及解决办法

但是我现在只是知道需要用软件侦听或加入自动检测电路,但是如何侦听及如何加入自动检测电路还是很茫然,您能告诉我具体该如何做吗?或者有没有示例?
你说检测到新终端接入后才加载固件程序,这个固件程序是指USB的固件程序吗?

使用特权

评论回复
9
chunyang| | 2007-5-7 20:02 | 只看该作者

具体方法需要好好研究一下器件

器件手册上应有详细时序描述,如果不能通过器件本身解决问题,最好的方法是引入一附加的MCU,而用MCU解决的方法思路就很多了,比如该MCU作为I2C的中介或者用MCU来侦测新接入的I2C设备等等。

使用特权

评论回复
10
kuliuyisi|  楼主 | 2007-5-7 21:49 | 只看该作者

器件本身应该是不行的

USB通过I2C发送数据的过程本来就符合I2C规范,I2C从器件也符合I2C规范,器件本身还有什么好研究的?
通过MCU侦听倒是可行的方案,USB接口芯片AN2131本身就带一个8051,但是不知道如何侦听新接入的I2C从器件,反正是不能再通过I2C接口发送数据来侦听了,愿闻其详!

使用特权

评论回复
11
chunyang| | 2007-5-7 22:40 | 只看该作者

用MCU通过代码不断进行主动查询,判断是否有特定数据返回

使用特权

评论回复
12
kuliuyisi|  楼主 | 2007-5-8 12:57 | 只看该作者

通过MCU去查询,从器件会返回什么数据呢?

所有的从器件(I2C I/O扩展器件PCA9501)都仅仅通过SCL、SDA两根线和MCU相连,MUC要去主动查询数据,也必须通过这两根线,即MCU需要通过其I2C接口或使用I/O模拟I2C往总线上发数据,也需要根据I2C规范来发,还是输入热插拔的情况,行不通吧!再说我使用的PCA9501是接收I2C数据然后转换成8位并行数据输出,相对于MCU而言,该器件仅仅是接收,能返回什么数据给MCU呢?
我有两个方法,不知道行不行
1、控制AN2131QC模拟一次断电的过程,复位。这种情况输入软复位或硬复位的过程,固件应该在一上电就下载了,也许再复位也不行。
2、使用一个继电器,MCU通过I/O控制继电器,一旦I2C从器件插上后,先断开继电器,然后再闭合,就是一次真正的断电-上电-固件下载的过程了,每插一个从器件都进行此过程,应该是可行的吧,呵呵。是不是很笨的办法?

使用特权

评论回复
13
chunyang| | 2007-5-8 13:38 | 只看该作者

你没有理解而已

MCU作为I2C的主设备,平时不断发起对从设备的通讯,如果从设备不存在,返回的数值永远是IO的固定偏置,而从设备一旦接到I2C上,返回的就不再是原值了,然后据此将I2C转交给USB即可。

使用特权

评论回复
14
kuliuyisi|  楼主 | 2007-5-9 12:48 | 只看该作者

可是我的I2C总线上接了很多个从部件啊

在一个从部件往总线上插的时候,上边可能已经存在很多从部件了,这时返回的数据还有什么不同吗?

使用特权

评论回复
15
computer00| | 2007-5-9 13:25 | 只看该作者

I2C设备不是有地址的么?地址不对,没有设备会响应的

所以你查询的时候,即便有其它设备,它们也不会应答的。找个讲I2C协议的手册好好看看吧.

使用特权

评论回复
16
chunyang| | 2007-5-9 13:42 | 只看该作者

楼上所言正确

楼主必须针对热插拔的那个设备编程。

使用特权

评论回复
17
kuliuyisi|  楼主 | 2007-5-9 23:01 | 只看该作者

看来只能加一个额外的MCU了

不过我还是不想额外加一个MCU,还是想通过软件上解决问题。
在每个从部件上都加一个I2C缓冲器不知道行不行。

使用特权

评论回复
18
kuliuyisi|  楼主 | 2007-5-9 23:12 | 只看该作者

在总线上和每个I2C从器件上都加一个I2C缓冲器应该可行吧!

看如下内容:
热插拔I2C和SMBus缓冲器PCA9513和PCA9514主要应用在cPCI、VME、AsvancedTCA卡和需要从操作系统中热插拔的其他多点背板,能允许I/O卡能直接插入带电的背板而不会对数据和时钟总线有影响,提供双向缓冲,保持背板和卡电容绝缘。
对于PICMG背板应用,在用上拉电阻的情况下,PCA9513向SCLIN和SDAIN提供92μA的电流源。当卡插入和拔出时,包括电流源在内的RC时间常数保持不变。只要引脚电压大于Vcc,电流源就是高阻抗的。
也就是说采用了缓冲器后是可以实现热插拔的,既然不会对数据和时钟造成什么影响,软件也就能实现热插拔了,还需要底层控制什么呢?不知道我理解的对不对!

使用特权

评论回复
19
chunyang| | 2007-5-10 10:06 | 只看该作者

你还是没有理解

加缓冲器何益?导致问题的本质你还是没有理解,你怎么能让主设备知道某个从设备是否加载了。

使用特权

评论回复
20
kuliuyisi|  楼主 | 2007-5-10 12:44 | 只看该作者

我的I2C从部件仅仅是接收数据,主机怎么会知道呢?

具体我的应用而言:
我的I2C从设备仅仅是接收USB单片机发送的数据,没有返回任何数据,即使没有热插拔,主设备就知道从设备已经加载了吗?应该还是热插拔的时候导致的SCL、SDA复位导致的,既然加了缓冲器可以避免这个问题,就不该出现I2C发送数据错误了吧!
请赐教!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

113

帖子

0

粉丝