PAGE1
PAGE1
高级功能:I2C通信
I2C(Inter-IntegratedCircuit)通信是一种简单的两线式串行通信协议,广泛应用于单片机和各种传感器、外设之间的通信。I2C通信通过两条线(时钟线SCL和数据线SDA)实现主设备与从设备之间的数据交换。在ArduinoGemma上,虽然ATtiny85没有内置的I2C硬件支持,但可以通过软件模拟I2C通信。
I2C通信的基本原理
I2C通信的基本原理是通过时钟线(SCL)和数据线(SDA)来传输数据。主设备通过SCL线发送时钟信号,从设备在SCL线的控制下通过SDA线发送或接收数据。I2C总线上的设备都有一个唯一的地址,主设备通过这个地址与特定的从设备通信。I2C通信支持多主设备和多从设备的连接,使得多个设备可以共用同一总线。
I2C通信的硬件连接
在ArduinoGemma上,I2C通信可以通过GPIO引脚来实现。通常,Gemma的引脚D0和D1可以分别用作SDA和SCL线。为了保证通信的稳定性,建议在SDA和SCL线上各连接一个4.7kΩ的上拉电阻。
软件模拟I2C通信
尽管ATtiny85没有内置的I2C硬件支持,但可以使用软件库来实现I2C通信。Arduino社区提供了一个名为TinyWire的库,专门用于ATtiny85的I2C通信。
安装TinyWire库
打开ArduinoIDE。
依次点击工具-库管理。
在搜索框中输入TinyWire,找到相应的库并安装。
I2C通信示例
1.配置Gemma作为I2C主设备
假设我们要使用Gemma作为I2C主设备,读取一个I2C温度传感器(例如TMP102)的数据。
代码示例
#includeTinyWire.h
#defineTMP102_ADDRESS0x48//TMP102传感器的I2C地址
voidsetup(){
TinyWire.begin();//初始化I2C通信
Serial.begin(9600);//初始化串口通信
}
voidloop(){
int16_ttemperature=readTemperature();
Serial.print(Temperature:);
Serial.println(temperature/128.0);//将温度值转换为摄氏度
delay(1000);//每秒读取一次温度
}
int16_treadTemperature(){
int16_ttemp=0;
TinyWire.send(0x00);//发送读取温度寄存器的命令
TinyWire.endTransmission();//结束传输
TinyWire.requestFrom(TMP102_ADDRESS,2);//请求2个字节的数据
if(TinyWire.available()==2){
temp=TinyWire.receive();//接收第一个字节
temp|=TinyWire.receive()8;//接收第二个字节并拼接
}
returntemp;
}
代码解释
初始化I2C通信:
TinyWire.begin();
这行代码初始化I2C通信,使Gemma可以作为主设备。
初始化串口通信:
Serial.begin(9600);
这行代码初始化串口通信,用于调试和显示温度数据。
读取温度数据:
int16_treadTemperature(){
int16_ttemp=0;
TinyWire.send(0x00);//发送读取温度寄存器的命令
TinyWire.endTransmission();//结束传输
TinyWire.requestFrom(TMP102_ADDRESS,2);//请求2个字节的数据
if(TinyWire.available()==2){
temp=TinyWire.receive();//接收第一个字节
temp|=TinyWire.receive()8;//接收第二个字节并拼接
}
returntemp;
}
TinyWire.send(0x00):发送读取温度寄存器的命令。
TinyWire.endTransmission():结束传输。
TinyWire.requestFrom(TMP102_ADDRESS,2):请求