I2C协议

1.基础协议与传输

  • 连接线主要包括两个,分别是SDA数据线和SCL时钟线,SDA控制数据发送,SCL控制采样,默认状态下(空闲)两个都释放(上拉电阻拉到高电平)。

  • 读写传输,读写主要是看主机,假设A是主机,B是从机,写代表主机向从机发送数据,读代表从从机读取数据,这两个过程主要通过数据发送前的准备节拍来控制,这个节拍主要是选择是读还是写(一位,0代表写,1代表读)以及从机地址书写,一般是将从机地址左移一位后加1/0。

  • 起始和停止不是看SCL=1 时 SDA 是 0 还是 1”这个静态电平,而是看“SCL=1 期间 SDA 有没有跳变,0跳成1代表开始,1跳成0代表结束.

  • 仍然讲上面的,也就是说在SCL持续期间如果SDA存在动态的0/1跳变就代表起始和终止,如果是稳定的静态的0/1就代表实际的数据传输。

  • 注意:同一时间只能有一个设备传输数据,其他设备需要等待总线空闲时才能传输数据,等待机制是阻塞等待,抢占使用权限的规则是:SDA第一拍逐位比较,从最高位 MSB 开始,先出现不同的那一位,发 0 的主机赢,且当地址完全一样时发0的先使用。

2.应答机制

  • I2C 每发送 8 位数据后,都会跟 1 个应答时钟,也就是第 9 个 SCL 周期,也就是说在传完8位数据后的一个周期会将SDA释放,由从机来控制SDA的高低,如果在SCL高电平期间是0则代表ACK,代表收到数据可以继续传输,如果SCL高电平期间是1(释放)就代表NACK,注意这里跟数据传输一样也是看静态的采样值,只不过采样值是由从机决定。
    ACK:接收方在 SCL 低时拉低 SDA,SCL 高时 SDA 稳定为 0;
    NACK:接收方在 SCL 低时释放 SDA,上拉使其为高,SCL 高时 SDA 稳定为 1。
  • 有一个关于从机应答的机制可以用于高速数据传输,设备可能能够以高速率接收数据字节,但需要更多时间来存储接收到的字节或准备另一个待发送的字节,这时候由于SDA控制权还在从机手中,需要等从机释放主机才能重新获得SDA控制权来传输下一个字节。

3.多主机的线与(同步与仲裁)

  • SCL 是开漏输出 + 上拉电阻,多个主机的 SCL 输出接在同一根线上,等效为“线与”:任何一个主机拉低,SCL 就是低;只有所有主机都释放,SCL 才会被上拉拉高。相当于第一个主机的下降沿作为SCL的下降沿,所有主机看到后开始自己的低电平周期。最后一个主机释放作为上升沿,所有主机都释放了,SCL 才被上拉拉高,随后第一个下降的主机SCL决定高电平持续时间,因为只要有拉低,同步SCL就为低。

  • 同步是为了SCL高电平同时采样不同主机的SDA进行比较来进行仲裁,上面说的逻辑就是定义一个同步采样的SCL能保证在SCL高电平的时候采样从机地址来进行仲裁SDA

  • 若主机同时具备从设备功能,且在寻址阶段失去仲裁权(没能当上主机),则很可能意味着获胜的主机正尝试对该从设备进行寻址;因此,失权的主机必须立即切换至从设备模式,其他具有从设备功能1的主机也是如此。

  • 在串行传输过程中,若在向 I2C 总线发送重复起始条件或 STOP 条件时,仲裁过程仍处于进行中,则必须特别注意。换言之,此时不允许进行仲裁。
    下图展示了两个主设备之间的仲裁流程。当然,实际可能涉及更多设备(具体取决于连接到总线上的主设备数量)。当生成 DATA 1 的主设备其内部数据电平与 SDA 线上的实际电平不一致时,该主设备的数据输出端将被关闭;这意味着此时一条高电平输出信号将被接入总线。这一操作不会影响由胜出主设备发起的数据传输。
    image

4.时钟频率控制

在位级层面,诸如微控制器等设备(无论其是否配备用于 I2C 总线的有限硬件资源)均可通过延长每个时钟低电平周期来降低总线时钟频率;由此,任一主设备的运行速度均可适配于该设备自身的内部工作速率。

5.从机地址的

  • 从设备地址可由固定部分和可编程部分组成。由于系统中很可能存在多个相同的设备,因此从设备地址中的可编程部分可支持将尽可能多的此类设备连接到 I2C 总线。
  • 设备的可编程地址位数取决于其可用引脚数量;例如,若某设备具有 4 个固定地址位和 3 个可编程地址位,则最多可有 8 个相同设备连接到同一总线。
    固定地址位:芯片内部已经定死,所有同型号芯片都一样;
    可编程地址位:通过芯片外面的地址引脚接高电平或低电平来设置。

6.从机地址(兼容性)

  • START byte(0000 0001),起始字节,它不是从机地址,而是一个特殊字节,用于总线热插拔时让所有从机同步;噪声环境下先唤醒总线;高速模式等场景下的前导。主设备发出这个字节后,从设备不应该拉低 SDA 来 ACK之后主设备通常会发 NACK,再发重复起始,然后才开始正常寻址。
  • CBUS (0000 001x)是另一种总线/协议,和 I²C 不完全一样,但物理层可能可以共存。如果同一系统里既有 I²C 设备,又有 CBUS 设备,就需要避免地址冲突。

posted on 2026-09-19 19:20  tuck0603  阅读(18)  评论(0)    收藏  举报

导航