微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 如何检测I2C的开始条件和结束条件?

如何检测I2C的开始条件和结束条件?

时间:10-02 整理:3721RD 点击:
如何检测I2C的开始条件和结束条件?
做I2C接口时一般大家是怎样检测其开始条件和结束条件的呢?在没有其他时钟可用的情况下,以下异步设计可以接受吗?
always@ (negedge scl_i or negedge sda_i)
        if(!scl_i)                        //采用了SCL作为复位端
                start<= 1'b0;
        else if(scl_i)
                start<= 1'b1;
               
always@ (negedge scl_i or posedge sda_i)
        if(!scl_i)                        //采用了SCL作为复位端
                stop<= 1'b0;
        else if(scl_i)
                stop<= 1'b1;
一般规范的I2C设计是不是要SCL的倍频时钟呢?

你这样是不行的。你的I2C的协议没有理解清楚。
开始条件是SDA为低,并且SCL由高到低
结束为sda为低,并且scl由低到高
通常i2c的clk为scl四倍,i2c的read write start stop restart分解在四个clk的完成。
做i2c最好看一下www.opencores.org 的 example 的 doc 说得很详细

你这样是不行的。你的I2C的协议没有理解清楚。
开始条件是SDA为低,并且SCL由高到低
结束为sda为低,并且scl由低到高
通常i2c的clk为scl四倍,i2c的read write start stop restart分解在四个clk的完成。
做i2c最好看一下www.opencores.org 的 example 的 doc 说得很详细

看看协议吧。

在SCL 线是高电平时SDA 线从高电平向低电平切换,这个情况表示起始条件。
当SCL 是高电平时SDA 线由低电平向高电平切换,表示停止条件。

    你好!不知道是我错了还是我读的文档错了,或者你记错了?我看的是中文版(周立功公司翻译的?)




   

是我把高写成了低,但你的问题在于
i2c是传输线,他是容易受到干扰。只要有一点电压不稳,就可能造成触发negedge scl_i or negedge sda_i。 所以I2C最好还是以双方约定速率,并且以高于速率四倍采样来得好。



    我明白你意思。
就是要用一个快时钟(》4倍)去采SDA,SCL的变化情况。



    你应该去看协议



    建议不要异步,建议用异步信号··同步释放··采用脉冲检验法···保证你slave模块同步性!



    2楼开始条件是错的!和结束条件!

    嗯,这是我主要担心的问题。我写的例子是异步电路,一直在想规范的I2C是不是应该有第三个快时钟。
你所说的异步信号同步释放怎么理解呢?应该也是用一个快两倍以上的时钟去采样SDA/SCL吧?
2楼的确是说反了。我还奇怪这么明显的错误为什么没有人指出来呢。
Anyway,谢谢大家的回复!



    对~你的理解是正确的~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top