Arduino中进行I2C通信发送数据案例分析_第1页
Arduino中进行I2C通信发送数据案例分析_第2页
Arduino中进行I2C通信发送数据案例分析_第3页
Arduino中进行I2C通信发送数据案例分析_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 arduino中进行i2c通信发送数据案例分析 在之前的文章中,我们介绍了arduino之间的spi通信。今天我们将学习另一种串行通信协议:i2c(内部集成电路)。比较i2c和spi,i2c只有两条线,而spi使用四条,i2c可以有多个主机和从机,而spi只能有一个主机和多个从机。因此,如果项目中有多个微控制器需要作为主机,那么就采用i2c。 i2c通信通常用于与陀螺仪、加速度计、气压传感器、led显示器等进行通信。在本篇文章中,我们将使用i2c总线在两个arduino开发板之间进行通信,并且使用电位计将值(0到127)相互发送。这些值将显示在连接到每个arduino的1602液晶显示屏上。

2、文章中,一个arduino开发板作为主机,另一个开发板作为从机。现在让我们从关于i2c通信的介绍开始吧。什么是i2c通信协议?术语iic代表“inter integrated circuits”。它通常表示为i2c或iic,甚至在某些地方表示为2线接口协议(twi),但它们代表的含义是一样的。 i2c是同步通信协议,也就是说共享信息的设备必须共享公共时钟信号。它只有两根线来共享信息,其中一根用于时钟信号,另一根用于发送和接收数据。i2c通信如何工作?i2c通信最初由phillips引入。如前所述,它有两根导线,这两根导线将连接在两个设备上。这里一个设备称为主机,另一个设备称为从机。通信应该并且

3、将始终发生在一个主机和一个从机之间。 i2c通信的优点是可以将多个从机连接到一个主机。完整的通信通过这两条导线进行,即串行时钟(scl)和串行数据(sda)。 串行时钟(scl):与主设备共享主设备生成的时钟信号 串行数据(sda):在主机和从机之间发送数据。在任何给定时间,只有主机才能启动通信。由于总线中有多个从站,因此主站必须使用不同的地址来引用每个从站。当被寻址时,只有具有该特定地址的从机将应答该信息,而其他地址继续退出。这样我们就可以使用相同的总线与多个设备进行通信。i2c的电压电平未预定义。 i2c通信灵活,意味着由5v电源供电的器件,可以使用5v用于i2c,3.3v器件可以使用3v

4、进行i2c通信。但是,如果两个运行在不同电压下的设备需要使用i2c进行通信呢? 5v i2c总线不能与3.3v器件连接。在这种情况下,电压移位器用于匹配两个i2c总线之间的电压电平。有一些条件可以构成传输。传输的初始化从sda的下降沿开始,在下图中定义为“start”条件,其中主机将scl设为高电平,同时将sda设置为低电平。如下图所示,sda的下降沿是start条件的硬件触发。在此之后,同一总线上的所有设备都进入监听模式。同样的,sda的上升沿停止传输,在上图中显示为“stop”条件,其中主机将scl置为高电平并且还释放sda以变为高电平。因此,sda的上升沿会阻止传输。r / w位表示后续

5、字节的传输方向,如果为高电平表示从机将发送,如果为低则表示主机将发送。每个位在每个时钟周期发送,因此传输一个字节需要8个时钟周期。在发送或接收每个字节之后,保持第九个时钟周期用于ack / nack(确认/未确认)。该ack位由从机或主机根据情况生成。对于ack位,sda在第9个时钟周期由主机或从机设置为低电平。所以它被认为是低,否则nack。在哪里使用i2c通信?i2c通信仅用于短距离通信。它在某种程度上肯定是可靠的,因为它具有同步的时钟脉冲以使其智能化。该协议主要用于与必须向主设备发送信息的传感器或其他设备进行通信。当微控制器必须使用最少的导线与许多其他从模块通信时非常方便。如果您正在寻找

6、远程通信,您应该尝试rs232,如果您正在寻找更可靠的通信,您应该尝试spi协议。arduino中的i2c下图显示了arduino uno中的i2c引脚。i2c总线arduino中的引脚sdaa4scla5在开始使用两个arduino编程i2c之前,我们需要了解arduino ide中使用的wire库。库wire.h包含在程序中,用于使用以下i2c通信函数。1. wire.begin(address):用途:该库用于与i2c设备进行通信。初始化wire库,并作为从机或主机加入i2c总线。address:7位从机地址是可选的,如果未指定地址,类似wire.begin(),将作为主机加入总线。2.

7、 wire.read():用途:该函数用于读取从主机或从机接收的字节,该字节是在调用requestfrom()后从一个从机发送到主设备的字节,或从主设备发送到从机的字节。3. wire.write():用途:该函数用于将数据写入从机或主机。从机到主机:当主站中使用wire.requestfrom()时,从机将数据写入主机。主机到从机:从主机到从机的传输,wire.write()用在调用wire.begintransmission()和wire.endtransmission()之间。wire.write()可以写成: wire.write(value)value:要作为单个字节发送的值。 wi

8、re.write(string):string:要作为一系列字节发送的字符串。 wire.write(data,length):data:要作为字节发送的数据数组length:要传输的字节数。4. wire.begintransmission(address):用途:该函数用于开始使用给定的从地址传输到i2c设备。随后,使用write()函数构建用于传输的字节队列,然后通过调用endtransmission()函数传输它们。address:发送设备的7位地址。5. wire.endtransmission();用途:此函数用于结束由begintransmission()发起的从机的传输,并传输

9、由wire.write()排队的字节。6. wire.onrequest();用途:当主设备使用wire.requestfrom()请求来自从设备的数据时,将调用此函数。这里我们可以包含wire.write()函数来向主机发送数据。7. wire.onreceive();用途:当从设备从主设备接收数据时,将调用此函数。这里我们可以包含wire.read();用于读取从主站发送的数据的函数。8. wire.requestfrom(addres,quantity);用途:该函数在主设备中用于从从设备请求字节。函数wire.read()用于读取从设备发送的数据。address:要从中请求字节的设备的

10、7位地址quantity:要请求的字节数需要的组件 arduino uno开发板 1602 lcd显示模块 10k电位器 面包板 连接导线电路原理图工作过程这里为了演示arduino中的i2c通信,我们使用两个arduino uno和两个1602 lcd显示器相互连接,并在两个arduino开发板上使用两个电位器来确定从主设备到从设备和从设备到主设备的发送值(0到127)通过改变电位器。我们使用电位器将arduino引脚a0的输入模拟值从(0到5v)转换为模拟到数字值(0到1023)。然后,这些adc值进一步转换为(0到127),因为我们只能通过i2c通信发送7位数据。 i2c通信通过ardu

11、ino的a4和a5引脚上的两条线进行。通过改变主机的电位器,从机arduino开发板的lcd的值将发生变化,反之亦然。arduino中的i2c编程本篇文章有两个程序,一个用于主机arduino,另一个用于从机arduino。主机arduino编程介绍1.首先,我们需要包含用于使用i2c通信功能的wire库和用于使用lcd功能的lcd库。还需要为1602 lcd定义lcd引脚。#includewire.h#includeliquidcrystal.hliquidcrystal lcd(2, 7, 8, 9, 10, 11);2.在void setup()函数中,我们以波特率9600启动串行通信。

12、serial.begin(9600);接下来在引脚(a4,a5)上启动i2c通信wire.begin(); /begins i2c communication at pin (a4,a5)接下来我们在1602模式下初始化lcd显示模块并显示欢迎信息,然后在五秒后清除。lcd.begin(16,2); /initilize lcd displaylcd.setcursor(0,0); /sets cursor at first line of displaylcd.print(“circuit digest”); /prints circuit digest in lcdlcd.setcurso

13、r(0,1); /sets cursor at second line of displaylcd.print(“i2c 2 arduino”); /prints i2c arduino in lcddelay(5000); /delay for 5 secondslcd.clear(); /clears lcd display3.在void loop()函数中首先,我们需要从slave获取数据,因此我们使用requestfrom()和从地址8,我们请求一个字节wire.requestfrom(8,1);使用wire.read()读取接收的值byte masterreceive = wire.

14、read();接下来,我们需要读取连接到引脚a0的主机arduino电位器的模拟值int potvalue = analogread(a0);我们将该值转换为0到127的字节。byte mastersend = map(potvalue,0,1023,0,127);接下来我们需要发送转换后的值,使用8地址开始从机sarduino的传输wire.begintransmission(8);wire.write(mastersend);wire.endtransmission();接下来,我们显示来自从机arduino的接收值,延迟为500微秒,我们不断接收并显示这些值。lcd.setcursor(

15、0,0); /sets currsor at line one of lcdlcd.print(“ master ”); /prints master at lcdlcd.setcursor(0,1); /sets cursor at line two of lcdlcd.print(“slaveval:”); /prints slaveval: in lcdlcd.print(masterreceive); /prints masterreceive in lcd received from slaveserial.println(“master received from slave”);

16、 /prints in serial monitorserial.println(masterreceive);delay(500);lcd.clear();从机arduino编程介绍1.与主机设备相同,首先我们需要包含用于使用i2c通信功能的wire库和用于使用lcd功能的lcd库。还为1602 lcd定义lcd引脚。#includewire.h#includeliquidcrystal.hliquidcrystal lcd(2, 7, 8, 9, 10, 11);2. 在void setup()函数中,我们以波特率9600启动串行通信。serial.begin(9600);接下来在引脚(a

17、4,a5)上启动i2c通信,从地址设定为8。这里指定从地址非常重要。wire.begin(8);接下来,当从机从主机接收值并且主机请求从机的值时,我们需要调用该函数wire.onreceive(receiveevent);wire.onrequest(requestevent);接下来我们在16x2模式下初始化lcd显示模块并显示欢迎信息,然后在五秒后清除。lcd.begin(16,2); /initilize lcd displaylcd.setcursor(0,0); /sets cursor at first line of displaylcd.print(“circuit diges

18、t”); /prints circuit digest in lcdlcd.setcursor(0,1); /sets cursor at second line of displaylcd.print(“i2c 2 arduino”); /prints i2c arduino in lcddelay(5000); /delay for 5 secondslcd.clear(); /clears lcd display3.接下来,我们有两个函数,一个用于请求事件,另一个用于接收事件对于请求事件当主机从从机请求值时,将执行该函数。此函数从从机电位器获取输入值并以7位转换,然后将该值发送给主机。void requestevent()int potvalue = analogread(a0);byte slavesend = map(potvalue,0,1023,0,127);wire.write(slavesend);对于接收事件当主机通过从机地址(8)向从机发送数据时,将执行该函数。此函数从主机读取接收的值并存储在byte类型的变量中。void receiveevent (int howmany)s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论