起源
I²C(Inter-Integrated Circuit)是一种广泛用于短距离通信的串行总线,常用于嵌入式系统、传感器与微控制器之间的数据传输。
I²C总线由飞利浦(现为NXP)在1982年发明,旨在提供一种简单的双线通信方式,以便于微控制器与外设(如EEPROM、ADC、传感器、LCD驱动器等)之间进行低速数据传输。由于其硬件连接简单、协议易于实现,被广泛应用于嵌入式系统、消费电子、工业控制等领域。
信号传输模式
I²C采用主-从(Master-Slave)架构,并基于半双工的串行通信方式。其主要特性如下:
双线设计:
SCL(Serial Clock Line):时钟信号,由主设备(Master)控制。
SDA(Serial Data Line):数据线,双向传输,使用开漏驱动+上拉电阻。
数据传输方式:
起始信号(START,S):当SDA在SCL为高电平时,从高电平变为低电平,表示通信开始。
地址传输:主设备发送7位或10位从设备地址,随后跟一个读/写(R/W)位。
应答(ACK/NACK):从设备在接收到地址或数据后,会返回一个ACK(低电平)表示成功接收,或NACK(高电平)表示未响应或数据结束。
数据传输:数据按字节(8-bit)传输,最高位(MSB)优先,每传输一个字节后需要一个ACK信号。
停止信号(STOP,P):当SDA在SCL为高电平时,从低电平变为高电平,表示通信结束。
速率模式:
标准模式(Standard Mode, 100 kHz)
快速模式(Fast Mode, 400 kHz)
高速模式(High-Speed Mode, 3.4 MHz)
超高速模式(Ultra-Fast Mode, 5 MHz)
电气参数
电压范围:典型的I²C设备工作在3.3V或5V,但低功耗设备可能支持1.8V或更低电压。
上拉电阻:
SDA和SCL线需要上拉电阻(典型值4.7kΩ~10kΩ,但取值依赖于总线电容和速率)。
高速模式可能需要更小的上拉电阻(1kΩ~2kΩ)来确保信号边沿上升足够快。
最大电容:
I²C总线的最大允许负载电容一般为400 pF,超出可能导致信号失真。
应用设计
I²C 设备连接
单主多从(最常见):多个从设备共享SDA和SCL,由主设备控制。
多主多从:多个主设备可协同工作,但需要仲裁机制避免冲突。
I²C在嵌入式系统中的应用
传感器读取:如温度传感器(如BMP280)、加速度计(如MPU6050)。
EEPROM存储:如AT24C系列I²C EEPROM。
显示设备:如OLED/LCD驱动(如SSD1306)。
GPIO扩展:如PCF8574(8-bit I/O扩展器)。
音频编解码:如WM8960等音频芯片。
问题排查方式
(1)总线冲突
多个设备同时尝试发送数据,可能导致信号异常。可以检查是否正确设置了主/从设备模式。
(2)信号干扰
SDA/SCL线上噪声干扰:可能是上拉电阻过大导致信号上升时间过长,可适当降低电阻值。
长线传输衰减:I²C适用于短距离(一般**<1米**),长距离可考虑I²C中继器(如PCA9615)。
(3)设备地址冲突
确保不同I²C设备地址不同,某些芯片支持更改地址(如通过引脚或软件指令)。
使用
i2cdetect
工具扫描设备地址。
(4)时序问题
低速模式可尝试降低I²C速率,确保设备能够正确应答。
检查MCU I²C时钟源配置是否正确(如STM32的
I2C_TIMINGR
寄存器)。
评论区