📅  最后修改于: 2020-11-05 03:37:53             🧑  作者: Mango
集成电路间(I2C)是一种用于在微控制器和新一代专用集成电路之间进行串行数据交换的系统。当它们之间的距离很短时使用(接收器和发射器通常在同一块印刷板上)。通过两个导体建立连接。一种用于数据传输,另一种用于同步(时钟信号)。
如下图所示,一台设备始终是主机。在通信开始之前,它执行一个从芯片的寻址。这样,一个微控制器可以与112个不同的设备进行通信。波特率通常为100 Kb / sec(标准模式)或10 Kb / sec(慢速波特率模式)。最近出现了波特率为3.4 Mb / sec的系统。通过I2C总线进行通信的设备之间的距离限制为几米。
I2C总线包含两个信号-SCL和SDA。 SCL是时钟信号,SDA是数据信号。当前的总线主控总是产生时钟信号。一些从设备有时会强制将时钟设置为低电平,以延迟主机发送更多数据的时间(或需要更多时间来准备数据,然后主机才尝试将其移出时钟)。这就是所谓的“时钟延长”。
以下是不同的Arduino板的引脚-
我们有两种模式-主代码和从代码-使用I2C连接两个Arduino板。他们是-
现在让我们看看什么是主发送器和从接收器。
以下函数用于初始化Wire库,并将I2C总线作为主机或从机加入。通常只调用一次。
Wire.begin(address) -在我们的例子中,Address是7位从机地址,因为未指定主机,它将作为主机加入总线。
Wire.beginTransmission(address) -使用给定的地址开始向I2C从设备的传输。
Wire.write(value) -将字节排队,以便从主设备传输到从设备(在beginTransmission()和endTransmission()的调用之间)。
Wire.endTransmission() -结束到由beginTransmission()开始的从设备的传输,并传输由wire.write()排队的字节。
例
#include //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(address) -地址是7位从站地址。
Wire.onReceive(接收的数据处理程序) -当从属设备从主设备接收数据时要调用的函数。
Wire.available() -返回可用于Wire.read()的字节数,应在Wire.onReceive()处理函数内部调用。
例
#include //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 //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(handler) -当主机从该从设备请求数据时,调用一个函数。
例
#include
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++;
}