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状态,则使用重复起始条件切换为读方向,最后发送停止条件结束传输。
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。主设备应重试或插入适当延时,而非立即报错。
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或并行接口。