I2C多主机通信机制允许在不发生数据碰撞的情况下,通过一个确定的仲裁过程来解决总线访问冲突,确保数据传输的完整性和稳定性。仲裁机制是基于对总线上所有主机发送的信号进行线与之后的结果进行裁决,需要在开漏电路下完成。
当多个主机想要启动通信时,它们都通过生成启动条件开始(将SDA线拉低,而SCL线拉高)。在启动条件之后,所有主机开始同时发送它们的从地址。当它们逐位发送数据时,它们将总线状态(SDA线)与它们正在发送的数据进行比较。如果一个主机试图发送1(逻辑高),但检测到总线低(另一个主机发送了0),它将失去仲裁并停止发送数据,发送了0的其他主机赢得仲裁,可以继续发送下一位数据,并根据结果进行下一轮总线仲裁,以此类推,直到仲裁出最终结果为止。仲裁失败的主机需要退出竞争并释放总线,只有在总线空闲后才能重试。
仲裁机制通过“线或”逻辑(Wired-AND)和“低电平优先”原则解决冲突。发送高电平的主设备检测到冲突后,会主动退出竞争,确保数据传输的完整性和稳定性。
当多个主设备(如微控制器)共享同一总线时,仲裁机制确保公平竞争,避免数据冲突。
仲裁是在多主机模式下觉得那个主机控制的方法
仲裁机制主要应用在以下场景:
-
多主机共存系统:当多个主设备(如微控制器)共享同一总线时,仲裁机制确保公平竞争,避免数据冲突。例如,在工业自动化系统中,多个传感器或控制器可能需要同时与中央单元通信。
-
优先级管理:在复杂系统中,不同主设备可能有不同优先级。仲裁机制通过地址比较和逐位仲裁,确保高优先级设备优先获得总线控制权。例如,紧急控制系统可能需要优先于常规数据采集系统。
-
冗余与容错设计:在需要高可靠性的系统中,冗余设备可通过仲裁机制实现无缝切换。例如,当主设备故障时,备用设备可接管总线控制权,确保系统持续可用性。
-
动态总线分配:在实时性要求高的场景中,仲裁机制允许动态调整总线使用权。例如,在物联网设备中,多个传感器根据数据就绪状态竞争总线,确保及时传输关键信息。
-
避免数据丢失:仲裁机制确保在冲突发生时,已传输数据不会丢失。例如,在汽车电子系统中,多个控制单元(如发动机管理和刹车系统)需安全地共享总线。
仲裁机制的工作过程
- 启动条件:当SCL线为高电平时,SDA线由高电平跳变到低电平表示启动通信。在I2C总线处于“空闲状态”时,时钟信号线SCL为高电平时,数据信号线SDA被拉低(由高电平变为低电平),出现下降沿,表示产生了一个起始信号。起始信号是由主机主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
- 发送地址:主机发送一个设备地址(7位)加上一个读/写位(1位),以指定要通信的从设备和操作类型。每个试图获得总线控制权的主机都会开始发送地址字节。
- 逐位仲裁:主机在发送过程中会持续读取SDA线的状态,如果发现SDA线上的电平与其发送的地址位不一致,它就停止发送并进入接收模式。在发送地址字节时,所有尝试访问总线的主机将发送地址和控制位,并进行逐位比较。如果一个主机发送的是逻辑“1”而检测到的是逻辑“0”,则表明有更高优先级的主机正在使用总线。拥有最低地址的主机将获得总线控制权。
- 仲裁结果:最后一个发送成功地址字节的主机会赢得仲裁,获得总线的控制权。仲裁可以在地址或数据传输期间的任何点发生,它确保只有一个主机可以控制总线而不受其他主机的干扰。
- 败方停止:检测到仲裁失败的主机将停止发送数据,并释放总线,等待总线空闲后才能再次尝试通信。