一、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); }
测试结果: