Arduino进阶06.Arduino 内部集成电路(I2C)

内部集成电路(I2C)是用于微控制器和新一代专用集成电路之间的串行数据交换系统。

内部集成电路(I2C)是用于微控制器和新一代专用集成电路之间的串行数据交换系统。当它们之间的距离很短(接收器和发射器通常在同一个印刷电路板上)时使用。通过两根导线建立连接。一个用于数据传输,另一个用于同步(时钟信号)。

如下图所示,一个设备始终是主设备。它在通信开始之前执行一个从芯片的寻址。这样,一个微控制器可以与112个不同的设备进行通信。波特率通常为100 Kb/sec(标准模式)或10 Kb/sec(慢波特率模式)。最近出现了波特率为3.4 Mb/s的系统。通过I2C总线通信的设备之间的距离限制在几米之内。

内部集成电路

板的I2C引脚

I2C总线由两个信号组成 – SCL和SDA。SCL是时钟信号,SDA是数据信号。当前总线主机总是产生时钟信号。一些从设备可能迫使时钟低电平以延迟主设备发送更多数据(或者在主设备尝试将数据写出之前请求更多的时间来准备数据)。这被称为“时钟伸展”。

以下是不同Arduino板的引脚:

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

我们有两种模式 – 主代码和从代码 – 使用I2C连接两个Arduino板。它们是:

  • Master Transmitter / Slave Receiver 主发射器/从接收器
  • Master Receiver / Slave Transmitter 主接收器/从发射器

主发射器/从接收器

让我们现在看看什么是主发送器和从接收器。

主发射器

以下函数用于初始化Wire库,并将I2C总线作为主器件或从器件加入。这通常只被调用一次。

  • Wire.begin(地址) – 在我们的例子中,地址是7位从地址,因为未指定主机,它将作为主机加入总线。
  • Wire.beginTransmission(地址) – 开始向给定地址的I2C从设备发送数据。
  • Wire.write() – 用于从主设备传输到从设备的队列字节(在beginTransmission()和endTransmission()之间的调用)。
  • Wire.endTransmission() – 结束由beginTransmission()开始的对从设备的传输,并传输由wire.write()排队的字节。

示例

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

从接收器

使用以下函数:

  • Wire.begin(地址) – 地址是7位从地址。
  • Wire.onReceive(收到的数据处理程序) – 当从设备从主设备接收数据时调用的函数。
  • Wire.available() – 返回Wire.read()可用于检索的字节数,应在Wire.onReceive()处理程序中调用。

示例

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

主接收器/从发射器

让我们现在看看什么是主接收器和从发射器。

主接收器

主机被编程为请求,然后读取从唯一寻址的从机Arduino发送的数据字节。

使用以下函数:

Wire.requestFrom(地址,字节数) – 主设备用于请求从设备的字节。然后可以使用函数wire.available()和wire.read()检索字节。

示例

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

从发射器

使用以下函数:

Wire.onRequest(处理程序) – 当主设备从此从设备请求数据时调用该函数。

示例

#include <Wire.h> void setup() { Wire.begin(2); // join i2c bus with address #2 Wire.onRequest(requestEvent); // register event} Byte x = 0;void loop() { delay(100); } // function that executes whenever data is requested by master// this function is registered as an event, see setup()void requestEvent() { Wire.write(x); // respond with message of 1 bytes as expected by master x++; }

发布者:suiyublg,转转请注明出处:https://huibian.net/1306-2/

(29)
suiyublg的头像suiyublg
上一篇 2017年4月9日 15:20
下一篇 2017年4月11日 14:28

相关推荐

  • Arduino教程35.Arduino 多维数组

    具有两个维度(即,下标)的数组通常表示由排列在行和列中的信息组成的值的表格。 以下是多维数组的关键特性: 下图说明了一个二维数组 a 。该数组包含三行四列,因此它是一个3乘4的数组。通常,具有 m 行和 n 列的数组称为 m乘n数组。 数组 a 中的每个元素都由&nbs…

    2017年3月30日
    19200
  • Arduino教程18.Arduino 按位运算符

    假设变量A为60,变量B保持13,则: 运算符名称 运算符简写 描述 例子 and(与) & 如果同时存在于两个操作数中,二进制AND运算符复制一位到结果中。 (A & B) 将得出12,即0000 1100 or(或) | 如果存在于任一操作数中,二进制OR运算符复制一位到结果中。 (A | B)将得出61,即0011 1101 …

    2017年3月23日
    16200
  • Arduino教程32.Arduino millis()函数

    此函数用于返回Arduino板开始运行当前程序时的毫秒数。这个数字在大约50天后溢出,即回到零。 millis()函数语法 millis () ; 此函数从程序开始处返回毫秒。 例子 unsigned long time; void setup() { Serial.begin(9600); } void loop() { Serial.print(“Tim…

    2017年3月29日
    18400
  • Arduino项目05.Arduino 键盘注销

    本示例使用键盘库将你在计算机上的用户会话注销,此时ARDUINO UNO上的引脚2被拉至接地。草图同时按两个或三个按键的顺序模拟按键,并在短暂的延迟之后释放它们。 警告 – 当你使用 Keyboard.print()命令时,Arduino接管你的计算机键盘。为确保在使用此功能运行草图时不会失去对计算机的控制,请在调用Keybo…

    2017年4月16日
    18900
  • Arduino函数库05.Arduino 三角函数

    你需要使用三角几何来计算移动物体的距离或角速度。Arduino提供了传统的三角函数(sin,cos,tan,asin,acos,atan),可以通过编写它们的原型来概括。Math.h包含三角函数的原型。 三角函数的精确语法 例子

    2017年4月4日
    22900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • sosoao的头像
    sosoao 2017年8月21日 16:27

    人格

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
欢迎大家来到大雄学编程!