I2C通信是如何工作的,如何与Arduino一起使用

在本教程中,我们将学习如何I2C通信协议的工作,也将使其与Arduino板和传感器使用该协议的实际示例。你可以观看下面的视频或阅读下面的书面教程。

概述


由于I2C通信总线可以很容易地在许多需要主从设备通信的电子设计中实现,因此它在许多电子设备中得到了广泛的应用。当使用7位寻址时,在多达128(112)个设备之间的通信只需要两条线,而当使用10位寻址时,在多达1024(1008)个设备之间的通信只需要两条线。

I2C-Communication-Overview1

亚博88下载


怎么可能,这么多设备之间的通信只是电线?每个设备都有预设ID或唯一的设备地址,因此主站可以选择哪些设备将是通信的。

这两条线被称为串行时钟(SCL)和串行数据(SDA)。SCL线是时钟信号,用于同步I2C总线上各设备之间的数据传输,它由主设备产生。另一条线是传输数据的SDA线。

两条线是“开漏”,这意味着需要将电阻连接到它们,使线路高,因为I2C总线上的设备处于高电平。电阻器的常用值为2K,在约400kbps的速度下为较高的速度,以10k为10k,速度为约100kbps。

i2c-communication  - 如何 - 工作

I2C协议


数据信号以8位的顺序传输。因此,在一个特殊的启动条件发生后,出现了前8位序列,该序列表示数据被发送到的从服务器的地址。在每个8位的序列后面跟着一个称为确认的位。在大多数情况下,在第一个确认位之后是另一个寻址序列,但这次是为从设备的内部寄存器。在寻址序列之后紧接着数据序列,直到数据被完全发送,并以一个特殊的停止条件结束。
I2C-Communcation-Protocol

让我们更仔细地看看这些事件。当数据线下降到低而时钟线仍然很高时,启动条件发生。在此之后,时钟开始,在每个时钟脉冲期间传输每个数据位。

使用最高有效位(MSB)的设备寻址序列恒星,并以最低有效位(LSB)结尾,实际上由7位组成,因为8thBit用于指示主服务器是向从服务器写(低逻辑)还是从它读(高逻辑)。

I2C-Bits-Protocol

下一个位AKC/ NACK被从设备用来指示它是否成功地接收到前面的位序列。所以此时主设备将SDA线的控制权交给从设备,如果从设备成功地接收到之前的序列,它将把SDA线拉到确认状态。如果从服务器没有拉下SDA线路,则该条件称为not Acknowledge,这意味着它没有成功接收到前面的序列,这可能是由几个原因造成的。例如,从服务器可能很忙,可能无法理解接收到的数据或命令,无法接收更多数据,等等。在这种情况下,主设备决定如何进行。

I2C-Bits-Protocol_ADXL-X-Axis-Example

接下来是内部寄存器寻址。内部寄存器是在奴隶的存储器中包含各种信息或数据的位置。例如ADX345加速计有一个唯一的设备地址和添加内部寄存器地址的X, Y和Z轴。因此,如果我们想读取x轴的数据,首先我们需要发送设备地址,然后发送特定的内部寄存器地址的x轴。这些地址可以从传感器数据表

寻址后,数据传输序列根据在R/W位上选择的模式从主服务器或从服务器开始。数据发送完毕后,当SDA线从低到高而SCL线从高时,传输将以停止条件结束。

Arduino I2C的例子


作为一个例子,我将使用GY-80插接板,它包含5个不同的传感器和GY-521插接板,它包含3个不同的传感器。所以我们可以从8个不同的传感器获得数据,只用两根I2C总线的线。

gy --- 80-and-gy --- 521-addresses

您可以从下面的任何网站获取这些组件:

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

下面是我们如何连接板子。Arduino板的Serial Clock引脚将连接到两个插接板的Serial Clock引脚,Serial Data引脚也一样,我们将使用Gnd和Arduino板的5V引脚为单板供电。注意这里我们没有使用上拉电阻,因为电路板已经有了。

I2C-and-Arduino-Circuit-Schematics

为了和这些芯片或传感器通信我们需要知道它们的唯一地址。我们可以从传感器的数据表中找到它们。对于GY-80接线板,我们有以下4个地址:一个16进制的0x53用于3轴加速度传感器,一个16进制的0x69用于3轴陀螺仪,一个16进制的0x1E用于3轴磁力仪,一个16进制的0x77用于晴雨表和温度计传感器。

对于GY-521断接板,我们只有一个地址,那是一个十六进制0x68。我们也可以从Arduino官网找到Arduino I2C Scanner sketch来获取或查看地址。如果我们上传并运行这个草图,我们就会得到I2C总线上连接设备的地址。


传感器部件号I2C地址

3 Axis Accelerometer Analog Devices ADXL345 0x53数据表

3轴Gyrost Microelectyabo7. comronics L3G4200D 0x69数据表

3轴磁力计蜂蜜MC5883L 0x1E数据表

博世BMP085 0x77气压计+温度计数据表


在我们找到设备的地址之后,我们还需要找到其内部寄存器的地址,以便从中读取数据。例如,如果我们希望从GY-80 BESTOUT板的3轴加速度计传感器读取X轴的数据,我们需要找到存储X轴数据的内部寄存器地址。从传感器的数据表中,我们可以看到X轴的数据实际上存储在两个寄存器中,Datax0,具有十六进制地址0x32和Datax1,具有十六进制地址0x33。

Arduino I2C代码


现在让我们编写获取X轴数据的代码。所以我们将使用Arduino Wire Library,它必须包括在草图中。首先,我们必须定义传感器地址和前面找到的两个内部寄存器地址。的Wire.begin ()功能将启动线路库,并且我们还需要启动串行通信,因为我们将使用串行监视器显示来自传感器的数据。

环形()我们将从Wire.beginTransmission ()功能将开始传输到特定传感器,在我们的情况下3轴加速度计。然后与我们一起Wire.write()函数,我们将从X轴的两个寄存器中请求特定的数据。的Wire.endTransmission ()将结束传输并从寄存器传输数据。现在Wire.requestFrom ()函数将请求从两个寄存器中发送的数据或两个字节。

wire.available()函数将返回可用于检索的字节数,如果该数字与我们所请求的字节相匹配,请在我们的情况下使用2个字节,使用wire.read()功能我们将从X轴的两个寄存器中读取字节。最后,我们将将数据打印到串行监视器中。这是数据,但请记住,这是原始数据,需要进行一些数学以获得X轴的正确值。您可以在我的下一个教程中找到更多详细信息,以便使用与Arduino板的加速度计,因为我不想过载本教程,因为它的主要目标是解释Arduino I2C通信的工作原理。

/* * How I2C Communication Protocol Works - Arduino I2C Tutorial * * by Dejan, www.亚搏手机版官方下载HowToMechatronics.com * */ #include  int ADXLAddress = 0x53;//设备地址,其中也包括选择模式的第8位,在本例中读取。#define X_Axis_Register_DATAX0 0x32 // DATAX0内部寄存器的十六进制地址#define X_Axis_Register_DATAX1 0x33 // DATAX1内部寄存器的十六进制地址#define Power_Register 0x2D //电源控制寄存器int X0,X1,X_out;void setup() {Wire.begin();//启动Wire库Serial.begin(9600);延迟(100);//使能测量Wire.beginTransmission(ADXLAddress);Wire.write (Power_Register); // Bit D3 High for measuring enable (0000 1000) Wire.write(8); Wire.endTransmission(); } void loop() { Wire.beginTransmission(ADXLAddress); // Begin transmission to the Sensor //Ask the particular registers for data Wire.write(X_Axis_Register_DATAX0); Wire.write(X_Axis_Register_DATAX1); Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers Wire.requestFrom(ADXLAddress,2); // Request the transmitted two bytes from the two registers if(Wire.available()<=2) { // X0 = Wire.read(); // Reads the data from the register X1 = Wire.read(); } Serial.print("X0= "); Serial.print(X0); Serial.print(" X1= "); Serial.println(X1); }

受到推崇的

2019年面向初学者和爱好者的最佳入门级示波器

最适合初学者和爱好者的示波器

受到推崇的

2019年初学者的8个最佳Arduino Starter Kits

8个最好的arduino初学者工具包

受到推崇的

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者