I2C是集成到许多产品中的一种非常常见的协议。它允许在许多设备之间通过两条线进行串行通信。在本教程中,我们将介绍I2C是如何工作的,并展示一些实际示例。如果你打算连接多个Arduino或连接一个Arduino到一个 覆盆子π它是一个非常有用的工具,可以放在你的口袋里。您还将需要它的项目,使用气压传感器,或加速计,甚至OLED显示器!

I2C解释简单

I2C允许您使用两根线将多个设备连接在一起。这对于将一个或多个arduino连接到树莓派上为例。我们在r2 - d2项目!但是你也可以用I2C连接两个arduino。许多设备也内置I2C,如传感器、陀螺仪和显示屏。您可以有多个或单个主服务器控制多个或单个从服务器。

大多数人说I2C只需要电线来通信,虽然这是真的,但我们强烈建议您总线上的所有I2C设备共享一根共同的接地线。只要加一个简单的加法,许多干扰传输的问题就会迎刃而解。

让我们深入了解I2C的基础知识,并讨论一下接线:

SDA是串行数据线。主设备和从设备通过该导线发送和接收数据。

症状自评量表是串行时钟线。它携带由主机产生的时钟信号。

像其他类似的协议一样,I2C是一个串行通信协议。I2C数据沿单一SDA线逐位传输。它也是同步的,这意味着位的输出是同步使用的SCL时钟信号产生的主人。时钟信号总是由主机控制,而不是由从机控制。

以下是描述I2C的网页节选:

线使用 2
速度 标准模式= 100Kbits
快速模式= 400Kbits
高速= 3.4Mbits
超快模式= 5Mbits
同步或异步 同步
串行或并行 串行
硕士最大人数 无限的
最大奴隶数量 1008

I2C协议是如何工作的

I2C数据以我们称为消息的方式传输。与其他协议(甚至像以太网这样的网络协议)类似,消息被分解成帧。消息是唯一寻址的帧,该帧标识消息所指向的从机的二进制地址,后面跟着一个或多个数据帧,其中包含正在传输的内容。消息还包括读/写位、ACK/NACK位以及启动和停止条件。下面是一帧一帧的消息:

开始的条件是当SDA线从一个高到一个低之前症状自评量表线路从高到低的切换信号开始通信。

地址框是一个7或10位序列,它标识总线上的一个从服务器,主服务器希望将消息发送到该从服务器。这个地址唯一地标识总线上的单个从服务器。从地址不应该在单个总线上复制。

读/写一点是一个单一的位,指定是主服务器通过降低行数向从服务器发送数据,还是通过提高行数向从服务器请求数据。

ACK /纳一点在消息中跟随每一帧。它是一个确认/不确认位。如果成功接收到地址帧或数据帧,接收设备将返回一个ACK位给发送方。

停止条件是当SDA线从低到高的切换后,SCL线从低到高的切换信令通信的结束。

在单总线上连接多个I2C设备

我经常遇到的一个问题是“如果I2C只有两条线,如何在同一条总线上添加多个设备?”其实一点也不复杂。巴士上的所有装置都简单地以电的方式连接到同一组电线上,如下所示。这可能是物理线路或电路板上的痕迹。

如果你正在制作原型,最简单的方法是在你的设备之间使用一个面包板。请参阅下面的单个示例 覆盆子π主人通过I2C控制三个Arduino Mega 2560s

I2C消息传递是如何工作的

在了解I2C的工作原理后,让我们将消息逐条分解,了解每个组件的工作原理。

解决是如何工作的

与大多数协议(在总线上可能存在许多设备)一样,I2C需要一种方式向特定设备发出信号以侦听消息,并让其他设备忽略消息。I2C通过地址帧来实现这一点。地址帧总是紧跟在开始条件之后。

总线上的每个设备都将监听启动条件,然后是地址。如果地址匹配总线上的一个特定的从地址,该从地址将通过降低SCL线发送ACK位。这就是I2C总线上的从服务器确认主服务器的方式。

7位或10位地址

重要的是要理解I2C从地址可以是7位或10位。要做到这一点,实际上有两个地址通过总线发送,因此有两个地址帧。第一个地址是一个特殊的7位地址0x92。没有7位设备应该设置为0x92,因此所有7位地址设备应该忽略这个地址和消息的其余部分。紧跟在这个特殊地址之后的是10位设备的另一个地址帧。这是如何10位地址的设备可以存在于同一总线上的7位设备和一切保持兼容。

读/写位是如何工作的

I2C有两种处理奴隶的特殊方法。主服务器可以向从服务器发送数据,也可以向从服务器请求数据。在地址位之后是I2C读/写位。如果主服务器希望从从服务器接收数据,它通过将行调高来发送一个读位。如果主服务器希望发送数据给从服务器,它通过降低行数来发送一个写位。

数据框架是如何工作的

紧接着读/写位是ACK/NACK位。只有在主机接收到这个比特后,数据帧才能开始传输。

8位数据帧总是以最高有效位优先传输。最高有效位(也称为高阶位)是二进制数中具有最大值的位。反转这个指令将导致传输失败。每一帧发送后,它是由主设备或从设备的确认,这取决于数据是发送到一个从设备还是从一个从设备接收(基于之前的读/写位选择)。

最后,当所有帧都已发送时,主机将设置停止条件。这将终止发送/接收过程。结束状态为SDA线升高后,SDA线将升高。SDA线将保持高位。

I2C如何与多个大师一起工作

因为I2C是一个基于地址的协议,每个从服务器都有一个7位或10位地址。这允许主人与多达128个奴隶在一个7位总线或1023奴隶在一个10位总线上通信。

请注意:在I2C的大多数配置中,多个设备将共享一根总线,您将需要从VCC连接到SDA和SCL线的4.7k欧姆上拉电阻。然而,一些设备,如 覆盆子π3在I2C总线上有集成电阻。如果不确定,请查看设备文档。

事情开始变得有趣了。I2C还可以支持多主机!没错,您可以在总线上有多个主设备和一个或多个从设备。如果你和我一样,你的第一个问题可能是“如何阻止数据冲突?”或“谁控制时钟线?”

为了防止碰撞(两个主控同时发射),每个主控负责在发射前先检查SDA线的状态是低还是高。当SDA行处于低状态时,这意味着另一个主程序正在积极地使用该行,它必须等待。

为了解决时钟问题,一次只能有一个主机运行时钟。在通信开始时,新主机接管SCL线路的控制,并在传输结束时释放它。