【Maker 電子學】小型 OLED 顯示裝置的原理與應用—PART4

作者: Bird

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

屬蜈蚣的晶片

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

(圖片來源:Bird 提供)

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

(圖片來源: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 接在一起。

VSSVLSSBGGND:這些都是 gound

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

C1PC1NC2PC2N: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 正在讀取的區域,以避免顯示上出現新舊畫面的斷差。但很可惜的是,大部分的模組供應商都沒有把這個訊號拉出來。

CLCLS:這是 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 接腳)
  • I2C(以下寫作 I2C)

(圖片來源: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。

(圖片來源:Bird 提供)

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

(圖片來源: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 中還是控制器中。

(圖片來源:Bird 提供)

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

(圖片來源: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 叫做 SDAIN、D2 叫做 SDAOUT,將這兩隻腳接在一起,才會是完整功能的 SDA 訊號。這種做法,我們在【Maker電子學】I2C 界面解密 — PART 5 時脈擴展有介紹過,就是用兩隻 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:

(圖片來源:Bird 提供)

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

(圖片來源: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 的位址指標就會自動加一。

以 128×32 的 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 驅動 128×32 的面板時,在 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 幾種不同的模組設計,以及直接使用模組時,要如何設計電路。

(責任編輯:賴佩萱)

Bird

Author: Bird

在外商圈電子業中闖蕩多年,經歷過 NXP、Sony、Crossmatch 等企業,從事無線通訊、影像系統、手機、液晶面板、半導體、生物辨識等不同領域產品開發。熱愛學習新事物,協助新創團隊解決技術問題。台大農機系、台科大電子所畢業,熱愛賞鳥、演奏管風琴、大提琴、法國號,亦是不折不扣的熱血 maker。

Share This Post On

發表

跳至工具列