I2C,Inter-Integrated Circuit,缩写也写作IIC。在Arduino里也叫TWI(Two-Wire Interface)。是菲利普(现在叫NXP)公司开发的通信协议。最初用于电视,以减少芯片之间的连接。Atmel搞了个TWI,Two-Wire Interface,两线接口。其实与I2C是一样的。ATmega328内置了TWI,Arduino UNO模拟输入脚A4与A5兼作TWI的SDA与SCL引脚。Arduino的Wire库支持I2C通信。选菜单项项目|“加载库”|“Wire装入Wire库。
它是嵌入式总线目前应用最广泛。使用I2C的组件有:8X8点阵HT16K33、16路PWM舵机驱动板,TM1637 六位数字管显示按钮扫描模块GP2Y0E03红外测距传感器模块,Sparkfun陀螺仪加速度计,DS1307 RTC时钟模块、LCD1602A(带I2C扩展小板),HT16K33(8X8单色点阵LED)、SHT35温湿度传感器,GY-49 MAX光照传感器44009,VL53L1X VL53L0X激光测距传感器等。你进淘宝用关键词I2C”或“IIC搜索,可以知道,带I2C总线的组件有多少?你进淘宝用关键词I2C”或“IIC搜索,可以知道,带I2C总线有多少组件?现在,所有需要高速传输的存储芯片只能使用SPI,其它多用I2C了。
I2C它是一条总线,所以挂在同一条线上I2C总线上的每个组件都必须有一个独特的地址,以确保没有冲突。地址范围为0~127(0~7FH)。主机地址为0,最多允许127个从机。Arduino只连接一个I2C组件还需要了解组件I2C地址,因为是的I2C组件编程时需要知道其总线地址。
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo用来等串口监视器的板 Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices ; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // 等待5秒,下次扫描 }
操作上述代码,可以在串口监视器中读取被测组件I2C总线地址。写下来,贴在组件上。