I2C(Inter-Integrated Circuit)是一种串行通信协议,由飞利浦公司在 1980 年代开发,用于在电子设备内部连接微控制器与外围设备(如传感器、存储器、显示屏等)。以下是关于 I2C 的详细介绍:
1. 基本特点
(1)双线制:仅需两根信号线即可实现通信:
SDA(Serial Data Line):数据传输线,双向通信。
SCL(Serial Clock Line):时钟线,由主设备(Master)控制。
(2)多主多从:支持多个主设备和从设备连接在同一总线上,通过地址区分不同设备。
(3)硬件简单:需在 SDA 和 SCL 上拉电阻(通常 4.7kΩ)到电源,形成开漏输出结构。
(4)传输速率:
标准模式:100kbps
快速模式:400kbps
高速模式:3.4Mbps
(5)寻址方式:7 位或 10 位地址,其中 7 位地址最多支持 127 个从设备(0x00-0x7F)。
2. 通信原理
(1) 起始和停止条件
起始条件(Start):SCL 为高电平时,SDA 由高电平变为低电平,表示通信开始。
停止条件(Stop):SCL 为高电平时,SDA 由低电平变为高电平,表示通信结束。
(2) 数据传输
每个字节(8 位)后需跟随一个应答位(ACK/NACK)。
数据传输时,高位(MSB)优先。
(3) 应答机制
接收方在接收到 8 位数据后,需在第 9 个时钟周期拉低 SDA 表示应答(ACK),否则为非应答(NACK)。
(4) 通信流程
① 主设备发送起始信号。
② 主设备发送从设备地址(7 位地址 + 1 位读写位,0 表示写,1 表示读)。
③ 从设备返回 ACK/NACK。
④ 主设备发送数据(写操作)或接收数据(读操作)。
⑤ 主设备发送停止信号。
3. 典型应用场景
(1)传感器连接:如温湿度传感器(DHT22、SHT30)、加速度计(MPU6050)。
(2)存储器读写:如 EEPROM(AT24C02)、实时时钟模块(DS1307)。
(3)显示屏控制:如 OLED/I2C LCD 模块。
(4)微控制器间通信:实现多 MCU 协同工作。
4. 硬件设计注意事项
(1)上拉电阻选择:根据总线电容和传输速率调整,通常 4.7kΩ(标准模式)至 1kΩ(高速模式)。
(2)总线长度:高速通信时需缩短总线长度,减少信号衰减。
(3)隔离保护:在工业环境中,可使用光耦或数字隔离器隔离 I2C 总线,提高抗干扰能力。
5. 软件实现示例(Python)
以下是使用 Python 的smbus库读取 I2C 设备(如温度传感器)的示例:
import smbus
import time
# 创建I2C总线对象(Raspberry Pi默认I2C总线为1)
bus = smbus.SMBus(1)
# I2C设备地址(示例:0x48)
DEVICE_ADDRESS = 0x48
# 读取温度传感器数据
def read_temperature():
# 发送命令到传感器(示例:读取温度寄存器)
bus.write_byte(DEVICE_ADDRESS, 0x01) # 发送命令码0x01
time.sleep(0.1) # 等待传感器响应
# 读取2字节数据
data = bus.read_i2c_block_data(DEVICE_ADDRESS, 0x00, 2)
# 转换数据为温度值(示例:根据传感器数据格式转换)
temperature = ((data[0] << 8) | data[1]) / 256.0
return temperature
# 主程序
try:
while True:
temp = read_temperature()
print(f"温度: {temp:.2f}°C")
time.sleep(1)
except KeyboardInterrupt:
print("程序已停止")
6. 优缺点
(1)优点
① 仅需两根线,硬件成本低。
② 支持多设备连接,便于扩展。
③ 通信协议简单,易于实现。
(2)缺点
① 传输速率相对 SPI 等协议较低。
② 总线长度有限,不适合长距离通信。
③ 开漏结构需上拉电阻,增加功耗。
7. 与其他通信协议的对比
协议 | 信号线数量 | 传输速率 | 拓扑结构 | 典型应用 |
I2C | 2(SDA+SCL) | 100kbps-3.4Mbps | 多主多从,总线型 | 短距离设备互联 |
SPI | 4(MOSI+MISO+SCLK+CS) | 几十 Mbps | 一主多从,星形 | 高速数据传输(如 SD 卡) |
UART | 2(TX+RX) | 几十 kbps - 几 Mbps | 点对点 | 调试接口、串口通信 |
CAN | 2(CAN_H+CAN_L) | 1Mbps | 多主多从,总线型 | 汽车电子、工业控 |