1. OLED驱动芯片概述:SSD1306/SSH1106等常见驱动芯片介绍,I2C接口引脚定义与硬件连接

做嵌入式显示,尤其是小尺寸OLED屏,绕不开两颗芯片:SSD1306和SSH1106。我最早接触OLED驱动是在一个便携式传感器项目上,当时选了0.96寸的屏,主控是SSD1306。说实话,第一次点亮像素的那一刻,还是挺有成就感的。

这两颗芯片虽然功能相似,但细节上差别不小。咱们先看看它们的基本情况。

1.1 常见驱动芯片对比

参数 SSD1306 SSH1106
最大分辨率 128×64 132×64
内部显存 128×64 bit (1KB) 132×64 bit (约1.1KB)
支持接口 I2C, SPI, 6800/8080并行 I2C, SPI, 6800/8080并行
I2C地址 0x3C 或 0x3D 0x3C 或 0x3D
灰度支持 仅单色(1bit/pixel) 仅单色(1bit/pixel)
常见封装 COG (Chip On Glass) COG

你可能会问:既然都是单色,为什么还要区分?嗯,这里有个关键点——SSH1106的列地址范围是0~131,比SSD1306多了4列。我在一个项目中用过SSH1106的屏,结果按SSD1306的驱动代码去初始化,右侧总有一列显示异常。排查了半天才发现是列地址没对齐。

核心结论:SSD1306是市场主流,资料多、生态好。SSH1106兼容性稍差,但某些大厂(比如某款医疗设备)偏爱用它。选型时优先看屏厂提供的驱动芯片型号,别只看分辨率。

1.2 I2C接口引脚定义

I2C接口的OLED模块,通常引出4个引脚。我见过不少初学者把VCC和GND接反,一通电屏就冒烟……所以接线前一定确认好丝印。

引脚名称 功能 典型电平
VCC 电源正极 3.3V / 5V
GND 电源地 0V
SCL I2C时钟线 3.3V (上拉)
SDA I2C数据线 3.3V (上拉)

注意:大部分0.96寸OLED模块的I2C接口是3.3V逻辑电平。如果你用5V单片机,建议加电平转换,或者确认模块是否支持5V耐受。我曾经直接接5V,结果SDA引脚烧了,换模块才解决。

1.3 硬件连接实战

以STM32F103C8T6为例,I2C1的引脚是PB6(SCL)和PB7(SDA)。连接方式很简单:

// 硬件连接示意
// STM32 PB6  --> OLED SCL
// STM32 PB7  --> OLED SDA
// STM32 3.3V --> OLED VCC
// STM32 GND  --> OLED GND
// 注意:SCL和SDA需要外接4.7kΩ上拉电阻到3.3V

有些模块内部已经集成了上拉电阻,但我不建议依赖这个。我的习惯是:不管模块有没有,外部都加两个4.7kΩ电阻。这样I2C总线更稳定,尤其是线缆较长时。

小技巧:如果你用Arduino,SCL连A5,SDA连A4。但注意Arduino Uno是5V逻辑,需要确认OLED模块是否兼容。我一般用逻辑分析仪先抓一下波形,确认电平没问题再上电。

1.4 I2C地址配置

SSD1306的I2C地址由SA0引脚决定:

  • SA0接GND:地址0x3C(7位地址)
  • SA0接VCC:地址0x3D(7位地址)

大多数模块默认SA0接地,所以地址是0x3C。但我也遇到过一些模块把SA0拉高,地址变成0x3D。如果你发现I2C扫描不到设备,不妨试试另一个地址。

// I2C地址扫描示例(伪代码)
for (addr = 0x01; addr < 0x7F; addr++) {
    if (I2C_Start(addr) == SUCCESS) {
        printf("Found device at 0x%02X\n", addr);
    }
}

跑这个扫描程序,如果返回0x3C或0x3D,基本就是OLED了。如果啥都没有,先检查接线和上拉电阻。

1.5 知识体系结构图

下面这张图帮你理清本章的核心脉络:

OLED驱动芯片I2C通信知识体系 OLED驱动芯片 常见驱动芯片 I2C接口 硬件连接 SSD1306 SSH1106 SCL时钟线 SDA数据线 VCC/GND 上拉电阻 I2C地址:0x3C / 0x3D 选型时优先确认驱动芯片型号,I2C地址默认0x3C,接线注意上拉电阻

1.6 避坑指南

最后分享几个我踩过的坑:

  • 地址冲突:如果总线上挂了多个I2C设备,确保地址不重复。OLED的0x3C有时会和某些传感器冲突。
  • 上拉电阻值:4.7kΩ是通用值。如果总线长度超过20cm,建议换成2.2kΩ。我试过10kΩ,结果通信不稳定,偶尔丢数据。
  • 初始化顺序:先给VCC供电,再初始化I2C。反过来可能导致OLED内部状态机异常。
  • 电平匹配:3.3V的OLED接到5V单片机,SDA和SCL必须加电平转换。最简单的办法是用两个MOS管做双向电平转换。

我的习惯:每次焊接完OLED模块,先用万用表量一下VCC和GND之间有没有短路。然后再上电,用逻辑分析仪看I2C波形。确认地址和时序都对,再开始写驱动代码。这一步能省下大量调试时间。