I2C 总线协议详解

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I2C 总线协议详解相关的知识,希望对你有一定的参考价值。

参考:I2C 总线协议详解
作者:一只青木呀
发布时间:2020-09-21 11:41:25
网址:https://blog.csdn.net/weixin_45309916/article/details/108705297

I2C 是最常用的通信接口,众多的传感器都会提供I2C 接口来和主控相连,比如陀螺仪、加速度计、触摸屏等等。所以I2C 是做嵌入式开发必须掌握的,I.MX6U 有4 个I2C 接口,可以通过这4 个I2C 接口来连接一些I2C 外设。I.MX6U-ALPHA 使用I2C1 接口连接了一个距离传感器AP3216C,本章我们就来学习如何使用I.MX6U 的I2C 接口来驱动AP3216C,读取AP3216C 的传感器数据。


1、I2C 简介

I2C 是很常见的一种总线协议, I2C 是 NXP 公司设计的, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。

2、I2C 协议

I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了,一个 I2C 总线连接多个 I2C 设备如下图所示:

上图中 SDA 和 SCL 这两根线必须要接一个上拉电阻,一般是 4.7K。其余的 I2C 从器件都挂接到 SDA 和 SCL 这两根线上,这样就可以通过 SDA 和 SCL 这两根线来访问多个 I2C设备。

3、I2C协议有关术语

3.1、起始位

顾名思义,也就是 I2C 通信起始标志,通过这个起始位就可以告诉 I2C 从机,“我”要开始进行 I2C 通信了。在 SCL 为高电平的时候, SDA 出现下降沿就表示为起始位,如下图所示:

3.2、停止位

停止位就是停止 I2C 通信的标志位,和起始位的功能相反。在 SCL 位高电平的时候, SDA出现上升沿就表示为停止位,如下图所示:

3.3、数据传输

I2C 总线在数据传输的时候要保证在 SCL 高电平期间, SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生,如下图所示:

3.4、应答信号

当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。

3.5、I2C 写时序(主机向从机)

主机通过 I2C 总线与从机之间进行通信不外乎两个操作:写和读, I2C 总线单字节写时序如下图所示:

上图就是 I2C 写时序,我们来看一下写时序的具体步骤:

  • 1)、开始信号。
  • 2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
  • 3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
  • 4)、从机发送的 ACK 应答信号
  • 5)、重新发送开始信号。
  • 6)、发送要写写入数据的寄存器地址。
  • 7)、从机发送的 ACK 应答信号
  • 8)、发送要写入寄存器的数据
  • 9)、从机发送的 ACK 应答信号
  • 10)、停止信号。

3.6、I2C 读时序(主机向从机)

I2C 总线单字节读时序如下图所示:

I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,我们具体来看一下这步。

  • 1)、主机发送起始信号。
  • 2)、主机发送要读取的 I2C 从设备地址。
  • 3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
  • 4)、从机发送的 ACK 应答信号。
  • 5)、重新发送 START 信号。
  • 6)、主机发送要读取的寄存器地址。
  • 7)、从机发送的 ACK 应答信号。
  • 8)、重新发送 START 信号。
  • 9)、重新发送要读取的 I2C 从设备地址。
  • 10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
  • 11)、从机发送的 ACK 应答信号。
  • 12)、从 I2C 器件里面读取到的数据
  • 13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
  • 14)、主机发出 STOP 信号,停止 I2C 通信。

3.7、I2C 多字节读写时序

有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。

以上是关于I2C 总线协议详解的主要内容,如果未能解决你的问题,请参考以下文章

I2C 总线协议详解

I2C协议详解

I2C 协议 代码详解

详解CAN总线:什么是CAN总线?

详解CAN总线:什么是CAN总线?

APB总线协议