关于I2C(三):仲裁和时钟发生

1.同步化

        所有主机在SCL线上生成自己的时钟,以在I2C总线上传输消息。 数据仅在时钟的高电平期间有效。 因此,为了进行逐位仲裁过程,需要一个定义的时钟。时钟同步是通过I2C接口与SCL线的线与连接执行的,这意味着SCL线上从高到低的跳变将导致相关设备开始计算其低电平周期,并且一旦设备时钟变为 低电平,它将SCL线保持在该状态,直到达到时钟高电平状态为止。但是,如果另一个时钟仍在其LOW周期内,则此时钟从LOW到HIGH的转变可能不会改变SCL线的状态。 因此,SCL线将被具有最长低电平周期的器件保持低电平。 低电平周期较短的设备在此期间进入高电平等待状态。

                                           

        当所有相关器件的低电平时间都结束后,时钟线将被释放并变为高电平。 这样,设备时钟和SCL线的状态之间就不会有差异,并且所有设备都将开始计数其高电平周期。 第一个完成其高电平周期的器件将再次将SCL线拉低。

        这样,生成了一个同步的SCL时钟,其LOW周期由时钟LOW周期最长的设备确定,其HIGH周期由时钟HIGH周期最短的设备确定。

2.仲裁

        只有在总线空闲时,主机才可以开始传输。 两个或更多个主机可能会在启动条件的最短保持时间(tHD; STA)内产生一个启动条件,从而导致总线定义了一个启动条件。 仲裁在SDA线上进行,而SCL线在高电平上,这样的方式是:发送总线的主机在发送高电平的同时,另一个主机在发送低电平的主机将关闭其DATA输出级,因为总线的电平状态无法与其本身的电平状态相符合。

        仲裁可以持续许多位。 它的第一阶段是地址位的比较。 如果主机各自尝试寻址同一设备,则仲裁将继续比较数据位(如果它们是主机发送器),或者是确认位(如果它们是主机接收器)。 由于I2C总线上的地址和数据信息由获胜的主机确定,因此在仲裁过程中不会丢失任何信息。

        丢失仲裁的主机可以生成时钟脉冲,直到丢失仲裁的字节的末尾为止。由于Hs模式主机具有唯一的8位主机代码,因此它将始终在第一个字节中完成仲裁(请参见第13节)。如果主服务器还具有从属功能,并且在寻址阶段丢失了仲裁,则获胜的主机可能会尝试解决该问题。 因此,丢失的主机必须立即切换到其从机模式。

        图9显示了两个主机的仲裁程序。 当然,可能涉及更多(取决于连接到总线的主机数量)。 当主机生成DATA 1的内部数据电平与SDA线上的实际电平之间存在差异时,其数据输出将关闭,这意味着接下来将HIGH输出电平连接至总线。 这不会影响获胜主数据发起的数据传输。

                                    

       由于I2C总线的控制完全取决于竞争主机发送的地址或主机代码和数据,因此总线上没有中央主机,也不存在任何优先级。
如果在串行传输期间,当重复的START条件或STOP条件传输到I2C总线时,仲裁程序仍在进行中,则必须特别注意。 如果有可能发生这种情况,则所涉及的主机必须在格式帧中的同一位置发送此重复的START条件或STOP条件。 换句话说,不允许在以下情况之间进行仲裁:

·重复的START条件和一个数据位
·STOP条件和数据位
·重复的START条件和STOP条件。
从机不参与仲裁程序。

3.使用时钟同步机制作为握手

除了在仲裁过程中使用之外,时钟同步机制还可以用于使接收器能够应对字节级或位级的快速数据传输。

在字节级别,设备可能能够以快速速率接收数据字节,但需要更多时间来存储接收到的字节或准备另一个要发送的字节。 从机可以在接收和确认一个字节后将SCL线保持为低电平,以迫使主机进入等待状态,直到从机为握手过程中的下一个字节传输做好准备(见图6)。

在位级别上,诸如微控制器之类的设备(具有或不具有I2C总线的有限硬件)可以通过延长每个时钟的LOW周期来减慢总线时钟。 因此,任何主机的速度都适合于该设备的内部工作速率。
在Hs模式下,此握手功能只能在字节级别使用。

发布了30 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yinuoheqian123/article/details/102783286
I2C