基本信息
文件名称:Arduino 系列:Arduino Gemma (基于 ATtiny85)_(14).高级功能:I2C通信.docx
文件大小:29.2 KB
总页数:34 页
更新时间:2025-06-24
总字数:约1.75万字
文档摘要

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):请求