先说结论:

遵循3个机制

  1. “线与”机制。多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。
  2. SDA回读机制。总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线。
  3. 低电平优先机制。由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权。

=========================================================================

以下为摘抄,就不重复啰嗦了I2C总线仲裁原理_yangkuiwu的博客-CSDN博客_i2c仲裁

        I2C中心以启动信号START来掌管总线,以停止信号STOP来释放总线;启动信号START后紧

接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由

主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;当被控器件检测到收到的地址与

自己的地址相同时,在第9个时钟期间反馈应答信号;每个数据字节在传送时都是高位(MSB)在

前;信号波形如下图所示。

        I2C总线上可能在某一时刻有两个主控设备要同时向总线发送数据,这种情况叫做总线竞争。

I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的: 假

设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启

动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发

出的电平一致,他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位

数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的

输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此

主控器2就成为总线的唯一主宰者。不难看出:

  1. 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
  2.  各个主控器没有对总线实施控制的优先级别,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。

=========================================================================

以下也为摘抄I2C总线的仲裁机制_maple-CSDN博客_i2c仲裁

        在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别

的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个

或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲

突,就要进行仲裁的判决,这就是I 2C总线上的仲裁。

        I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。

1  SCL线的同步(时钟同步)

        SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现

为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原

理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。这就是SCL的同步原理

2 SDA仲裁

        SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较

总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以

保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过

仲裁只允许一个主节点可以继续占据总线。

3 仲裁过程

两个主节点的仲裁过程

        上图是以两个节点为例的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信

号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起

始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测

到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平

信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信

号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主

节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状

态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,

而主节点1在转为从节点后继续接收数据,同样也没有丢掉SDA线上的数据。因此在仲裁过程中数

据没有丢失。

总结:SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐