Totry 发表于 2009-4-8 18:03:47

用CPLD做多路I2C选择器中的双向端口问题求解

使用EPM240做多路i2c器件间的总线选择,如M8用两条线连到CPLD,而CPLD用8条线分别连接到四组I2C总线上,如何实现这个功能?
SPI很简单,因为所有商品的方向都是固定的,但I2C的SDA线方向是动态的,即便是用inout方式下的端口也不容易控制方向(因为要用CPLD动态抓包来分析数据流向),各位高手有什么办法吗?

leacom 发表于 2009-4-8 18:28:08

另外用m8的io做总线选择信号和读写方向控制

Totry 发表于 2009-4-8 18:35:45

但这样以来所有的驱动都要修改了,比较麻烦了,能不能通过某种方法直接修改PIA连接呢?

Totry 发表于 2009-4-9 09:50:30

up下,继续求解

ilan2003 发表于 2009-4-9 09:57:49

ALTERA上有类似的代码你下载个参考下

Totry 发表于 2009-4-9 10:19:16

AP中没有类似的范例,早就找过啦
记得是有什么方法直接把两个IO给连到一起的,而不受其它部件影响,只不过是静态,不能动态修改

cddyy 发表于 2009-4-9 10:32:12

用连续赋值:assign sda = write? write_data :1'bz

在读入数据时:read_data <= sda

magician 发表于 2009-4-9 10:36:00

赞一下研究精神。
别费这个劲了,基本上cpld要把I2C的协议都实现,用的宏单元一大把,稳定性还是未知数呢。
用现成的吧。NXP的pca9544,一扩4路I2C,才不到8元。

Totry 发表于 2009-4-9 10:54:23

7楼正解啊!
感谢6楼,不过这种方法仍然需要预先知道数据流向的

不过还是幻想能用什么方法直接修改PIA连接,不过貌似是不可能的,因为240是eeprom型,烧好后连接也就定了,呵呵

dickhou 发表于 2009-4-15 20:40:30

个人觉得应该不难,例如USB的HUB,所传的数据也是双向的。其实电路并不复杂,只用一些触发器加少量的逻辑电路就行了。在这里假设共有5个IIC接口,不分主从(IIC本身是双向,而且应该都有地址识别功能,就算发给别的设备的数据出现在数据线上,如果地址不同,也不会响应),5个端口默认工作在查询状态(都为输入),任何一个端口检测到有数据线的变化,就向剩余的4个端口转发。然后在ACK位停止转发,又回到查询状态。假设其中的一个端口发送ACK状态,则又会检测到数据线的变化,并进行转发。重复此过程就行了。

Totry 发表于 2009-5-30 02:46:27

这个方法好!哈哈,多谢dickhou的方法

后来发现把问题想复杂了,IIC本来就是总线,还是直接连到一起,然后用CPLD去控制其地址和选通来得方便,最终采用了这个办法

JINBO515 发表于 2013-6-6 20:07:35

Totry 发表于 2009-5-30 02:46 static/image/common/back.gif
这个方法好!哈哈,多谢dickhou的方法

后来发现把问题想复杂了,IIC本来就是总线,还是直接连到一起,然后 ...

我现在也遇到这人问题,请教“用CPLD去控制其地址和选通”中的用CPLD去控制其地址怎么实现?谢谢
页: [1]
查看完整版本: 用CPLD做多路I2C选择器中的双向端口问题求解