首页

基础I2C通信|硬件,数据传输,配置

在本文中,我们将了解I2C通信协议是什么、它的硬件、数据如何传输以及它所使用的不同配置。

I2C通信简介

I2C通信是集成电路的简写形式。它是飞利浦半导体公司开发的一种通信协议,用于在同一块电路板上的中央处理器和多个集成电路之间使用两根普通导线进行数据传输。

由于其简单性,广泛用于微控制器与传感器阵列、显示器、物联网设备、eeprom等之间的通信。

这是一种同步串行通信协议。它指的是数据位按参考时钟线设定的时间间隔一个接一个地传送。

特性

以下是I2C通信协议的一些重要特性:

  • 只需两条公共总线线(导线)就可以控制I2C网络上的任何设备/IC
  • 不需要事先协议的数据传输速率,如在UART通信.因此,数据传输速度可以随时调整
  • 验证传输数据的简单机制
  • 使用7位寻址系统在I2C总线上针对特定的设备/IC
  • I2C网络很容易扩展。新设备可以简单地连接到两条公共I2C总线

硬件

物理I2C总线

I2C总线(接口线)仅由两根线组成,称为串行时钟线(SCL)和串行数据线(SDA)。要传输的数据通过SDA线发送,并与来自SCL的时钟信号同步。I2C网络上的所有设备/ ic都连接到相同的SCL和SDA线,如下所示:

I2C通信基础I2C总线

两种I2C总线线路(SDA, SCL)都作为开路排水驱动器运行。这意味着I2C网络上的任何设备/IC都可以驱动SDA和SCL的低电平,但它们不能驱动它们的高电平。因此,拉拔电阻用于每条母线,以保持他们高(在正电压)的默认。

使用开排系统的原因是不会有做空的机会,当一个设备试图把线拉高而另一个设备试图把线拉低时,可能会发生这种情况。

主从设备

连接到I2C总线的设备分为主设备和从设备。在任何时刻,I2C总线上只有一个主服务器处于活动状态。它控制SCL时钟线并决定在SDA数据线上做什么操作。

所有响应主设备指令的设备都是从设备。为了区分连接到同一I2C总线的多个从设备,每个从设备都被物理地分配了一个永久的7位地址。

当主设备要向从设备传输数据或从从设备传输数据时,它在SDA行上指定这个特定的从设备地址,然后继续进行传输。因此,在主设备和特定的从设备之间有效地进行通信。

除非SDA线路上的主设备指定了它们的地址,否则所有其他从设备都不会响应。

I2C通信主从基础

数据传输协议

主设备和从设备遵循以下协议(一组规则)来在它们之间传输数据。

数据通过单一的SDA数据线在主设备和从设备之间传输,通过0和1(位)的图形序列。每个0和1的序列被称为一个交易,每个交易中的数据结构如下:

I2C通信数据传输协议基础

开始的条件

每当主设备/IC决定启动一个事务时,它会在SCL线从高电平切换到低电平之前将SDA线从高电平切换到低电平。

一旦主设备发送一个启动条件,所有的从设备就会激活,即使它们处于睡眠模式,并等待地址位。

了解I2C通信启动条件

地址块

它由7位组成,由主设备需要发送/接收数据的从设备地址填充。I2C总线上的所有从设备都将这些地址位与它们的地址进行比较。

读/写一点

这个位指定数据传输的方向。如果主设备/IC需要向从设备发送数据,该位设置为“0”。如果主IC需要从从设备接收数据,它被设置为' 1 '。

ACK /纳一点

它代表承认/不承认位。如果从设备的物理地址与主设备广播的地址一致,则从设备将该位的值设为“0”。否则,它将保持在逻辑' 1 '(默认)。

数据块

它由8位组成,由发送方设置,其中包含需要传输给接收方的数据位。该块后面跟着一个ACK/NACK位,如果成功接收到数据,接收方将其设置为“0”。否则它就停留在逻辑1。

这个数据块的组合后面跟着ACK/NACK位,一直重复到数据完全传输完。

停止条件

需要的数据块通过SDA线传输后,主设备将SDA线从低压电平切换到高压电平,然后SCL线从高电平切换到低电平。

基本的I2C通信停止条件

注意:逻辑“0”或设置一个位为“0”相当于在SDA线路上施加低电压,反之亦然。

I2C通信实际是如何工作的?

I2C通信/事务由主设备发起,以便向从设备发送数据或从它接收数据。让我们详细了解这两个场景的工作情况。

向从设备发送数据

当主设备试图通过I2C总线向特定的从设备发送数据时,将发生以下操作序列:

  • 主设备发送启动条件
  • 主设备发送7个地址位,这些地址位对应于要定位的从设备
  • 主设备将读/写位设为' 0 ',表示写入
  • 现在有两种可能的情况:
    • 如果没有从设备匹配主设备发送的地址,下一个ACK/NACK位保持在' 1 '(默认)。这向主设备发出从设备标识不成功的信号。主时钟将通过发送一个Stop条件或一个新的Start条件来结束当前事务
    • 如果存在与主设备指定地址相同的从设备,则从设备将ACK/NACK位设置为“0”,向主设备发出从设备成功定位的信号
  • 如果从设备被成功锁定,主设备现在发送8位数据,这些数据只被目标从设备考虑和接收。这些数据对剩余的从设备没有任何意义
  • 如果从设备成功接收到数据,它将ACK/NACK位设为' 0 ',这表示主设备继续
  • 重复前两个步骤,直到所有数据都传输完毕
  • 在所有数据被发送到从设备后,主设备发送Stop条件,该条件向所有从设备发出当前事务已经结束的信号

下面的图代表了在SDA线上发送的总体数据位以及控制每个数据位的设备:

基本的I2C通信数据传输主从

从从设备读取数据

除以下情况外,操作顺序与前一场景相同:

  • 主设备将读/写位设置为' 1 '而不是' 0 ',这将向目标从设备发出信号,表明主设备正在等待从它获取数据
  • 数据块对应的8位由从设备发送,ACK/NACK位由主设备设置
  • 一旦主设备接收到所需的数据,它就发送一个NACK位。从设备停止发送数据,释放SDA线路

如果主设备要从从设备的特定内部位置读取数据,它首先使用前面场景中的步骤将位置数据发送给从设备。然后,它以重复的启动条件开始读取数据的过程。

下面的图代表了在SDA线上发送的总体数据位以及控制每个数据位的设备:

I2C通信数据从机到主的基础知识

时钟拉伸的概念

假设主设备启动了一个事务,并发送了一个特定从设备的地址位,然后是一个Read位' 1 '。特定的从设备需要发送一个ACK位,紧随其后的是数据。

但是如果从设备需要一些时间来获取和发送数据给主设备,在这个间隙中,主设备会认为从设备正在发送一些数据。

为了防止这种情况,从设备将SCL时钟线保持在低电平,直到它准备好传输数据位。通过这样做,从设备向主设备发出信号,等待数据位,直到时钟线被释放。

这篇文章就到这里。看看下面的项目,了解I2C通信是如何在微控制器/Arduinos和不同传感器之间实际实现的:

基于RFID的停车场系统

Arduino接口与一个运动处理器单元

Arduino与实时时钟接口

3反应

留下一个回复

您的电子邮件地址将不会被公布。必需字段被标记

Electronicshub图标
<\/i>","library":""}}" data-widget_type="nav-menu.default">
Baidu