I2C协议(二)


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信号做处理,如下。
  • 时钟扩展在基于上面描述,增加了从机可以控制SCL信号的硬件电路,从机在第9个SCL周期将SCL拉低,由于正忙,没办法接收处理传输的数据;主机检测到SCL被拉低,便会进入等待状态。等待从机忙完可以处理时,将SCL释放(I2C两条总线都接了上拉电阻,默认是高电平)并返回主机ACK信号,主机可以进行下一步的操作。

1.3 SDA仲裁

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

2. 读写时序

  • 相同传送方向,不需要每次传输主机都发送开始信号。

  • 主机写给从机

    • 其中器件地址为slave地址信息,而字地址为读/写从机内部存储单元的地址信息。
  • 主机读从机数据

    • 当前地址读
      • I2C在读写操作之后,内部的地址指针自动加1,因此当前地址读不需要再次发送从机内部存储单元地址信息了。
    • 随机地址读
      • 如下图所示,需要先Start Bit、发送slave地址,并设置传输为写方向;之后发送内部寄存器地址。这个过程称为Dummy Write.
      • 之后再次重新发送Start Bit、slave地址,并设置传输为读方向。从机应答,从机发送8bit数据。
      • 为什么需要Dummy Write?因为是随机读,我们需要让从机存储单元的地址指针指向随机读取的地址,所以可以先进行Dummy Write,让存储单元的地址指针指向随机读的地址,等待从机应答后,就可以读取数据了。
  • 主机读后写/写后读

    • 传输过程中,改变传送方向,不需要主机发送停止信号释放总线,只需要重新发送开始信号就可以。
posted @ 2023-06-18 18:43  可达达鸭  阅读(51)  评论(0编辑  收藏  举报