一、Arduino主从机之间的i2c通信
I2C总线定义:I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既可以是主控器(或被控器),又可以是发送器(或接收器),这取决于它所要完成的功能。二、Wire Library
这个库允许您与I2C / TWI 设备进行通信。在Arduino板上的R3布局(1.0 pinout), SDA(数据线)和SCL(时钟线)都在靠近AREF引脚的针头上。Arduino Due有两个I2C /TWI接口SDA1和SCL1靠近AREF pin,另外一个在20和21上。详情可见:https://www.arduino.cc/en/Reference/Wire
注:当连接SDA/SCL引脚时上拉电阻需要被连接,mega2560的上拉电阻在20-21引脚上。(没另外设置,调试成功,原因暂且未知?)
Functions
- begin()
- requestFrom()
- beginTransmission()
- endTransmission()
- write()
- available()
- read()
- SetClock()
- onReceive()
- onRequest()
三、测试demo
引脚连接:
1 VCC ------VCC
2 GND ------ GND
3 SCL ------ 21(SCL)或者SCL1
4 SDA ------20(SDA)或者SDA1
代码
#include <Wire.h>
void setup() {
// put your setup code here, to run once:
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
uint16_t result;
float temp;
void loop() {
// put your main code here, to run repeatedly:
Wire.beginTransmission(0x5A);
Wire.write(0x07); // sends instruction byte
Wire.endTransmission(false); // stop transmitting
Wire.requestFrom(0x5A, 3);//Send data n-bytes read
result = Wire.read(); //Receive DATA
result |= Wire.read() << 8; //Receive DATA
uint8_t pec = Wire.read();
temp = result*0.02-273.15;//
Serial.print(temp);
Serial.println();
// delay(500);
}
测试结果: