I2C(Inter-Integrated Circuit,集成电路总线)是一种同步、串行、半双工通信总线,由Philips(现NXP)在1982年推出,广泛应用于传感器、EEPROM、RTC(实时时钟)、LCD控制器等低速外设的通信。
| 特性 | 说明 |
|---|---|
| 通信方式 | 同步串行(半双工) |
| 信号线 | SDA(数据线)、SCL(时钟线) |
| 传输速率 | 标准模式(100kbps)、快速模式(400kbps)、高速模式(3.4Mbps) |
| 寻址方式 | 7位或10位设备地址(支持多主多从) |
| 总线拓扑 | 多设备共享总线(开漏输出,需上拉电阻) |
| 电平标准 | 3.3V或5V(兼容不同电压设备) |
I2C总线仅需两根线(SDA、SCL),所有设备并联在总线上,通过上拉电阻(通常4.7kΩ)确保空闲时高电平。
SCL(Serial Clock):主设备提供时钟信号。
SDA(Serial Data):双向数据线,主从设备均可驱动(开漏输出)。
关键点:
所有设备SDA、SCL并联,通过地址区分。
开漏输出:设备只能拉低电平,释放后由上拉电阻拉高。
上拉电阻:典型值3.3V系统用2.2kΩ~4.7kΩ,5V系统用4.7kΩ~10kΩ。
I2C通信以字节(8bit)为单位,每个字节后跟一个ACK/NACK应答位。
起始条件(START):SCL高电平时,SDA由高→低。
设备地址(7位/10位) + 读写位(R/W):
7位地址:高7位为地址,第8位为读写标志(0=写,1=读)。
10位地址:特殊格式扩展(详见协议手册)。
应答(ACK):接收方在第9个时钟周期拉低SDA表示应答。
数据传输:每8bit数据后跟一个ACK/NACK。
停止条件(STOP):SCL高电平时,SDA由低→高。
| 信号 | 描述 |
|---|---|
| START | SCL=高,SDA下降沿 |
| STOP | SCL=高,SDA上升沿 |
| ACK | 接收方在第9个SCL周期拉低SDA |
| NACK | 接收方在第9个SCL周期保持SDA高电平(表示传输结束或错误) |
| 重复START | 主设备在不释放总线的情况下发起新传输(用于复合操作,如写后读) |
[START] + [设备地址(0)] + [ACK] + [数据1] + [ACK] + ... + [数据N] + [ACK/NACK] + [STOP]
示例:向地址0x50的EEPROM写入数据0xAA。
主设备发送:0xA0(0x50<<1 | 0)。
EEPROM回复ACK。
主设备发送数据0xAA。
EEPROM回复ACK。
主设备发送STOP。
[START] + [设备地址(1)] + [ACK] + [数据1] + [ACK] + ... + [数据N] + [NACK] + [STOP]
示例:从地址0x50的EEPROM读取1字节。
主设备发送:0xA1(0x50<<1 | 1)。
EEPROM回复ACK并返回数据。
主设备发送NACK(表示读取结束)。
主设备发送STOP。
[START] + [设备地址(0)] + [ACK] + [寄存器地址] + [ACK] + [重复START] + [设备地址(1)] + [ACK] + [数据] + [NACK] + [STOP]
典型应用:读取传感器寄存器(如先写寄存器地址,再读数据)。
地址错误:设备地址未左移1位(如0x50→0xA0)。
上拉电阻不合适:导致信号上升沿过慢(可尝试减小电阻值)。
总线冲突:多主设备未正确仲裁。
SCL/SDA短路:检查硬件连接。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。