起源
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
寄存器)。