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ů:
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.
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.
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 displeje | 1 | 2 | 12 | 13 | 14 | 15 |
SPI | GND | VCC | SCL | SDO | SDI | CS |
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í:
význam | formát zprávy | poznámka |
Příkaz | RS(0) + RW(0) + 1Byte(příkaz) | celkem 10bit |
1 Byte dat | RS(1) + RW(0) + 1Byte(data) | celkem 10bit |
n Byte dat | RS(1) + RW(0) + 1Byte(data1) + 1Byte(data2) + ... 1Byte(data n) | celkem 2+n*8 bit |
Čtení stavu | RS(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ěti | RS(1) + RW(1) + 1Byte(dummy) + 1Byte(odpověď) | celkem 18bit, nezkoušel jsem |
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
Home
| V1.00 5.1.2020 (aktualizováno 23.4.2021) /
| By Michal Dudka (m.dudka@seznam.cz) /