logo_elektromys.eu

/ Alfanumerické OLED displeje |

Obr.1 - ilustrační obrázek (vlastní fotku se mi nepodařilo udělat v obstojné kvalitě)

Motivace

OLED displeje asi nemá smysl představovat, všichni je určitě odněkud znáte. Existují různé varianty od malých grafických displejů s plochou kolem dvou centimetrů čtverečních až po obří televize. Jednou z odnoží jsou alfanumerické OLED displeje. Zajímat by vás mohli třeba z několika níže uvedených důvodů:

Osobně mi jako největší přínos přišlo sériové rozhraní, které zjednodušuje připojení v různých "bastl" aplikacích. Rád bych vás tedy seznámil s postupem jak modul upravit na sériové rozhraní a stručně i s komunikačním protokolem. Pro ty z vás, kteří budou mít odvahu použít můj amatérský kód je pak na konci připraven ovladač k displeji.

Varianty

Displeje, kterých se tento text týká jsou vybaveny driverem RS0010 nebo WS0010 (též jako OLED-0010). Lze je sehnat v TME například pod názvy REC000802*, REC001602*, REC002002*, REC004002*, DEP08*, DEP16* a pod. V GME jsou k sehnání dokonce i levnější s podobným označením WEH00*. Jejich cena se pohybuje od 200kč za 8x2 ke 350kč za 16x2. Úpravu rozhraní na SPI jsem testoval na variantě 0802 a 1202. S velkou pravděpodobností bude fungovat pro všechny dvouřádkové varianty. Nejsem si jist jestli lze upravit i čtyřřádkové displeje, neboť ty jsou vybaveny dvojicí driverů. Displeje se vyrábí ve 3V a 5V variantách. Můj kus REC001202AYPP5N (tedy 5V varianta) se rozbíhala na přibližně 1.8V. Domnívám se že 5V varianty jsou univerzální, schopné pracovat v 5V i 3V systémech. Smysl 3V variant mi trochu uniká - snad možná mají nižší spotřebu.

Úprava displeje 0802

Jumper označený L_CS_H spojuje ve výchozí konfiguraci CS pin s GND. Naše aplikace bude chtít s CS manipulovat a proto je jumper nutné odstranit a nechat rozpojený. Jumper označený H_PS_L (Parallel/Serial) je z výroby propojen s VCC a volí tak variantu paralelního rozhraní. My ho musíme přepájet do polohy "L", čímž vybereme sériové rozhraní. Z datasheetu k RS0010 lze dohledat že SCL (Clock) je DB5, SDI alias (MOSI) je DB7 a SDO (MISO) je DB6. Identifikace CS si vyžádala trochu "propípávání" a našel jsem jej na pinu 15 (viz obrázek). Zajímavé je, že jsem nikdy nenarazil na jediný datasheet k displeji, který by funkci jumperů a pinout pro sériové rozhraní jakkoli dokumentoval.

Obr.2 - Displej před úpravou (tedy v konfiguraci pro paralelní rozhraní kompatibilní s HD44780)
Obr.3 - Displej po úpravě na sériové rozhraní

Úprava displeje 1202

Obdobně lze upravit displej "1202". Pojmenování jumperu pro CS se drobně liší (CSH/CSL), ale je srozumitelné. Pinout se sériovým rozhraním je následující:

Pin displeje1212131415
SPIGNDVCCSCLSDOSDICS

Obr.3 - Displej po úpravě na sériové rozhraní, odpájený CS jumper (CSH/CSL nahoře) a jumper H_PS_L (vlevo) v poloze pro SPI.

Úprava displeje 1602

Oproti předchozím displejům je nutné CS pin jumperem JCS propojit na pin 16. Pokud je to potřeba, lze jumperem J15 propojit RST na pin 15.
Obr.4 - Displej po úpravě na sériové rozhraní, odpájený CS jumper (CSH/CSL nahoře) a jumper H_PS_L (vlevo) v poloze pro SPI, Jumper JCS propojuje CS na pin 16, kdo by potřeboval lze jumperem J15 propojit RST na pin 15.

Komunikační protokol

Nechci v této problematice zabředávat příliš hluboko, takže se pokusím stručně vyjádřit jen to nejnutnější. S displejem se komunikuje pomocí SPI. Driver čte data na vzestupnou hranu clocku, můžeme tedy použít SPI MODE0 a MODE3. Komunikace začíná sestupnou hranou CS a končí vzestupnou hranou. Jako první se posílá MSB. Formát zprávy je trochu "divný", ale v datasheetech je zakreslen správně a srozumitelně. Ze začátku komunikace se vždy posílají dva bity (RS a RW) a za nimi pak následuje jeden nebo více bytů dat. Takový formát není možné realizovat pomocí 8bit paketů a to částečně znemožňuje použití HW SPI na některých MCU. Je tedy na místě sáhnout po ručním ovládání GPIO, což sebou nese úskalí dodržení časových limitů komunikace (zvláště na rychlejších MCU). Význam prvních dvou bitů je následující:

Několik vzorových zpráv vypadá následovně:

významformát zprávypoznámka
PříkazRS(0) + RW(0) + 1Byte(příkaz)celkem 10bit
1 Byte datRS(1) + RW(0) + 1Byte(data)celkem 10bit
n Byte datRS(1) + RW(0) + 1Byte(data1) + 1Byte(data2) + ... 1Byte(data n)celkem 2+n*8 bit
Čtení stavuRS(0) + RW(1) + 1Byte(dummy) + 1Byte(odpověď)celkem 18bit, MSB v odpovědi je busy bit, zbylá část je aktuální adresa kurzoru
Čtení pamětiRS(1) + RW(1) + 1Byte(dummy) + 1Byte(odpověď)celkem 18bit, nezkoušel jsem

Knihovna

Skládá se ze dvou dvojic souborů ws0010 a oled_v1. První z nich obsahuje fyzickou vrstvu komunikace, druhý obsahuje funkce pro ovládání displeje. Testoval jsem ji na STM32L0 (32MHz). Na pomalejších MCU je možné vyřadit funkci ws_delay(). Naopak na rychlejších MCU je potřeba delay prodloužit tak aby splňoval časové parametry komunikace (zapsané v záhlaví souboru). Portování knihovny na jiné architektury by mělo být snadné, neboť nevyužívá krom GPIO žádné HW prostředky. Komunikaci je možné libovolně přerušovat v kterékoli fázi.

archiv ke stažení: oled_v1.zip

Obr.4 - foto z testů

Poznámky

| Odkazy a zdroje /

Home
| V1.00 5.1.2020 (aktualizováno 23.4.2021) /
| By Michal Dudka (m.dudka@seznam.cz) /