logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare

pitlab 11 Sie 2019 01:27 1602 17
  • #1 18108534
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    Dłubię sobie projekt miernika-testera na STM32 z wyświetlaczem TFT 320x240. Do tej pory używałem wyświetlacza 2,5" ze sterownikiem ILI9341 i magistralą 8-bitową i działało to całkiem nieźle.
    Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare
    Ze względów mechanicznych potrzebuję wyświetlacza, który ma złącza tylko po jednej stronie i wybrałem odrobinę większy 2,8" dedykowany dla Raspberry Pi pracujący na SPI. Założenia były takie że taki popularny projekt jak RPI nie zniknie szybko z rynku a mając w swoim projekcie złącze w takim standardzie łatwo mi będzie w razie potrzeby przesiąść się na inny.
    Siedzę nad nim już 3 dzień i nie mogę nic wyświetlić. Bez problemów dogadałem się (też po SPI) z zamontowanym na płytce sterownikiem ekranu dotykowego ADS7846 a ze sterownikiem wyświetlacza nie mogę.
    Nigdzie nie jest napisane wprost jaki to ma sterownik ale w różnych bibliotekach np. UTFT czy Adafruit wyświetlacze 2.8" obsługiwane się przez ten sam ILI9341. Na stronach producenta jest sporo opisów jak to uruchomić pod RPi, ale sprowadza się to do wgrania skompilowanego image, natomiast nie udało mi się dokopać do kodu obsługi. Gdy przeglądam taki image to jest tam trochę tekstów i szukając np "320x240" obok wyskakuje mi "ILI9340". To wygląda na starszą wersję ILI9341, ale porównując polecenia i tryby pracy nie znalazłem różnic.
    Przebiegi oglądane na oscyloskopie są takie jak w dokumentacji sterownika. Polaryzacja i poziom zegara jest taka sama. Z prędkością nie przesadzam (fPCLK/32). Kod obsługi SPI jest banalny. Chodzi mi na tym ekran dotykowy i akcelerometr
    Sterownik obsługuje 4 rodzaje transmisji szeregowych po SPI: 2 z nich używają lini RS, pozostałe 2 dodatkowego, 9-ego bitu. Ponieważ wyświetlacz ma wyprowadzoną linie RS, więc zakładam że należy jej używać zamiast nieosiągalnych na STM32 transmisji 9-bitowch. Kolejny rodzaj transmisji to wykorzystanie osobnych linii do odczytu i zapisu lub jednej linii przełączanej. Ponieważ linia MOSI jest współdzielona ze sterownikiem ekranu dotykowego, który ma dedykowaną linię MISO a wyświetlacz jej nie ma więc zakładam że obsługa wyświetlacza jest w trybie write_only.
    Próbowałem danych inicjalizacyjnych z dwu różnych bibliotek ale wyświetlacz nie chce ruszyć. Może ktoś z Was już się tym bawił?

    Poniżej są moje procedury komunikacyjne w obu wersjach (SPI/8-bit). Na razie ręcznie piszę do SPI, docelowo gdy ruszy chcę wykorzystać DMA przynajmniej do transferów większej ilości danych:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 18108546
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    Twój problem to najprawdopodobniej linie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Powinno to wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a odczyt tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 18108938
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    excray napisał:
    Powinno to wyglądać tak:
    *(volatile uint8_t*)(&(SPI3->DR)) = data;


    Dziękuję za odpowiedź, ale to nie to. Tego typu deklaracje są już zrobione w plikach nagłówkowych. Na przykład
    #define SPI3 ((SPI_TypeDef *) SPI3_BASE)
    a fragmentem SPI_TypeDef jest
    __IO uint16_t DR;
    Jeżeli skrócimy operacje wskaźnikowe czyli * na początku z & przy "&(SPI3->DR)" to reszta się zgadza. Swoją drogą DR jest 16-bitowy, tylko teraz jest skonfigurowany do transmisji 8 bitowych, stąd różnice w naszych deklaracjach, ale to drobiazg.
    Zresztą gdyby deklaracja była problem to w ogóle nie działał by SPI a tutaj działa co najmniej z kontrolerem panela dotykowego i akcelerometrem.
    Problem jest najprawdopodobniej w niewłaściwym sposobie komunikacji z wyświetlaczem. Niestety nie daje się niczego z niego odczytać np rejestrów indentyfikacyjnych, z których coś można by wywnioskować, albo zapisać i odczytać pamięć, bo nie ma wyprowadzonej linii MISO, jest tylko MISO z kontrolera ekranu dotykowego.
    Pisałem też do producenta, ale odpisał mi w stylu: Jest zrobiony dla RPI i z nim działa więc o co chodzi...
  • #4 18108954
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    pitlab napisał:
    Swoją drogą DR jest 16-bitowy, tylko teraz jest skonfigurowany do transmisji 8 bitowych, stąd różnice w naszych deklaracjach, ale to drobiazg.
    To moze byc drobiazg albo i nie w zaleznosci od procesora. Te, których SPI mają FIFO rozpoznają jaką ilość informacji mają zapisać po szerokości operacji. Czyli jak zapiszesz 16 bitów to zapiszą 2 wartości 8 bitowe do FIFO. Jako że nie podałeś co to za uK to nie wiadomo czy to jest drobiazg, czy też nie.

    Dlatego w niektórych modelach trzeba wymusić na kompilatorze wygenerowanie odpowiedniej instrukcji zapisu/odczytu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wymusza 8 bitowy zapis a

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wymusza 8 bitowy odczyt
  • #5 18108975
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    osctest1 napisał:
    To moze byc drobiazg albo i nie w zaleznosci od procesora. Te, których SPI mają FIFO rozpoznają jaką ilość informacji mają zapisać po szerokości operacji. Czyli jak zapiszesz 16 bitów to zapiszą 2 wartości 8 bitowe do FIFO. Jako że nie podałeś co to za uK to nie wiadomo czy to jest drobiazg, czy też nie.

    Ale to było by widać na oscyloskopie że wychodzi nie tyle ile trzeba. Mam 4-kanałowy oscyloskop i widzę całą transmisję od razu na ekranie. Takie problemy są do identyfikacji i naprawy od ręki.
    Mikrokontroler to STM32F103VET6. Robiłem też kilka projektów na LPC1768 i do tej pory nigdy nie miałem problemów z układami na SPI.
  • #6 18109139
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    Nie zgaduj. Może tak być, że stosują różne kontrolery (co w łapę wpadnie) i dlatego nie ma tego w opisie. Driver RPi pewnie wykrywa z czym ma do czynienia i odpowiednio go steruje.,

    Weź sobie zobacz https://github.com/prenticedavid/MCUFRIEND_kbv

    Tam masz arduinową bibliotekę. Z niej wyłuskaj funkcję identyfikującą wyświetlacz. Włożył on trochę wysiłku w dodanie dużej ilości kontrolerów.

    Dokonaj identyfikacji kontrolera. Dopiero wtedy zacznij pisanie/kopiowanie drivera
  • #7 18109198
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    Zapisanie komendy + danych powinno odbywać się przy niezakłóconym niskim stanie CS, a u Ciebie CS zmienia stan.
  • #8 18109204
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    Dzięki z bibliotekę, nie znałem jej wcześniej. Problem w tym że nie można odpytać tego wyświetlacza bo nie ma wyprowadzonej linii wyjścia. Na stronie wyświetlacza jest rozpisane złącze: https://www.waveshare.com/2.8inch-RPi-LCD-A.htm. Jest wspólna linia SI dla wyświetlacza i panelu dotykowego (pin19) a wyjście SO jest tylko dla panelu dotykowego (pin 21).

    W innym dokumencie dotyczącym wymiarów wyświetlacza jest informacja że chipset to ILI9341: http://www.waveshare.com/w/upload/2/21/2.8inch-rpi-lcd-a-panel-dimension.pdf

    Dodano po 18 [minuty]:

    excray napisał:
    Zapisanie komendy + danych powinno odbywać się przy niezakłóconym niskim stanie CS, a u Ciebie CS zmienia stan.

    Tak, zmienia. Spróbuję nie zmieniać, ale w dokumentacji ILI9341 jest taki obrazek, z którego wynika że CS może być ustawiany pomiędzy poleceniem a danymi lub parametrem.
    Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare

    Przerobiłem sterowanie linią CS tak że jest na zewnątrz polecenia. Tak to wygląda na oscyloskopie. Przepraszam za słabą jakość zdjęcia, padło mi podświetlanie i doświetlam z boku. Na górze jest CLK, poniżej RS (L=polecenie, H=dane), poniżej MOSI, na dole CS.
    Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare
    Pierwsze polecenie jest 4-parametrowe, potem bezparametrowe, potem znów 4-parametrowe. Nie wiem co to dokładnie za polecenia, po prostu fragment rysowania ekranu. Tak więc wyrzucenie machania CS pomiędzy poleceniem i danymi nie pomogło. Ekran nadal jest biały.
  • #9 18109309
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    pitlab napisał:
    W innym dokumencie dotyczącym wymiarów wyświetlacza jest informacja że chipset to ILI9341:
    Akurat tym to bym się nie sugerował. To jest rysunek ekranu zrobiony przez jego producenta. Waveshare może już ich od lat nie używać.

    Ja mam 2 waveshare wyświetlacze 2.8 (co prawda nie do RPi). Obydwa są na HX8347D
  • #10 18109406
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    osctest1 napisał:
    Ja mam 2 waveshare wyświetlacze 2.8 (co prawda nie do RPi). Obydwa są na HX8347D

    Wziąłem z biblioteki UTFT procedurę inicjalizacyjną dla HX8347 oraz funkcję SetXY. Według biblioteki poszczególne wyświetlacze różnią się tylko tymi dwoma fragmentami kodu. Ten chipset ma funkcję podającą polecenie + 16-bitowe dane, najpierw starszą część, potem młodszą. Napisałem taką funkcję i odpaliłem to ale wyświetlacz też nie rusza.
    Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare
    Strasznie słabo widać ale na ekranie są 2 polecenia. Pierwsze o numerze 0x03 z parametrami 0x00 i 0x28, drugie polecenie 0x04 z parametrami 0x00 i 0x00.
    Na ekranie nic nie drgnęło.

    Zacząłem głębiej porównywać polecenia obu chipsetów (HX8347 i ILI9341) i okazuje się że znacznie więcej poleceń jest innych. Więc powyższa prosta próba nie ma szansy zadziałać.
  • Pomocny post
    #11 18109446
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    Na sucho myślę, że nic już nie pomogę. Proponuję kup sobie za 20 dolców klona sealae (proponuję ten nieco lepszy 100MHz) to przynajmniej będziesz mógł wieksze sekwencje dekodować.

    Timingi rozumiem, że są OK.
  • #12 18109465
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    Klona Saleale mam. Musiałbym kupić RPi abym miał z czego zdjąć timingi. W sumie to dobry pomysł.
  • #13 18109470
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    pitlab napisał:
    Musiałbym kupić RPi abym miał z czego zdjąć timingi.
    RPi to bardzo fajny komputerek :). Jak nie będzie potrzebnty można z niego zrobić np. przystawkę do telewizora :)
  • #14 18111648
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    Pożyczyłem od kolegi RPi i próbuję podsłuchać transmisję. Klon Saleale nie nadaje się do tego, bo dane do wyświetlacza idą taktowane zegarem 16MHz a analizator próbkuje max 24MHz więc "coś" widać ale nie są to dane bo jesteśmy grubo powyżej częstotliwości Nyquista. Zostało ręczne łapanie ramek pojawiających się po kilkunastu sekundach od włączenia.
    Po kolei pojawiają się grupy 8-bitowych słów, każda grupa rozdzielona CS. Łącznie jest ich 37:
    1) 0xEF
    2) 0xED
    3) 0x64, 0x03, 0x12, 0x81
    4) 0xE8
    5) 0x85, 0x00, 0x78
    6) 0xED
    7) 0x20
    8) 0xEA
    Na razie tyle bo już się gubię. Ewidentnie nie są to polecenia kontrolera ILI9341 ani też HX8347. Biorę się za analizę dokumentacji innych chipsetów. Zdam raport jeżeli coś znajdę.
  • #15 18111666
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #16 18111699
    osctest1
    Poziom 21  
    Posty: 451
    Pomógł: 36
    Ocena: 74
    pitlab napisał:
    16MHz a analizator próbkuje max 24MHz więc "coś" widać ale nie są to
    to zmniejsz prędkość SPI w RPI.
  • #17 18111780
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    osctest1 napisał:
    to zmniejsz prędkość ŚPI w RPI.

    Mam to pierwszy raz w rękach i nie mam bladego pojęcia jak to konfigurować. Nie mam kodu - sterownik jest dystrybuowany razem z obrazem gotowego systemu. Chyba że to da się ustawiać z poziomu interfejsu użytkownika?
    Uruchomiłem Raspberry Pi Configuration ale w małym wyświetlaczu widzę tylko kawałek okna. To jest Pi zero, więc ma złącze mini HDMI. Nie mam nawet takiego kabla aby podłączyć to do większego monitora. Jeżeli wiesz jak to ustawić to podpowiedz, może jakoś się uda ustawić.
  • #18 18112469
    pitlab
    Poziom 13  
    Posty: 84
    Pomógł: 3
    Ocena: 3
    Udało mi się zmniejszyć prędkość, dzięki oscitest za sugestię!
    Na karcie z image był plik config.txt a w nim dwie sąsiednie linijki
    dtoverlay=waveshare32b:rotate=270
    #dtoverlay=ads7846,cs=1,penirq=17,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=0,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900

    Pierwsza wyglądała na konfigurację wyświetlacza typu Waveshare32B a druga zakomentowana dotyczy sterownika panelu dotykowego siedzącego na tym samym SPI. Skoro dla sterownika panelu można ustawić prędkość to do linii z wyświetlaczem dodałem ",speed=4000000" i zadziałało. Teraz klon saleale łyknął dane i zgadzają się z tym co fragmentarycznie udało mi się zdekodować ręcznie na oscyloskopie. Wtedy część danych zgubiłem i nie miałem na podglądzie linii RS ale teraz wszystko jest już złapane w pliku https://pitlab.pl/misc/lcd/RPI_2.8_SPI_CE5_SCK3_MOSI0_RS2.zip
    Tak jak sugeruje nazwa pliku linia CE wyświetlacza jest na kanale 5, SCK na 3, MOSI na 0, RS jest na 2 a na 7 jest CS panela dotykowego. Plik jest w formacie saleale logic. Program do pobrania z sieci.
    Siadam do zakodowania tego i zobaczymy czy ruszy.

    Wieczorem wklepałem zdjęte dane do programu i ... ruszyło :-)
    Obsługa wyświetlacza 2.8inch RPi LCD (A), 320×240 z Waveshare
    Trzeba jeszcze poprawić kilka szczegółów bo obraz jest odwrócony i literki są pisane od tyłu, ale to już drobiazg.
    Okazuje się że to jednak jest ILI9341 albo co najwyżej coś z rodziny, tyle że kilka pierwszych poleceń konfiguracji nie jest opisanych w dokumentacji stad początkowa konsternacja.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik pracuje nad projektem miernika-testera na STM32 z wyświetlaczem TFT 320x240, przechodząc z mniejszego wyświetlacza 2,5" na 2,8" LCD od Waveshare, który działa na SPI. Napotyka problemy z wyświetlaniem danych, mimo że komunikacja z kontrolerem dotykowym ADS7846 działa poprawnie. Użytkownik podejrzewa, że problem leży w niewłaściwej komunikacji z wyświetlaczem, ponieważ nie można odczytać rejestrów identyfikacyjnych. W trakcie dyskusji pojawiają się sugestie dotyczące poprawy kodu, identyfikacji kontrolera oraz zmiany prędkości SPI. Użytkownik odkrywa, że wyświetlacz może być oparty na chipie ILI9341, ale napotyka różnice w poleceniach między ILI9341 a HX8347. Po dostosowaniu prędkości SPI, użytkownik uzyskuje dane, które zgadzają się z wcześniejszymi obserwacjami na oscyloskopie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA