I2C多主机通信机制允许在不发生数据碰撞的情况下,通过一个确定的仲裁过程来解决总线访问冲突,确保数据传输的完整性和稳定性。仲裁机制是基于对总线上所有主机发送的信号进行线与之后的结果进行裁决,需要在开漏电路下完成。
当多个主机想要启动通信时,它们都通过生成启动条件开始(将SDA线拉低,而SCL线拉高)。在启动条件之后,所有主机开始同时发送它们的从地址。当它们逐位发送数据时,它们将总线状态(SDA线)与它们正在发送的数据进行比较。如果一个主机试图发送1(逻辑高),但检测到总线低(另一个主机发送了0),它将失去仲裁并停止发送数据,发送了0的其他主机赢得仲裁,可以继续发送下一位数据,并根据结果进行下一轮总线仲裁,以此类推,直到仲裁出最终结果为止。仲裁失败的主机需要退出竞争并释放总线,只有在总线空闲后才能重试。
仲裁机制的工作过程
启动条件:当SCL线为高电平时,SDA线由高电平跳变到低电平表示启动通信。在I2C总线处于“空闲状态”时,时钟信号线SCL为高电平时,数据信号线SDA被拉低(由高电平变为低电平),出现下降沿,表示产生了一个起始信号。起始信号是由主机主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
发送地址:主机发送一个设备地址(7位)加上一个读/写位(1位),以指定要通信的从设备和操作类型。每个试图获得总线控制权的主机都会开始发送地址字节。
逐位仲裁:主机在发送过程中会持续读取SDA线的状态,如果发现SDA线上的电平与其发送的地址位不一致,它就停止发送并进入接收模式。在发送地址字节时,所有尝试访问总线的主机将发送地址和控制位,并进行逐位比较。如果一个主机发送的是逻辑“1”而检测到的是逻辑“0”,则表明有更高优先级的主机正在使用总线。拥有最低地址的主机将获得总线控制权。
仲裁结果:最后一个发送成功地址字节的主机会赢得仲裁,获得总线的控制权。仲裁可以在地址或数据传输期间的任何点发生,它确保只有一个主机可以控制总线而不受其他主机的干扰。
败方停止:检测到仲裁失败的主机将停止发送数据,并释放总线,等待总线空闲后才能再次尝试通信。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_67729470/article/details/146075266
|
|