最近学习I2C协议的时候,被I2C多主机时钟同步的问题所困扰,spec上是这样说的:
所有的主机都能产生自己的时钟,利用时钟来传输I2C总线上的报文,数据只在时钟的高电平周期有效,因此需要在SCL线上有一个确定的时钟对数据进行逐位仲裁。
主机的时钟通过“线与”方式连接到I2C接口的SCL线,由于各个主机时钟之间的逻辑关系为“线与”。因此,SCL线的高到低切换会使器件开始它的低电平周期,SCL线被有最长低电平周期的器件保持低电平。此时,低电平周期短的器件会进入高电平的等待状态。时钟同步图如链接图片所示。
当所有有关的器件结束了它们的低电平周期后,时钟线被释放并变成高电平。之后,器件时钟和SCL线的状态没有差别。而且所有器件会开始它们的高电平周期,首先完成高电平周期的器件会再次将SCL线拉低,这样产生的同步SCL 时钟的低电平周期,由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。
总结:上述工作过程保证了,在I2C传输数据时,任何主机的时钟都为高电平,因为任何主机的时钟地点平都能将时钟拉低,从而使数据失效,这也就是时钟同步的原理。
问题:这样的解释我觉得不够具体,比如说有2个主机,一个发400K的时钟,另一个发100K的时钟,那么在总线仲裁哪个主机可以抢得总线之前,通过时钟同步出来的SCL波形是怎么样的呢?麻烦各位大虾指点迷津,谢谢!
|