3. I2C协议基础:两线制工作原理与信号时序

I2C(Inter-Integrated Circuit)总线由Philips公司(现NXP)在1980年代推出,是一种同步、多主从、两线制的串行通信协议。它仅需两根信号线——SCL(串行时钟线)和SDA(串行数据线),即可驱动多个从设备,在小尺寸LCD驱动场景中极为常见(如SSD1306 OLED、PCF8574 I/O扩展等)。

3.1 两线制物理层与电气特性

I2C总线的物理层设计遵循“线与”逻辑:所有设备的SCL和SDA引脚均为开漏输出,通过外部上拉电阻(典型值4.7kΩ)接至VCC(通常为3.3V或5V)。

信号线 功能 电气特性
SCL 串行时钟,由主设备产生 开漏输出 + 上拉电阻;高电平为总线空闲
SDA 串行数据,双向传输 开漏输出 + 上拉电阻;数据在SCL低电平时变化
上拉电阻 保证总线空闲时为高电平 标准模式:4.7kΩ;高速模式:1.0kΩ
关键概念:开漏结构允许多个设备共用总线,任何设备拉低SDA或SCL时,整条线即被拉低。这就是“线与”仲裁的基础。

3.2 起始条件(START Condition)与停止条件(STOP Condition)

I2C总线的每次传输都以起始条件开始,以停止条件结束。这两个条件是唯一允许SDA在SCL高电平时发生变化的时刻,用于标记数据帧的边界。

  • 起始条件(S):SCL为高电平时,SDA从高电平跳变为低电平。
  • 停止条件(P):SCL为高电平时,SDA从低电平跳变为高电平。
  • 重复起始条件(Sr):在未产生停止条件前,主设备再次发起起始条件,用于改变传输方向或切换从设备。
驱动LCD时的典型用法:主MCU先发送起始条件,然后发送7位从地址+写位,写入命令或数据;若需读取LCD状态,则使用重复起始条件切换为读方向,最后发送停止条件结束传输。
I2C起始条件与停止条件时序图 I2C 起始条件(S)与停止条件(P)时序 SCL SDA t1 t2 t3 t4 t5 起始条件(S) SDA↓ 且 SCL=H 停止条件(P) SDA↑ 且 SCL=H 数据在SCL低电平时变化

3.3 数据帧格式与字节传输

在起始条件之后,主设备逐字节发送数据。每个字节为8位,传输顺序为MSB优先(最高位在前)。每发送完一个字节,从设备必须回复一个应答位(ACK)。

  • 数据有效性:SCL高电平时,SDA必须保持稳定;SCL低电平时,SDA允许变化。
  • 字节格式:8位数据 + 1位应答(共9个SCL时钟周期)。
  • 传输方向:主设备发送数据时,SDA由主设备驱动;主设备接收数据时,SDA由从设备驱动。

3.4 应答机制(ACK/NACK)

应答机制是I2C协议可靠性的核心。每传输完一个字节(第9个SCL时钟),接收方必须拉低SDA表示应答(ACK),或保持高电平表示非应答(NACK)。

应答类型 SDA电平(第9时钟) 含义 典型场景
ACK 低电平 接收成功,可以继续发送下一字节 从设备地址匹配、数据写入成功
NACK 高电平 接收失败或传输结束 从设备忙、地址未匹配、读操作最后一字节
驱动LCD常见陷阱:LCD控制器在内部处理命令时可能处于忙状态(如刷屏期间),此时会回复NACK。主设备应重试或插入适当延时,而非立即报错。
I2C完整数据帧结构 I2C 完整数据帧结构(主设备写入LCD) S 7位从设备地址 R/W ACK 8位数据(命令/数据) ACK P 起始 A6 A5 A4 A3 A2 A1 A0 0=写 从应答 D7 D6 D5 D4 D3 D2 D1 D0 从应答 停止 每个字节(地址或数据)后必须跟一个应答位,由接收方拉低SDA表示ACK LCD驱动中,写命令/数据时主设备发送,从设备应答;读状态时方向相反 SCL时钟: 1-7 8 9 10-17 18 19 共19个SCL时钟周期完成一次完整传输(起始 + 7位地址 + 读写 + ACK + 8位数据 + ACK + 停止)

3.5 从设备地址与读写位

I2C总线上的每个从设备都有一个唯一的7位地址(部分设备支持10位地址,但LCD驱动中极少使用)。主设备在起始条件后发送的第一个字节即为地址字节:

  • 高7位:从设备地址(如SSD1306 OLED的典型地址为0x3C或0x3D)。
  • 最低位(R/W):0表示写操作,1表示读操作。
  • 地址冲突:多个同型号LCD挂接同一总线时,需通过地址引脚(如SA0)配置不同地址。
LCD驱动实例:SSD1306 OLED的7位地址为0x3C(SA0=GND)或0x3D(SA0=VCC)。写操作时发送0x78(0x3C << 1 | 0),读操作时发送0x79(0x3C << 1 | 1)。

3.6 多主设备仲裁与时钟同步

虽然小尺寸LCD驱动通常为单主设备场景,但了解仲裁机制有助于理解I2C的健壮性:

  • 仲裁:当多个主设备同时尝试控制总线时,通过SDA的“线与”特性进行仲裁——输出高电平但检测到低电平的设备自动退出。
  • 时钟同步:多个主设备的SCL信号通过线与实现同步,慢速设备可拉长低电平时间以适配自身速度。
  • LCD驱动影响:单主设备场景下无需考虑仲裁,但需注意从设备(LCD控制器)的SCL时钟速率上限(通常400kHz或1MHz)。

3.7 I2C与SPI对比(LCD驱动视角)

特性 I2C SPI
信号线数量 2(SCL + SDA) 3~4(SCLK + MOSI + MISO + CS)
从设备选择 通过地址字节(软件寻址) 通过片选引脚(硬件寻址)
传输速率 标准100kHz / 快速400kHz / 高速3.4MHz 通常数MHz~数十MHz
应答机制 强制ACK/NACK,可靠性高 无硬件应答,需软件校验
引脚占用 少(仅2个GPIO) 多(至少3个GPIO,每设备多1个CS)
LCD适用场景 小尺寸、低分辨率、引脚受限 大尺寸、高刷新率、高速传输
选型建议:对于128×64像素的OLED或小尺寸字符LCD,I2C完全满足带宽需求且节省引脚;对于320×240以上的TFT彩屏,建议使用SPI或并行接口。