arduino——I2C通讯

Arduino I2C 通信引脚

对于I2C通信,Arduino的不同电路板具有不同的引脚专用于SDA和SCL引脚。下面的列表显示了不同电路板中的这些引脚号。

  1. 在Arduino UNO中,引脚A4 = SDA,引脚A5 = SCL
  2. 对于Arduino Mega2560,引脚20 = SDA,引脚21 = SCL
  3. 在Arduino Leonardo中,引脚2 = SDA,引脚3 = SCL
  4. 对于Arduino Due,引脚20 = SDA,引脚21 = SCL,SDA1,SCL1

下图显示了 Arduino UNO 中的 SDA 和 SCL 引脚,它们将在本文中使用。

arduino——I2C通讯_第1张图片

Arduino I2C 通信库

“有线”库用于Arduino中的I2C通信。以下是此库的重要功能。

Wire.begin(address)

使用此命令启动导线库,并将 I2C 总线作为主总线或从总线连接。地址是可选的。此地址由从器件的七位组成。如果未指定;设备以主设备身份加入总线。

Wire.requestFrom(地址、数量)

主设备使用此命令从设备请求字节。“Available ()” and “read ()” 函数可用于在之后收集这些字节。“地址”是要从其发出请求的特定从设备的地址,“数量”指定要请求的字节数。

Wire.beginTransmission(address)

此命令使用给定地址的从属设备启动字节的传输。之后,要传输的字节使用 write () 函数排队,这些字节使用 endTransmission() 函数进行传输。

Wire.endTransmission()

使用此命令结束使用 wire.beginTransmission() 函数启动的字节的传输。

此函数接受参数。如果参数为 TRUE,则在传输字节后发送 stop 命令,并且 I2C 总线不受限制。

如果参数为 FALSE,它将在传输字节后发送重新启动命令,并且总线不能幸免,并且它阻止另一个主设备在消息之间传输。

Wire.Write ()

此命令一次执行 2 个功能之一。

  1. 当主设备发出请求时,该函数从从设备写入数据。
  2. 在对 beginTransmission () 函数和 endTransmission () 函数的调用之间,此命令用于对字节进行传输的队列。

Wire.read ()

请求后从()命令,从从设备传输到主设备或主设备到从设备传输的字节;使用此命令读取。

Wire.available()

此函数返回调用 read () 函数后可用于检索的字节数。在主设备中,它是在 requestFrom() 函数之后调用的,在从设备中,它是在 onReceive () 函数内部调用的。

Wire.onReceive(handler)

这注册了一个函数,当从设备接收到来自主设备的传输时,该函数被调用。调用的函数由处理程序表示。

两个 Arduino 板之间的 I2C 连接

下图显示了两个Arduino板之间的I2C连接。此外,它还显示了LED与从属Arduino的D13的连接。通过一个 220 欧姆限流电阻器将 LED 的阳极引脚与 Arduino 数字引脚 13 连接起来。阴极引脚将接地。

  1. 接下来,要启用 I2C 通信,请将主 Arduino 的 I2C 引脚 A4 和 A5 连接到从设备 Arduino 的 I2C 引脚。
  2. 之后,通过使用跳线共享两个Arduino板的接地。
  3. 建立连接后,将从站和主站的代码上传到Arduino板。

arduino——I2C通讯_第2张图片

Arduino I2C 主机代码

此处已包含连线库,并启动了变量 x。此变量的值将传输到从设备。

#include 
int x = 0;

这里已经调用了 wire.begin() 函数。详细信息可以在上面的部分找到。此外,内部缓冲区已启动。

void setup() 
{
  Wire.begin(); 
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

此处的传输已从地址 9 启动。在此之后,x 的值已排队等待通过 I2C 总线传输。wire.write() 函数在 I2C 总线上传输当前值“x”。最后,x 的值已传输,并且使用 endTranmission () 命令保留了总线。

Wire.beginTransmission(9);
Wire.write(x);              
Wire.endTransmission();

x 的值在循环中以 1 的步长递增,延迟为 200 毫秒,如果 x 的值大于 6,则此值重置为 0,然后从 0 再次递增。

x++;
if (x > 6) 
  {
    x = 0;
  }
delay(200);

完整的Arduino主机代码

#include 
int LED=13;
int x = 0;

void setup() 
{
  Wire.begin(); 
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

void loop() 
{
  Wire.beginTransmission(9);
  Wire.write(x);              
  Wire.endTransmission();
 
  x++;
  if (x > 6) 
  {
    x = 0;
  }
  delay(200);
}

Arduino I2C 从机代码

首先,我们定义Arduino的引脚D13的符号名称。引脚D13将根据从主器件接收的值打开和关闭。此外,我们声明并初始化一个零变量 x。此变量 x 将用于存储从主 Arduino 接收的值。

#include  // add i2c library 
int LED = 13;
int x = 0;

在设置功能中,使用 pinMode() 函数将 LED 引脚设置为输出引脚。还将 Arduino 的从地址设置为 9。

 pinMode(LED, OUTPUT);
 Wire.begin(9); 
 Wire.onReceive(receiveEvent);
 Serial.begin(9600);

声明和函数调用已按照上一节中的定义执行。这里接收事件 () 函数已通过调用 onReceive(处理程序) 函数进行注册。

void receiveEvent(int bytes) 
{
  x = Wire.read();
}

此接收事件 () 函数已在此处定义。它读取从1到6的值,该值将由主设备发送;然后将此值存储在变量 x 中,该变量已在程序的 setup 函数中声明。

void loop() 
{
  if (x <= 3) 
  {
    digitalWrite(LED, HIGH);
  }
  else 
  {
    digitalWrite(LED, LOW);
  }
}

如果从主设备接收的 x 值小于或等于 3,则引脚 13 处的 LED 设置为导通,如果 x 的值大于 3,则引脚 13 处的 LED 设置为熄灭。

完整的从机代码

#include 
int LED = 13;
int x = 0;

void setup() 
{
  pinMode (LED, OUTPUT);
  Wire.begin(9); 
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
}

void receiveEvent(int bytes) 
{
  x = Wire.read();
}

void loop() 
{
  if (x <= 3) 
  {
    digitalWrite(LED, HIGH);
  }
  else 
  {
    digitalWrite(LED, LOW);
  }
}

你可能感兴趣的:(arduino,单片机,嵌入式硬件)