2、OLED驱动芯片选型:SSD1306与SH1106的差异、I2C与SPI接口对比
做OLED驱动,选芯片是第一关。市面上最常见的两款驱动IC就是SSD1306和SH1106。很多新手上来就问:“哪个更好?”其实没有绝对的好坏,关键看你的项目需求。我这些年两种芯片都用过不少,踩过坑也绕过弯,今天就把它们的区别和接口选择一次性说清楚。
2.1 SSD1306 vs SH1106:核心差异
先看一张对比表,心里有个底:
| 对比项 | SSD1306 | SH1106 |
|---|---|---|
| 内部RAM大小 | 128×64 = 1024字节 | 132×64 = 1056字节 |
| 页模式 | 8页(每页8像素高) | 8页(每页8像素高) |
| 列地址范围 | 0~127 | 0~131(多出4列) |
| 初始化命令 | 标准SSD1306序列 | 略有不同,需注意 |
| 兼容性 | 最广泛,库最多 | 部分库需修改 |
| 价格 | 略高 | 略低 |
说白了,SSD1306是行业标准,几乎所有开源库都优先支持它。SH1106则是个“经济版”,内部RAM多了4列,但实际显示区域还是128×64。这多出来的4列是干嘛用的?嗯,主要是为了兼容某些LCD的边界处理,对OLED来说基本用不上。
SET_DISPLAY_OFFSET和SET_START_LINE的时序要求不一样。千万别偷懒,一定要看对应芯片的数据手册。
2.2 接口对比:I2C vs SPI
选完芯片,还得选通信接口。SSD1306和SH1106都支持I2C和SPI,但实际用起来差别很大。我个人的习惯是:引脚紧张用I2C,追求速度用SPI。
2.2.1 I2C接口
I2C只需要两根线:SDA和SCL。加上VCC和GND,总共4根线就能驱动OLED。对于引脚少的MCU(比如ESP8266、STM32F0系列),这简直是救命稻草。
但I2C有个硬伤——速度慢。标准模式100kHz,快速模式400kHz。你想想看,刷新一帧128×64的图像,需要传输1024字节的数据。在400kHz下,光传输时间就要20多毫秒。如果还要显示动画,帧率基本就卡在30fps以下了。
2.2.2 SPI接口
SPI就快多了。四线制(SCLK、MOSI、DC、CS)加上RST,总共6根线。速度轻松跑到10MHz以上,刷一帧数据只需要1毫秒左右。做动态显示、波形绘制,SPI是首选。
不过SPI也有坑。我记得有一次调试,屏幕死活不亮,逻辑分析仪一看,CS引脚电平一直在跳。原来是GPIO初始化时忘了把CS拉高,导致片选信号混乱。这种低级错误,排查起来最费时间。
2.3 接口选择决策树
为了让你更直观地做选择,我画了一张决策流程图:
2.4 实际项目中的选型建议
根据我这几年的经验,给你几个具体建议:
- 电池供电设备:选SSD1306 + I2C。功耗低,待机电流只有几微安。我做过一个温湿度计,两节AAA电池撑了半年。
- 需要动画/波形显示:选SSD1306 + SPI。刷新率能到60fps以上,做示波器、频谱显示完全够用。
- 成本敏感项目:选SH1106 + SPI。价格便宜几毛钱,量大的时候能省不少。但要注意驱动库的适配。
- 多屏拼接:选SSD1306 + I2C。通过配置不同地址,一条总线上挂4个屏都没问题。
2.5 接口引脚定义速查
最后给一张引脚对照表,方便你画原理图时参考:
| 引脚名称 | I2C模式 | SPI模式 | 说明 |
|---|---|---|---|
| VCC | 3.3V / 5V | 3.3V / 5V | 供电电压,注意OLED屏的耐压 |
| GND | GND | GND | 共地 |
| SCL / SCLK | 时钟线 | 时钟线 | I2C和SPI共用,但时序不同 |
| SDA / MOSI | 数据线 | 主机输出从机输入 | I2C双向,SPI单向 |
| DC | 不接 | 数据/命令选择 | SPI专用,高电平=数据,低电平=命令 |
| CS | 不接 | 片选 | SPI专用,低电平有效 |
| RST | 可选 | 可选 | 硬件复位,建议都接上 |