如何检测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,谢谢大家的回复!
对~你的理解是正确的~
