Arduino I2C 通信引脚
对于I2C通信,Arduino的不同电路板具有不同的引脚专用于SDA和SCL引脚。下面的列表显示了不同电路板中的这些引脚号。
- 在Arduino UNO中,引脚A4 = SDA,引脚A5 = SCL
- 对于Arduino Mega2560,引脚20 = SDA,引脚21 = SCL
- 在Arduino Leonardo中,引脚2 = SDA,引脚3 = SCL
- 对于Arduino Due,引脚20 = SDA,引脚21 = SCL,SDA1,SCL1
下图显示了 Arduino UNO 中的 SDA 和 SCL 引脚,它们将在本文中使用。
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 个功能之一。
- 当主设备发出请求时,该函数从从设备写入数据。
- 在对 beginTransmission () 函数和 endTransmission () 函数的调用之间,此命令用于对字节进行传输的队列。
Wire.read ()
请求后从()命令,从从设备传输到主设备或主设备到从设备传输的字节;使用此命令读取。
Wire.available()
此函数返回调用 read () 函数后可用于检索的字节数。在主设备中,它是在 requestFrom() 函数之后调用的,在从设备中,它是在 onReceive () 函数内部调用的。
Wire.onReceive(handler)
这注册了一个函数,当从设备接收到来自主设备的传输时,该函数被调用。调用的函数由处理程序表示。
两个 Arduino 板之间的 I2C 连接
下图显示了两个Arduino板之间的I2C连接。此外,它还显示了LED与从属Arduino的D13的连接。通过一个 220 欧姆限流电阻器将 LED 的阳极引脚与 Arduino 数字引脚 13 连接起来。阴极引脚将接地。
- 接下来,要启用 I2C 通信,请将主 Arduino 的 I2C 引脚 A4 和 A5 连接到从设备 Arduino 的 I2C 引脚。
- 之后,通过使用跳线共享两个Arduino板的接地。
- 建立连接后,将从站和主站的代码上传到Arduino板。
Arduino I2C 主机代码
此处已包含连线库,并启动了变量 x。此变量的值将传输到从设备。
#include <Wire.h>
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 <Wire.h>
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 <Wire.h> // 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 <Wire.h>
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);
}
}