关于I2C 从机的设计问题
设计中使用系统内部的较快时钟去采样SCL和SDA(4倍频以上),通过打两拍得到稳定的SCL_in和SDA_in。
在收数据时,通过检测SCL_in的上升沿采SDA_in的值。
但是问题来了,从机需要发出响应,而且响应必须在SCL低电平时改变SDA的值,因为SCL_in被打两拍了,如果通过检测SCL_in的下降沿时间点去驱动SDA,就有可能出现SDA改变的时刻为下一个SCL高电平,就违反协议要求了。
请问各位大侠,这个问题该怎么解决啊?谢谢了
你把可能变成不可能。
额 大侠 请指教。
见链接 http://bbs.eetop.cn/thread-475852-1-1.html
七楼代码
这个是i2c master的代码。 Master控制着SCL,所以master可以准确的知道SCL低电平,不存在这个问题啊。
Slave需要判断SCL低电平的时间点。
感觉好诡异。你确定不会有sda总线控制出现冲突?
增加采样频率,低电平至少三拍,第一拍检测到低电平,第二拍输出sda数据,第三拍保证时序(离scl高电平有一定时间)。
或者在sda输出端使用Latch,使能用scl下降沿检测的标志。
举个例子 主机寻址从机,发完8bit的地址+W/R后,主机会在第8个SCL下降沿释放SDA,此时,从机在SCL低电平将SDA拉低,并保持至下一个SCL下降沿后,从机释放SDA。这个过程可以实现对主机ack响应。
如果用内部时钟检测SCL下降沿,那么至少需要打两拍得到SCL_ff,再打一拍得到SCL_fff,通过这两个信号来确定下降沿。
一旦时钟频率相对与总线频率不是那么高,假设4倍,那么系统检测到的这个下降沿时间点就可能已经处在SCL的高电平时期了。
此时已经错过SCL低电平周期,就不能驱动SDA发出ACK了。
不知道这样描述是否正确,求指点。
按照协议为准,要不会出错
我觉得你可以将SCL与SDA用快速的时钟同时采进来,不需要延迟两拍。再输出应答信号。
你把采样始终弄4倍以上呗
不过SDA、SCL和内部的快速时钟是异步的啊,异步信号不是需要至少打两拍才能消除亚稳态嘛?
采样时钟频率时SCL的四倍,也不能满足检测SCL下降沿的时间点处在SCL的低电平周期吧。感觉至少要8倍。不知道对不对啊。
采样时钟越快你i2c能达到的速度越快,具体几倍我也不知道,你可以自己算算,再加上setup,hold。同步的做法必须要采样时钟,不过保险,不过因为scl有毛刺什么引起错误。
SCL低电平下你要打两拍,万一因为SCL时钟抖动问题少采到一拍怎么办。我看按你说的就八倍频,采四拍吧!
