I2C从机响应的问题
第9个时钟slave发出响应至sda,master在第9个时钟判断slave发出的响应
第9个时钟从机才发送,主机在第9个时钟能判断吗?而且你说的端口是用的三态端口(sdi,sdo,)还是就一根inout 的sda?
主机在第9个时钟可以判断,而且必须在这个时钟对从机的响应做判断。
对于芯片外部的端口来说 sda 是inout的。对于芯片内部的逻辑来说分开为 sda_in 和 sda_out
下降沿数据变化,上升沿数据采样和判断,没问题的
我能不能这样理解:在主机芯片内部,sda_in是从从机发过来的响应,sda_out是主机发出的数据。在第9个时钟时,从机响应,sda_in就为0,(其它时候一直保持为1)。同时在第9个时钟时,主机发送的sda_out线是不是就该置为1呢?
你说的那个原理我理解,就是在SCL上升沿时去判断SDA是0还是1.但具体实现时还是不知道咋处理。是不是在主机中要去检测SCL的上升沿?但是SCL是在主机中一步一步产生的,咋个检测呢?能否说得详细些?
差不多吧....第9个时钟读取sda_in 上状态,看是否正确响应;主机读从机响应的时候主机的sda_out处于无效状态(1);
还有一点就是要好好理解一下inout端口的三态结构。
嗯,我刚查了下三态门的使用。看到这样说法“在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。”
上面这段话里说只有在顶层的时候用态实现,那对于I2C的主机和从机来说,顶层是分别指主机的顶层,和从机的顶层,还是指主机和从机一起的顶层?
i2c的响应处理是:master产生时钟,sda发送数据,当发完第8个时钟沿的数据时,将该inout端口置为高阻('z')状态,然后再第9个时钟沿检测slave是不是在sda置高电平,如果是,就表示收到响应了。
这个是说存在inout端口的模块最好放在你建立的FPGA工程的顶层,当然主机和从机都是inout类型的端口,都要放在顶层了。而且I2C本来就是个对外的接口,放在顶层也不是很困难的事。
嗯,谢谢,我看了好多inout端口的使用方法。
当然是master的顶层用一个inout, slave的顶层用一个inout
仿真的时候mater顶层的inout端口和slave相应的inout端口连接;而且要注意仿真时候双向口进行上拉......
请问你说的“仿真时候双向口进行上拉”,是什么意思?既然直接是将顶层的master 和顶层的slave的双响口相连,还要作何处理?
今天我在仿真时想起个问题,在master和slave顶层文件中有控制信号控制sda为输出时(即是sda=(sda_oen)?sda_o:1'bz),那个控制信号(sda_oen)是分别在master和slave中产生的吧?相互之间不受影响吧?只管在各自的模块中产生相应的值吗?
sda_oen 这个使能信号在master 和 slave中 各自都有。
因为sda是三态总线结构 ,没有被使能时是高阻的 ,而i2c无效状态sda为高电平,所以你需要在仿真的时候使用pullup(sda) 进行上拉...
我想应该可以的吧
就直接在testbench里的任意位置写pullup(sda),不用在其它限定条件下?我的意思就是不用if(.....)pullup(sda),不用受主机和从机中的sda_oen的限制吗?
直接 pullup(sda) 就行了,这就相当于模拟实际电路板上需要接上拉电阻的情形。你可以看一看pullup的使用方法...
好的,非常谢谢你的解答。
在主机和从机之间是用SDA、SCL总线连接的,而中间会有一个模拟电路,其为OC门或OD门结构,由于有VCC和上拉电阻,所以默认情况总线为高,而时钟一直是由主机发送,故当你传输1时不需要控制SDA,当你传输零时只需把SDA拉低就可以了(当你需要用占用SDA总线时你只需要拉低SDA_o即可)。因此,在第九个时钟时你只需要释放SDA总线即可(主机:把SDA_o拉高 释放总线,这时从机会把SDA总线拉低 占用总线,把低电平即应答传输过来)。总的来说:不论是主机或者是从机,sda_o拉低占用总线,拉高释放总线,想要对方占用总线,本方必须首先要释放总线。
好东西
正解
