---
title: 小型 OLED 顯示裝置的原理與應用—PART4
description: "**作者： Bird** 上一篇文章【Maker 電子學】小型 OLED 顯示裝…"
url: "https://makerpro.cc/docs/principle-and-application-about-oled-part4/"
updated: "2025-05-09"
category: OLED
---

# 小型 OLED 顯示裝置的原理與應用—PART4

**作者： Bird**

上一篇文章【Maker 電子學】小型 OLED 顯示裝置的原理與應用—PART4，我們從 SSD1306 的 datasheet 出發，聊了它所使用的封裝技術、與 OLED 面板的連接方式，以及 passive matrix OLED 的驅動原理。這一回我們要繼續根據 SSD1306 datasheet 中揭露的資料，來說明一下它的各種通訊介面以及通訊協定。

### **屬蜈蚣的晶片**

上次我們提過，像 SSD1306 這種跟顯示裝置有關的 IC，為了要驅動為數眾多的顯示陣列訊號，接腳數量都很多，而且跟一般的小型 IC 比起來數量都多得很誇張。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545644906.jpg)

（圖片來源：Bird 提供）

這張圖是 SSD1306 datasheet 中的「die pad floor plan」，它告訴你在 SSD1306 的裸晶（die）上，哪些地方有可供連接訊號的連接點（pad），以及它們的形狀、大小。中間有幾個長得像十字、圓圈的 pad，則是給自動封裝機器的電腦視覺定位用的，讓封裝機可以利用這些已知形狀的 pad 作為參考點，把晶片黏到玻璃或軟板上的正確位置。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545668519.jpg)

（圖片來源：Bird 提供）

至於這張表，則是 SSD1306 晶片上面所有 pad 的編號、訊號名稱及座標等資訊。我們可以看到，編號 3-17 及 90 之後的接腳名稱都是 COM 或 SEG 開頭的，密密麻麻一直到 273 號接腳，這些就是連接 OLED 顯示陣列的訊號，也是佔據顯示驅動 IC 接腳最多的訊號。

而編號 18-89 這一段的訊號，則是 SSD1306 運作時，需要對外連接的介面，或是需要連接額外零件的訊號，這些才是我們設計系統時感興趣的訊號。下面我們簡單說明一下這些訊號。

### 對外連接的訊號

**VDD**：這是 SSD1306 的數位電路電源，它可以接受的範圍是 1.65V-3.3V。I/O 的邏輯準位是跟著這個電源走的，而因為這個電源可以低到 1.65 V，因此 SSD1306 可以很簡單地直接給 1.8V 的 VDD，直接跟 1.8 V 邏輯的介面相連。

**VCC**：這是用來驅動 OLED 的電源。這組電源需要的電壓比較高，根據 datasheet 上的要求是 7V-15V。不過在一般的數位系統中，7 V 的電壓並不容易直接取得，因此 SSD1306 提供了一個很貼心的功能：它裡面有一個 charge pump 電路，搭配外接的兩顆小電容器，就可以從 3.3 V 升壓產生 7.5 V 的 VCC。至於 VCC 要用 charge pump 產生還是由外部供給，則是由軟體在初始化 SSD1306 時設定。

**VBAT**：這是 charge pump 的電源輸入。如果要使用 charge pump 產生 VCC，這隻腳要供應最少 3.3 V 的電源，才能讓 charge pump 產生正確的 VCC；如果不使用 charge pump 的話，這隻腳要跟 VDD 接在一起。

**VSS**、**VLSS**、**BGGND**：這些都是 gound

**VCOMH**：這個訊號全名叫做「Common Deselected Voltage Level」，它是驅動 OLED 陣列 COM 訊號在不作用時的電壓。我們上次說明 OLED 陣列時，有說過要讓 OLED 亮起來，對應的 SEG 要被驅動為 high，而 COM 則要拉到 low，而當 COM 沒有被選到時，就會被維持在這個電壓，以確保那一行的 OLED 不會被點亮。它預設的電壓是 VCC 的 0.77 倍，也可以用軟體設得更高或更低。

**C1P**、**C1N**、**C2P**、**C2N**：VCC charge pump 所使用的外部電容器接腳。大部分的模組廠商都會把這兩隻腳拉出來，讓你連接電容器以使用 charge pump 這個貼心的功能；也有一些廠商會更貼心地把這兩隻腳拉到 FFC 上，並在 FFC 上直接安裝電容器。原廠建議的 charge pump 電容是 0.1 uF。

**IREF**：這隻腳上要連接一個電阻到地，用來設定驅動 OLED 顯示矩陣的電流。這隻腳上的電流會是 OLED 驅動電流的 ⅛，而一般這個尺寸的 OLED 矩陣需要 100 uA 左右的驅動電流，因此我們要讓這隻腳的電流是 100 uA / 8 = 12.5 uA。

這隻腳上的電壓會是 VCC-2.5V，因此如果我們使用內部的 charge pump 產生 7.5 V 的 VCC，要讓它有 12.5 uA 電流的電阻就會是：R = V / I =（7.5 - 2.5） /（12.5 *10^-6）= 400K（Ω）

由於 E24 series 中沒有 400 KΩ 這樣的數值，一般會用 390 KΩ。

**FR**：這是 SSD1306 讀取內部 buffer 並更新 OLED 顯示矩陣時的同步訊號輸出。當我們在做某些要高速更新顯示器的應用時（比如說要顯示動畫），這個訊號可以告訴我們 SSD1306 什麼時候開始更新顯示器的第一行，而 MCU 這邊就可以根據這個訊號的週期，在寫入 buffer 時避開 SSD1306 正在讀取的區域，以避免顯示上出現新舊畫面的斷差。但很可惜的是，大部分的模組供應商都沒有把這個訊號拉出來。

**CL**、**CLS**：這是 SSD1306 的 clock 來源選擇及外部 clock 輸入接腳。當 CLS 是 high 時，SSD1306 會使用內部的 clock source；當它是 low 時，就會使用來自 CL 接腳的 clock。在大部分的應用中，OLED 顯示並不會需要非常精確的 timing，因此內部的 370KHz 振盪器就可以讓 SSD1306 工作得很好，絕少需要用到外部的 clock。

**RES**：這是 SSD1306 的 reset 接腳。SSD1306 並沒有內建的 power-on reset 電路，因此在供電之後一定要用這隻腳執行一次 reset，讓晶片內部的暫存器能有正確的初始值。這隻腳是 low active，至少需要 3 us 的 low period 才能正確觸發 reset。在一般的情況下，用一個 RC reset 電路就可以正確地在每次供電後 reset 成功。

**BS0-BS2**：這三隻腳是用來選擇 SSD1306 的對外通訊介面種類。SSD1306 支援五種通訊介面：

- 8080 形式的 8-bit 並列通訊介面
- 6800 形式的 8-bit 並列通訊介面
- 3 線式的 SPI（不使用 D/C 接腳）
- 4 線式的 SPI（使用 D/C 接腳）
- I^2C（以下寫作 I2C）

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545691575.jpg)

（圖片來源：Bird 提供）

我們後面會再詳述這些介面的使用方法。

**CS**：這是 SSD1306 通訊介面的 chip select 訊號。除了 I2C 以外都會用到。

**D/C**：Data/command 選擇接腳。不管用哪種介面，對 SSD1306 的通訊都會分成寫到控制器中的 command，以及寫到顯示 buffer 裡的 data。這塊顯示的 buffer 叫做 GDDRAM（graphic display data RAM），它裡面的每一個 bit 就對應到 OLED 面板上的一個點，一個蘿蔔一個坑。至於些到控制器的 command，則是像設定 clock 頻率、設定顯示方向、設定顯示對比等操作。比較特別的是，SSD1306 的控制指令並沒有「暫存器」的觀念，它的很多設定是一個指令接著一連串的設定值連續寫入，這跟一般用 I2C 或 SPI 控制的典型 IC 略有不同。

E（RD）、R/W（WR）：這兩隻腳在 8-bit 並列介面的 8080 模式與 6800 模式中有不同的用法，但都是用來觸發指令或資料的讀寫。

D0-D7：在 8-bit 並列模式中，這 8 隻腳就是資料接腳。而在 I2C 或 SPI 模式中， 則會用到部分的接腳。

### **8080 與 6800 通訊模式**

這兩種模式都是並列式的通訊，它一次要使用 8 隻接腳來傳送 8-bit 的資料。而之所以會有兩種不同的模式，是因為在 1970 年代微處理器開始發展時，當時的微處理器分成兩大陣營：以 Motorola 為首的 6800 陣營，以及以 Intel 為首的 8080 陣營。

當時的微處理器 bus 都是非同步的，也就是說這這些 bus 都沒有一個統一的 clock 訊號來決定資料取樣的有效時間，因此不管是讀還是寫，都需要一個觸發機制。

6800 陣營的作法是這樣：用一隻叫做 R/W 的接腳來決定現在是讀還是寫，再用另一隻叫 E（enable）的接腳來觸發傳輸。因此 R/W 接腳是狀態接腳，而 E 則是觸發接腳，它的下降緣會觸發資料的傳輸。Motorola 推出的許多微處理器如 6803、6809 等，都是使用這樣的 bus 協定；甚至連衍生自 6800 的一些微處理器如早期 Apple II 電腦及任天堂紅白機所使用的 6502，也都用這樣的 bus。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545705211.jpg)

（圖片來源：Bird 提供）

而 Intel 陣營的作法則是讓讀取和寫入都有各自的觸發訊號。RD 是讀取的觸發訊號，WR 是寫入的觸發訊號，這兩個訊號的上升緣各自會觸發讀取和寫入，當然這兩個訊號絕對不能同時出現上升緣。Intel 系列的處理器包含後來的微控制器如 8048、8051 的外部 bus，都是遵循這樣的

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545718749.jpg)

（圖片來源：Bird 提供）

實務上這兩種並列式的通訊模式已經很少使用到，因為它們需要使用大量的接腳：至少需要 8 隻資料接腳加上 4 隻控制訊號，總共 12 隻接腳。市面上也很少看到有 SSD1306 的模組將這些訊號都拉出來。

### **SPI 通訊模式**

SPI 是很適合顯示裝置的通訊協定，它需要的接腳數量不多，速度又相對快，可以快速更新顯示內容。SSD1306 支援兩種 SPI 通訊模式：3 線式和 4 線式。不過這裡的 3 線和 4 線的定義，和一般在討論 SPI 的 3 線、4 線略有不同。

我們知道完整的 SPI 介面需要 4 個訊號：MOSI、MISO、SCLK、SS，而在某些狀況下如果只有一個 slave 裝置，用來選擇 slave 的 SS 訊號就可以省略，變成只有 MISO、MISO、SCLK 的 3 線式 SPI，是為單一裝置的 3 線式 SPI。在另一種比較少見的設計中，MISO 和 MOSI 可以合併為一根半雙工的 SISO，根據通訊的狀態機來切換方向，是為半雙工的 3 線式 SPI。

不過 SSD1306 的 3 線 或 4 線式 SPI 並不是用上面那種方法區分的。先說一件事：SSD1306 的 SPI 介面只能寫入。不管是寫到 GDDRAM 的資料還是寫到控制器裡的指令，都只能寫，因此它用不到 MISO 接腳。

SSD1306 的 4 線式 SPI 使用 D0 當 SCLK、D1 當作 MOSI（datasheet 上叫做 SDIN），另外加上 D/C 腳用以選擇 data/command，以及 CS 腳用來告訴 SSD1306 要通訊了。每一個傳輸週期傳送 8 個 bit，根據 D/C 接腳的狀態決定這 8 個 bit 是要寫到 GDDRAM 中還是控制器中。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545734722.jpg)

（圖片來源：Bird 提供）

而 SSD1306 的 3 線式 SPI 則是省略了 D/C 接腳，改將 D/C 的狀態放在 SPI 傳輸週期的第 9 個 bit，因此 SSD1306 的 3 線式 SPI 每個傳輸週期需要 9 個 clock。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545758844.jpg)

（圖片來源：Bird 提供）

### **I2C 通訊模式**

如果你嫌 3 線式 的 SPI 模式所需要的接腳還是太多，還可以選擇只需要 2 隻腳的 I2C 通訊模式，但代價就是速度。I2C 模式的速度比 SPI 慢非常多。SSD1306 的 SPI clock 最快可以跑道 10 MHz，但 I2C 只能到 400KHz，而且因為通訊協定設計的關係，I2C 模式下的 protocol overhead 比較多，也就是它傳輸中會有一些無效、沒有用的欄位。

在 I2C 模式下，D0 是擔任 clock 角色的 SCL 訊號，而 SDA 訊後則需要用 D1 和 D2 兩隻腳來達成。根據 SSD1306 的 datasheet，D1 叫做 SDA~IN、D2 叫做 SDA~OUT，將這兩隻腳接在一起，才會是完整功能的 SDA 訊號。這種做法，我們在[【Maker電子學】I2C 界面解密 — PART 5 時脈擴展](https://makerpro.cc/2020/07/i2c-interface-part5-clock-stretching/)有介紹過，就是用兩隻 GPIO 接腳合成一隻功能完整、可同時輸入輸出的 SDA 訊號。

SSD1306 的 7-bit I2C slave address 是 0b0111100 或 0b0111101，由 D/C 接腳的狀態選擇，因此在用一個 I2C bus 上最多可以掛兩顆 SSD1306。

I2C 因為有「定址」的觀念，通訊起來要比 SPI 複雜一些。SSD1306 的 I2C 協定是這樣的：一樣先從 START condition 和 slave address、R/W bit 開始，接下來的第一個 byte 叫做 control byte：

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545771481.jpg)

（圖片來源：Bird 提供）

它裡面有兩個有用的 bit：D/C 和 Co。D/C 顧名思義就是跟 D/C 訊號的意思一樣，用來設定接下來的傳輸是寫到 GDDRAM 裡的 data，還是寫到控制器裡的 command。

 ![](https://makerpro.cc/wp-content/uploads/2020/10/1603545788134.jpg)

（圖片來源：Bird 提供）

Co 這個 bit 很有趣，它叫做 Continuation bit，如果 Co=1，在下一個要傳輸的資料 byte 傳完後，又會回到 control byte，也就是會遵照 control byte、data byte、control byte、data byte 這樣的模式進行傳輸。如果 Co=0，代表接下來的傳輸都是 data byte，不會再有 control byte，也就是會用 control byte、data byte、data byte… 這樣的順序傳輸，直到 STOP condition 來到，結束這一回合的傳輸為止。聰明的讀者可能猜得到，Co=0 的模式就是用來快速大量寫入 GDDRAM 的。沒錯，當 Co=0 且 D/C = 0 時，持續送來的 data bytes 就會寫到 SSD1306 的 GDDRAM 中，而且每次寫入後 GDDRAM 的位址指標就會自動加一。

以 128x32 的 OLED 面板來說，GDDRAM 總共有（128/8）* 32 = 512 bytes，加上 control byte 和前面的 slave address 總共需要 514 bytes 的 I2C 傳輸。因為 I2C 傳輸每一個 byte 都會有 ACK，所以需要 9 個 clock，514 bytes 總共要 514 * 9 = 4626 個 clock，若以 SSD1306 能接受的最高 I2C 頻率 400 KHz 來計算，傳送 4626 個 clock 總共需要：4626 / 400,000 = 0.011565（s）

也就是差不多 11.6 ms 左右的時間，這就是 SSD1306 驅動 128x32 的面板時，在 I2C 模式下更新畫面所能達到的最快速度。

但如果用 SPI 的 4 線式模式來更新 512 bytes 的顯示資料時，由於 SPI 沒有 slave address 和 control byte，而且在 4 線式模式之下每一個傳輸只要 8 個 clock，所以總共只需要 512 * 8 = 4096 個 clock，若以 SSD1306 可以接受的最高 SPI 頻率 10 MHz 來計算，傳送 4096 個 clock 只需要

4096 / 10,000,000 = 0.0004096（s）

也就是差不多 0.4ms 左右的時間。很明顯地，用 SPI 介面來與 SSD1306 通通訊，相較於 I2C 來說有 20 倍以上的速度優勢。

當然，如果你的應用並不需要快速、大量的更新畫面時，並不一定需要這樣的速度優勢。

### **小結**

這次我們說明了 SSD1306 連接外部的各訊號規格、它的五種通訊介面，以及在 SPI 及I2C 介面下速度的差距。下一回我們要繼續看看 SSD1306 幾種不同的模組設計，以及直接使用模組時，要如何設計電路。

（責任編輯：賴佩萱）
