IIC总线简介(Linux驱动开发篇)

      最后更新:2022-02-14 04:42

      1.I2C概述

      • I2C 使用两条线在主控制器和从机之间进行数据通信。
      • 一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线)
      • 这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。
      • I2C 总线标准模式下速度可以达到100Kb/S,快速模式下可以达到 400Kb/S

      多设备连接结构图在这里插入图片描述

      • 从上面可以看到I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备。
      • 这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了

      2. I2C协议

      • 既然是两根线,我们就要遵从某种协议才可以进行复杂的通信
      • 我们在写I2C驱动的时候,主要还是编写读写时序图进行读写操作
      • 每个读写操作必然会包含(起始位、应答、数据传输、停止位)
      • 总结一下啊,我打个比方,就想电影里出现的摩斯密码,就是典型用开关量利用不同的频率来进行数据的传输,就是一根线也能玩出不同的花样

      2.1 写时序操作

      写时序====单字节
      在这里插入图片描述

      上面乍一看,可能有点看不懂,我们只需要把他们拆开就简单多了
      在这里插入图片描述

      我们把(开始信号、传输一字节数据、应答信号、停止信号) 看成一帧,那上面的写时序总共用了3帧才完成一个写时序
      第一帧是访问设备地址
      第二帧是访问寄存器地址
      第三帧是写入寄存器的数据

      接着我们将一帧中的主要组成部分介绍一下啊

      • 起始位
        通过这个起始位就可以告诉I2C从机,“我”要开始进行I2C 通信了。
        在SCL为高电平的时候,SDA 出现下降沿就表示为起始位
        在这里插入图片描述

      • 停止位
        停止位就是停止 I2C通信的标志位,和起始位的功能相反。
        在SCL位高电平的时候,SDA出现上升沿就表示为停止位
        在这里插入图片描述

      • 数据传输
        I2C 总线在数据传输的时候要保证在 SCL 高电平期间,SDA 上的数据稳定,因此 SDA 上的数据变化只能在SCL 低电平期间发生
        在这里插入图片描述

      • 应答信号
        当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。
        应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败
        说下目的,你打电话的时候,你要说“喂。。。”,你不可能对方不应答你就在一直巴拉巴拉了说话了把,因为你要确定电话那边是否做好接听的准备

      好了基本的已经介绍完了。。。。
      在这里插入图片描述
      具体步骤:

      • 1.1第一帧开始信号
      • 1.2发送设备地址。这是一个 8位的数据,其中高 7 位是设备地址,最后1位是读写位,为1 的话表示这是一个读操作,为 0的话表示这是一个写操作。
      • 1.3 从机发送ACK应答信号
      • 1.4 第一帧停止位
      • 2.1 第二帧重新发送开始信号
      • 2.2 发送要写写入数据的寄存器地址。
      • 2.3 从机发送的ACK 应答信号
      • 2.4 第二帧停止位
      • 3.1 xxxxxxxxxxxxx
      • 3.2 发送要写入寄存器的数据
      • 3.3 从机发送的ACK 应答信号
      • 3.4 停止信号

      下面的读时序也是同理

      2.2 读时序操作

      读序列====单字节
      在这里插入图片描述
      I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步:
      在这里插入图片描述

      • 第一步是发送设备地址,
      • 第二步是发送要读取的寄存器地址,
      • 第三步重新发送设备地址,
      • 最后一步就是 I2C 从器件输出要读取的寄存器值

      具体以细化的步骤如下:(每一步就是一帧,一帧里面又分解成四步)

      • 1.1 主机发送起始信号。
      • 1.2 主机发送要读取的 I2C 从设备地址。 读写控制位,因为是向 I2C从设备发送数据,因此是写信号。
      • 1.3 从机发送的ACK 应答信号。
      • 1.4 stop信号
      • 2.1 重新发送START 信号。
      • 2.2 主机发送要读取的寄存器地址。
      • 2.3 从机发送的ACK 应答信号。
      • 2.4 stop信号
      • 3.1 重新发送START 信号。
      • 3.2 重新发送要读取的 I2C 从设备地址。读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
      • 3.3 从机发送的 ACK应答信号。
      • 3.4 stop信号
      • 4.1 xxxxxxxxxxxxxxxxxxx
      • 4.2 从I2C器件里面读取到的数据。
      • 4.3 主机发出NO ACK 信号,表示读取完成,不需要从机再发送ACK信号了
      • 4.4 主机发出STOP 信号,停止I2C通信。

      最后这里我有点不理解,最后一帧读写数据的时候为什么没有开始位的信号。按道理需要提出来,还是默认最后一个是默认开始的?

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类