详情参考文章01
详情参考文章02
UART SPI IIC的详解及三者的区别和联系

Arduino主从机之间的i2c通信

  • I2C总线定义:

    I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。

    I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既可以是主控器(或被控器),又可以是发送器(或接收器),这取决于它所要完成的功能。
    Arduino - mlx90614红外温度传感器

  • Wire Library

    这个库允许您与I2C / TWI 设备进行通信。在Arduino板上的R3布局(1.0 pinout), SDA(数据线)和SCL(时钟线)都在靠近AREF引脚的针头上。Arduino Due有两个I2C /TWI接口SDA1和SCL1靠近AREF pin,另外一个在20和21上。详情参考这里
    注:当连接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)

}
  • 测试结果

相关文章: