I2C协议(二)

发布时间 2023-06-18 18:48:02作者: 可达达鸭

1. 仲裁机制

  • I2C是一个多主机的通信协议,那么就会出现 多个主机都申请SDA总线权限发送开始信号和从机地址 的情况,这就需要仲裁机制。

1.1 SCL的同步

  • 这里以两个主机为例,可以拓展到多个主机上。目的:多个主机产生一个可公用的时钟。
  • 两个主机的时钟频率不同,相位不同,使用时钟同步机制如下图所示:
    • 总线空闲时,SCL被上拉电阻拉高,当开始通信时,CLK1首先变成低电平,SCL也变成低电平,CLK2看到SCL拉低,便自己也拉低,并开始计数到CLK2虚线(原本应该拉低的位置)。
    • CLK2的低电平时间比CLK1要长,所以CLK1从拉高开始计数到CLK2和CLK1同时拉高(此时SCL也被拉高)的位置。
    • 至此,CLK1获得了需要延长的低电平时间,CLK2获得了需要减短的高电平时间,都是通过前面计数得到的。CLK1和CLK2可以根据计数值进行调整,完成时钟的同步。

1.2 时钟扩展

  • 目的:I2C可以动态的调整总线的通信速率。
  • 时钟扩展是从机发起的;这篇博客介绍了非应答信号,即从机正忙,没办法通信,而SCL还是正常由主机控制,在SCL为高电平时,主机采到第9个SCL周期,SDA为高;主机就会发起停止信号,结束通信。
  • 时钟扩展在基于上面描述,增加了从机可以控制SCL信号的硬件电路,从机在第9个SCL周期将SCL拉低,由于正忙,没办法接收处理传输的数据;主机检测到SCL被拉低,便会进入等待状态。等待从机忙完可以处理时,将SCL释放(I2C两条总线都接了上拉电阻,默认是高电平)并返回主机ACK信号,主机可以进行下一步的操作。

1.3 SDA仲裁

  • "线与逻辑",在SCL为高电平时,SDA的数据等于各个主机的数据相与;每个主机将自己的数据和SDA上的数据进行比对,如果不一致,便知道失去了仲裁,就不再向SDA写数据。
  • 如果两个主机都是向相同地址从机发起通信,那么仲裁继续,直到后续的数据位决定总线的归属权。
  • 这种仲裁方式并不会破坏数据的有效性,因为总是有主机可以进行通信,且数据不会被改变。但这种仲裁方式无法提前设定主机的优先级。

2. 读写时序

  • 相同传送方向,不需要每次传输主机都发送开始信号。
  • 主机写给从机
  • 主机读从机数据
  • 主机读后写/写后读
    • 传输过程中,改变传送方向,不需要主机发送停止信号释放总线,只需要重新发送开始信号就可以。