I2c slave将SCL主动拉低

【原文 http://blog.sina.com.cn/s/blog_6582c5f30102v9ic.html】

 I2C总线的SCL同步时钟脉冲一般都是由主控器发出作为串行数据的移位脉冲。每当SDA上出现一位稳定的数据后,在SCL上发送一个高电平的移位脉冲。

 http://wenku.baidu.com/view/f9c215da7f1922791688e8d8.html?re=view

5.1 SCL信号的同步
如果被控器希望主控器降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主控器,当主控器在准备下一次传送发现SCL的电平被拉低时就进行等待直至被控器完成操作并释放SCL线的控制控制权。这样以来,主控器实际上受到被控器的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步。

 

5.2  I2
C总线上的总线仲裁
如果在同一个I2C总线系统中存有两个主控器,其时钟信号分别为SCK1、SCK2,它们都具有控制总线的能力。假设两者都开始要控制总线进行通信,由于“线与”的作用,实际的SCL的波形如图7.6所示。在总线做出仲裁之前,两个主控器都会以“线与”的形式共同参与SCL线的使用,速度快的主控器1等待落后的主控器2。

 
图7.6  SCL信号的同步
图7.7 I2C总线上的总线仲裁时序图


对于SDA线上的信号的使用,两个主控器同样也是按照“线与”的逻辑来影响SDA上的电平变化。假设主控器1要发送的数据DATA1为“101……”;主控器2要发送的数据DATA2为“1001……”。总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0”),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此主控器2就成为总线的唯一主宰者。 

① 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
② 各个主控器没有对总线实施控制的优先级别;

③总线控制随即而定,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。

 

 根据上面的描述,“时钟同步”与“总线仲裁”可以总结如下规律:
①主控器通过检测SCL上的电平来调节与从器件的速度同步问题——时钟同步;

②主控器通过检测SDA上自身发送的电平来判断是否发生总线“冲突”——总线仲裁。

因此,I2C总线的“时钟同步”与“总线仲裁”是靠器件自身接口的特殊结构得以实现的。


你可能感兴趣的:(芯片驱动)