Dla zapoznania się z wyświetlaczem wykonałem niewielką płytkę, która ułatwiła jego dołączenie do systemu testowego. Schemat ideowy tej płytki – modułu z wyświetlaczem – pokazano na rysunku 1. Zastosowano na niej miniaturowy wyświetlacz graficzny typu HMC6432-03 o rozdzielczości 64×32 piksele i przekątnej 0,49”. Wyświetlacz jest oferowany między innymi przez firmę Lummax pod oznaczeniem LCD-AG-064032V-VAIW W/KKK-E6 (poprzednie oznaczenie LCD-AG-V6432).
Element ten jest dość nietypowy. Na pierwszy rzut oka wyglądem zewnętrznym, budową, wymiarami oraz sposobem montażu przypomina popularny, miniaturowy wyświetlacz OLED o przekątnej ekranu 0,49”. Podobieństwo do wyświetlacza OLED dotyczy także wyświetlanego obrazu – standardowo są to białe punkty na czarnym tle. Tak naprawdę jest to jednak wyświetlacz LCD, z tłem podświetlanym białą diodą LED. Wyposażono go w kontroler firmy Sitronix typu ST7567A, który komunikuje się z otoczeniem przez interfejs I2C. Wejście zasilania i wszystkie sygnały sterujące wyświetlaczem HMC6432-03 są wyprowadzone na złącze krawędziowe, umieszczone na końcu giętkiej taśmy przeznaczonej do wlutowania w obwód drukowany. Opis sygnałów występujących na złączu wyświetlacza umieszczono w tabeli 1.
Układ aplikacyjny wyświetlacza HEM6432-03 jest nieskomplikowany. Do poprawnej pracy wyświetlacz wymaga jedynie dołączenia dwóch kondensatorów (na schemacie – C1 i C2) o pojemności od 100 nF do 1 mF, które są elementami konwerterów DC/DC wyświetlacza. Zalecane jest także filtrowanie zasilania wyświetlacza kondensatorem ceramicznym. W prezentowanym module użyto w tym celu połączonych równolegle kondensatorów o pojemności 100 nF i 10 mF (kondensatory C3 i C4).
Wyświetlacz HEM6432-03 może być zasilany napięciem z zakresu +2,4…3,3 V, natomiast dioda LED podświetlenia ekranu napięciem +3,0 V ±0,1 V. Przy takim napięciu pobór prądu przez diodę wynosi ok. 15 mA. Aby umożliwić pracę prezentowanego modułu wyświetlacza z jednego napięcia zasilania, w obwód diody LED włączono rezystor R2 ograniczający jej prąd w wypadku zasilania napięciem wyższym od +3,0 V. Podaną na schemacie wartość rezystancji R2 dobrano dla nominalnego napięcia zasilania prezentowanego modułu, które wynosi +3,3 V.
Linie SCL i SDA wyświetlacza są przeznaczone do bezpośredniego dołączenia do wyprowadzeń mikrokontrolera, dokładnie do sprzętowego lub realizowanego w sposób programowy interfejsu I2C. Linia RES może być natomiast sterowana przez jeden z portów I/O mikrokontrolera lub też przez zewnętrzny układ generowania sygnału zerowania, jeżeli taki jest dostępny. W celu uproszczenia sposobu połączenia modułu wyświetlacza z zestawami ewaluacyjnymi mikrokontrolerów wszystkie trzy linie sygnałowe zaopatrzono w rezystory pull-up i przyłączono do napięcia zasilania modułu. Dla celów testowych wyświetlacz zamontowano na jednostronnej płytce drukowanej wykonanej metodą termotransferu. Wygląd tej płytki w widoku od spodu pokazano na fotografii 2, a w widoku od góry na fotografii 3.
Format transmisji
Podstawowym problemem przy implementacji we własnym projekcie wyświetlacza HEM6432-03 jest brak dostępności pełnej dokumentacji technicznej tego elementu. W Internecie można znaleźć jedynie fragmentaryczne dane tego wyświetlacza. Niestety, nie jest też dostępna dokumentacja kontrolera ST7567A. Co prawda można znaleźć karty katalogowe starszej wersji tego układu, tj. ST7567, jednak kontroler LCD w tej wersji nie obsługuje interfejsu I2C, który został użyty w wyświetlaczu HEM6432-03. Na szczęście analiza kart katalogowych innych sterowników monochromatycznych wyświetlaczy LCD produkowanych przez firmę Sintronix pokazuje, że producent ten we wszystkich swoich układach implementuje w interfejsie I2C ten sam protokół komunikacji. Pokazano go na rysunku 4.
Wyświetlacz HEM6432-03 jest skonfigurowany do pracy na szynie I2C w funkcji układu slave o adresie 0x7E. Maksymalna, dopuszczalna częstotliwość zegara szyny I2C jest równa 400 kHz. W trybie obsługi interfejsu i2c sterownik ST7567A obsługuje tylko zapis komend i danych. Nie ma możliwości odczytu żadnej informacji ze sterownika przez interfejs I2C. Format komunikacji mikrokontrolera ze sterownikiem LCD różni się od typowej wymiany danych po szynie I2C, która polega zazwyczaj na zapisie/odczycie szeregu rejestrów układu slave. W wypadku sterownika ST7567A po przesłaniu adresu układu transmitowane są słowa komend. Każde z nich składa się z dwóch bajtów: bajtu kontrolnego i bajtu danych. Najstarszy bit w bajcie kontrolnym (oznaczony C0) informuje, czy po bajcie danych będzie przesyłany bajt kontrolny kolejnego słowa komendy, czy też kolejny bajt danych. Szósty bit bajtu kontrolnego (oznaczony A0) określa natomiast, czy bajt danych zawiera komendę, czy też dane obrazu. Po bajcie kontrolnym z wyzerowanym bitem kontynuacji C0 mogą być przesyłane tylko bajty danych, interpretowane przez sterownik albo komendy, jeśli bit A0 w ostatnim bajcie kontrolnym był zerem, albo dane obrazu, jeśli bit A0 był jedynką. Zmiana typu danych wymaga w tym przypadku wygenerowania na szynie I2C sekwencji STOP, tj. zakończenia aktualnej transmisji i rozpoczęcia nowej.
Jak widać, ten format komunikacji odbiega od najczęściej spotykanego sposobu polegającego na zapisie rejestrów układu slave. Ponieważ do takiego właśnie formatu wymiany danych są zazwyczaj przystosowane biblioteki obsługi interfejsu I2C w mikrokontrolerach, najwygodniej jest potraktować bajt kontrolny jako adres rejestru i przyjąć, że sterownik ST7567A ma dwa rejestry I2C o adresach 0x00 i 0x40. Adresy te odpowiadają bajtom kontrolnym z wyzerowanym bitem kontynuacji C0 i wyzerowanym oraz ustawionym bitem A0. Dane zapisywane do pierwszego rejestru (tj. rejestru o adresie 0x00) będą interpretowane przez kontroler ST7567A jako komendy, natomiast dane zapisywane do drugiego rejestru (tj. rejestru o adresie 0x40) będą interpretowane jako dane obrazu. Takie podejście powoduje jednak, że w ramach jednej transmisji I2C będą mogły być przesyłane do kontrolera LCD tylko komendy lub tylko dane obrazu. Przesłanie komendy i danych obrazu tym sposobem będzie wymagało dwóch transferów. Taka metoda transmisji jest jednak i tak szybsza, ponieważ w przeciwnym wypadku konieczne byłoby poprzedzanie każdej komendy/danej obrazu bajtem kontrolnym, co zwiększyłoby prawie dwukrotnie liczbę transmitowanych danych.
Przykładowe funkcje zapisu do wyświetlacza HEM6432-03 komend i danych obrazu zaprezentowano na listingu 1. Obie wysyłają dane do wyświetlacza nie bezpośrednio, lecz za pomocą funkcji niższego poziomu i2c_WriteData(), która dokonuje zapisu bloku danych do układu slave przyłączonego do szyny I2C. Parametry transmisji przekazywane do tej funkcji są opisane w strukturze lcdI2C, której kolejne pola zawierają: adres na magistrali I2C zapisywanego układu (pole lcdI2C.device_addr), adres rejestru, do którego jest wykonywany zapis (pole lcdI2C.data_addr), liczbę zapisywanych bajtów danych (pole lcdI2C.data_size) oraz adres bufora z danymi do zapisu (pole lcdI2C.pdata).
Jak wspomniano, za pośrednictwem interfejsu I2C nie jest możliwy odczyt danych ze sterownika ST7567A. Wyświetlacz HEM6432-03 nie obsługuje więc wszystkich komend kontrolera ST7567A, a tylko te związane z operacjami zapisu. Ich listę zawiera tabela 2.
Inicjalizacja wyświetlacza
Obsługa wyświetlacza HEM6432-03 nie różni się od programowania innych wyświetlaczy z wbudowanym układem kontrolera. Pierwszym krokiem jest zawsze skonfigurowanie modułu do pracy. Konfiguracja wyświetlacza HEM6432-03 rozpoczyna się od wygenerowania impulsu reset na linii RES#. Minimalny czas trwania impulsu reset jest równy 1 ms, aczkolwiek w opisie aplikacji kontrolera ST7567 firma Sintronix zaleca minimalny czas trwania impulsu reset równy 5 ms. Reset wyświetlacza następuje maksymalnie po czasie 2 ms od narastającego zbocza impulsu resetu, chociaż i w tym miejscu producent w opisie aplikacji kontrolera zaleca oczekiwanie przez minimum 5 ms przed podjęciem kolejnego kroku inicjalizacji wyświetlacza. Warto wspomnieć, że na tym etapie konfiguracji wyświetlacza sprzętowy reset nie może zostać zastąpiony komendą Reset, ponieważ programowy reset układu nie inicjalizuje wszystkich obwodów kontrolera ST7567A. Dokładny wykaz różnic pomiędzy tymi dwoma rodzajami resetu kontrolera można znaleźć w dokumentacji układu ST7567.
W kolejnym kroku konfiguracji wyświetlacza do kontrolera są wysyłane komendy inicjalizujące poszczególne obwody. Ponieważ nieznane są ustawienia generatorów napięć dla wyświetlacza HEM6432-03, dobrano je doświadczalnie pod kątem uzyskania obrazu o jak najlepszej jakości. Zależnie od docelowego położenia modułu wyświetlacza w urządzeniu, wyświetlacz może być skonfigurowany do pracy w orientacji z taśmą przyłączeniową u dołu ekranu (fotografia 5) bądź też u góry ekranu (fotografia 6). Orientację ekranu wybiera się za pomocą komendy SEG Direction ustalającej kierunek skanowania ekranu oraz COM Direction ustalającej kierunek skanowania elektrod COM.
Zestaw komend konfigurujących wyświetlacz dla obu orientacji ekranu (tj. normalnej i odwróconej) oraz kod funkcji inicjalizującej lcdHEM_Init() przedstawiono na listingu 2. Kod ten jest przeznaczony dla mikrokontrolera STM32F107 i był testowany za pomocą zestawu uruchomieniowego STM32 Butterfly. Warto zauważyć, że funkcja lcdHEM_Init() inicjalizująca wyświetlacz wykorzystuje do odmierzania opóźnień w trakcie generowania impulsu resetu funkcję niższego poziomu dwt_Delay(). Funkcja ta zapewnia odmierzanie skalibrowanych opóźnień w oparciu o odczyt stanu licznika zliczającego takty zegara jednostki centralnej. Licznik ten znajduje się w module DWT (tj. Data Watchpoint and Trace), który jest standardowo implementowany w rdzeniach Cortex-M3/M4/M7 jako jeden z układów wspomagających debugowanie programu i monitorowanie pracy mikrokontrolera.
Pamięć obrazu
Kontroler ST7567A jest w stanie obsługiwać wyświetlacz LCD o maksymalnej rozdzielczości 132×65 pikseli. W tym celu jest on wyposażony w pamięć DDRAM liczącą 8580 bitów, której każdy bit odpowiada jednemu pikselowi. Pamięć ta jest zorganizowana w postaci 9 stron po 132 bajty. Każda strona pamięci odpowiada 8 kolejnym liniom obrazu i 132 kolumnom, natomiast każdy bajt na stronie odpowiada 8 kolejnym pikselom w kolumnie obrazu, przy czym najmłodszy bit odpowiada pikselowi w linii o najniższym numerze. Wyjątkiem jest ostatnia strona pamięci (tj. strona o adresie 8), na której zaimplementowano w słowach pamięci tylko najmłodszy bit b0. Podstawowym przeznaczeniem tej strony pamięci jest sterowanie wyświetlaniem ikon.
Rozdzielczość ekranu wyświetlacza HEM6432-03 jest znacznie mniejsza niż pamięć kontrolera ST7567A. W związku z tym tylko część pamięci DDRAM kontrolera ST7567A jest używana w opisywanym wyświetlaczu. Schemat przypisania poszczególnych pikseli wyświetlacza HEM6432-03 do komórek pamięci DDRAM kontrolera LCD przedstawiono na rysunku 7. Ponieważ używane w wyświetlaczu HEM6432-03 sterowniki kolumn kontrolera ST7567A są rozłożone niesymetrycznie, przypisanie komórek pamięci DDRAM do poszczególnych pikseli jest różne dla orientacji normalnej i odwróconej ekranu wyświetlacza. Pozostałe, niemapowane komórki pamięci DDRAM w kontrolerze ST7576A są niestety nie do użytku. Mogą one, co prawda, być zapisywane, ale ponieważ tryb obsługi interfejsu I2C w układzie ST7567A nie daje możliwości odczytu danych, nie można użyć tych komórek np. w roli dodatkowego bufora obrazu.
Zapis danych do pamięci DDRAM wyświetlacza HEM6432-03 rozpoczyna się od ustawienia adresu strony pamięci komendą Set Page Address oraz adresu kolumny komendami Set column address (MSN) i Set column address (LSN). Proponowaną funkcję realizującą tę operację przedstawiono na linstingu 3. Następnie do pamięci mogą być zapisywane dane obrazu. Po zapisie każdego bajtu danych adres kolumny jest automatycznie inkrementowany, aż do osiągnięcia końca przestrzeni adresowej na danej stronie pamięci (tj. wartości 131), po czym licznik adresujący kolumny zatrzymuje się. Adres strony pamięci nie jest automatycznie inkrementowany. Zmiana adresu strony pamięci wymaga wysłania do wyświetlacza komendy Set Page Address oraz ustawienia licznika adresującego kolumny na początku strony komendami Set column address (MSN) i Set column address (LSN).
Jak można zauważyć, organizacja pamięci kontrolera ST7567A jest przystosowana do wyświetlania tekstów. Każda strona pamięci obrazu zawiera jeden wiersz tekstu wyświetlanego standardową czcionką o rozmiarze 5×7 pikseli. Wyświetlenie znaku sprowadza się tutaj do skopiowania do pamięci DDRAM wyświetlacza kształtu znaku ze zdefiniowanej w programie tablicy znaków. Proponowaną funkcję realizującą tę operację przedstawiono na listingu 4. Jak łatwo policzyć, wyświetlacz HEM6432-03 może zobrazować na ekranie 4 linie tekstu liczące po 10 znaków o wymiarach 5×7 pikseli.
Zaimplementowany w kontrolerze ST7567A sposób organizacji pamięci obrazu w połączeniu z brakiem możliwości odczytu danych z tej pamięci przez interfejs I2C powodują, że tworzenie grafiki bezpośrednio na ekranie wyświetlacza HEM6432-03 jest w zasadzie niemożliwe. Najprościej jest w tym celu używać lokalnego bufora obrazu, na którym przeprowadzane są wszystkie operacje graficzne, a którego zawartość jest następnie przepisywana do pamięci DDRAM wyświetlacza. Ewentualnie można poprzestać na ładowaniu do pamięci wyświetlacza predefiniowanych grafik, przechowywanych w programie w postaci tablic.
Dysponując przedstawionymi powyżej informacjami, można bez większego trudu napisać bardziej zaawansowane funkcje wyświetlające na wyświetlaczu HEM6432-03 teksty czy też predefiniowane grafiki. Dołączony do artykułu kod demonstracyjnego programu zawiera w module lcdHEM6432.c kompletną bibliotekę obsługi omawianego wyświetlacza, wspierającą również oferowane przez ten wyświetlacz sprzętowe tryby obsługi obrazu, np. inwersję (fotografia 8).
Aleksander Borysiuk
alex_priv@wp.pl
Bibliografia:
1. HEM6432-03 LCD Display, Karta katalogowa układu
2. ST7567. 65×132 Dot Matrix LCD Controller/Driver, Karta katalogowa układu, Sitronix
Tabela 1. Rozmieszczenie wyprowadzeń wyświetlacza HEM6432-03 i ich funkcje |
||
Numer wyprowadzenia |
Sygnał |
Opis |
1 |
C2P (XVO) |
Konwerter DC/DC |
2 |
C2N (VO) |
Konwerter DC/DC |
3 |
C1P (VG) |
Konwerter DC/DC |
4 |
C1N (VSS) |
Konwerter DC/DC |
5 |
A |
Anoda diody LED podświetlenia ekranu |
6 |
NC |
Styk nieużywany |
7 |
VSS (K) |
Masa / Katoda diody LED podświetlenia ekranu |
8 |
VDD |
Napięcie zasilania z zakresu +2,4…3,3 V |
9 |
RES# |
Reset (wejście, aktywny poziom niski) |
10 |
SCL |
Linia zegara interfejsu I2C (wejście) |
11 |
SDA |
Linia danych interfejsu I2C (typu OD) |
12 |
NC |
Styk nieużywany |
13 |
NC |
Styk nieużywany |
14 |
NC |
Styk nieużywany |