Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F4-discovery] - Obsługa wyświetlacza LCD

28 Gru 2013 21:02 11631 34
  • Poziom 30  
    Witam,

    Posiadam płytkę STM32F429I-DISCO:
    http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF259090

    Próbuję uruchomić wyświetlacz LCD ale za nic nie mogę tego dokonać.
    Nie korzystam z bibliotek ST, więc ustawiam bezpośrednio rejestry.

    W dokumentacji płytki:
    http://www.st.com/st-web-ui/static/active/jp/...technical/document/user_manual/DM00093903.pdf
    Można zauważyć że wyświetlacz jest skonfigurowany przy pomocy rezystorów do pracy w trybie 4-wire oraz że piny SDA oraz SCL są podpięte do pinów z SPI5 mikrokontrolera.

    Ta tej podstawie napisałem funkcję inicjalizującą wyświetlacz oraz konfigurację portów i SPI w main.c:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    kod dla LCD:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Komunikacja po SPI działa, sterowanie CS oraz DCX także, a mimo to wyświetlacz nie reaguje.

    Jak widać mikokontroler pracuje na wewnętrznym zegarze 8MHz.

    Próbowałem opierać się na bibliotekach dostarczonych przez ST do tego wyświetlacza (wyłuskiwać informacje) ale wydaje się że powinno być dobrze.

    Dokumentacje:
    wyświetlacz: https://my.st.com/public/STe2ecommunities/mcu...-T_%E8%A7%84%E6%A0%BC%E4%B9%A6_IC-ILI9341.pdf
    mikrokontroler: http://www.st.com/web/en/resource/technical/document/datasheet/DM00071990.pdf
    rejestry: http://www.st.com/web/en/resource/technical/d...ical/document/reference_manual/DM00031020.pdf
  • Poziom 38  
    Dziw nad dziwami, skąd pomysł o SPI?
    Ta płytka ma demonstrować sterowanie LCD z wbudowanego w STM drivera.
    O czym mówi adnotacja pod tabelka w dokumentacji LCD str 4.
  • Poziom 30  
    Piny IMx są ustawione w konfiguracji 0110 co w tabelki wynika że jest to transmisja szeregowa 4 przewodowa.
    Więc jak by na to nie patrzeć, SPI pod to podchodzi, owszem jest możliwość użycia sprzętowej, ale chyba po przestawieniu tych zworek?

    Dokumentacja sterownika wyświetlacza:
    http://www.newhavendisplay.com/app_notes/ILI9341.pdf
    na stronie 38 wyraźnie pokazuje iż używane w tym przypadku są tylko 4 linie, chyba że coś przeoczyłem jednak?
  • Poziom 38  
    A wskazałem ci gdzie czarno na białym piszą w przypadku sterowania RGB bezpośrednio ustawić te bity na transmisje szeregowa.

    Dalej nie analizowałem.

    Oznacza to ze ustawia się wyświetlacz przez SPI a wyświetla obraz przez RGB.
    Czy można tylko przez SPI, zapewne można choć.....

    Jak coś porównaj schemat z zestawem dla 103 tym dużym tak użyto tego wyświetlacza w trybie SPI.
  • Poziom 30  
    W czasie inicjalizacji jest wybierany rodzaj interfejsu i faktycznie jest to RGB.
    Ale samo kontrolowanie wyświetlacza odbywa się przez SPI i przez niego można bezpośrednio do GRAM wpisywać dane.

    Ale wszystkie wyświetlacze TFT z jakimi się spotkałem po poprawnej inicjalizacji wyświetlały szum (losowa wartość pamięci GRAM) po czym można było się przekonać że wszystko jest ok, tutaj tego za nic nie mogę uzyskać.

    Próbowałem coś wyświetlić także przez wpisanie do GRAM, ale nic nie widać.

    Szukam tej płytki od 103, ale nic takiego nie mogę znaleźć, widzę tylko z wyświetlaczem segmentowym.

    Dodano po 44 [minuty]:

    Coś ruszyło, jeszcze kod inicjalizacji jest do poprawy ale mogę wyświetlać.

    Problemem była zbyt wolna transmisja, po wyrzuceniu dzielnika wyświetlacz zaczął reagować.
  • Poziom 30  
    Na prośbę jednego z użytkowiników, wrzucam bibliotekę do obsługi tego wyświetlacza przez SPI:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    ADI-mistrzu napisał:
    Problemem była zbyt wolna transmisja, po wyrzuceniu dzielnika wyświetlacz zaczął reagować.


    Czy zbyt wolna transmisja może powodować całkowity brak komunikacji? Też miałem podobny problem, przy szybkiej transmisji wszystko było ok, po zwolnieniu - brak komunikacji. Okazało się że niezbyt optymalnie skonfigurowane miałem SPI - sygnał CD (Command/Data) zmieniał się jeszcze w trakcie wysyłania bajtu, przy maksymalnej prędkości SPI sygnał ten był wolniejszy i pojawiał się już po wysłaniu bajtu. Po korekcie ustawień SPI wyświetlacz działa przy każdej prędkości SPI.
  • Poziom 30  
    Tak, zauważyłem że zbyt wolna transmisja jest ignorowana przez wewnętrzny sterownik wyświetlacza.
  • Poziom 27  
    Problemem może być to samo co u mnie - zbyt wczesna zmiana sygnału CS lub DCX, jeszcze w trakcie wysyłania bajtu. Zmień w pętlach while w WriteData i WriteCommand z czekania na bit SPI_SR_TXE na SPI_SR_BSY. Problemem może być to, że bit TXE zmienia się po opróżnieniu bufora, ale transmisja z wyjściowego rejestru przesuwnego jeszcze trwa. Ja to wykryłem analizatorem stanów logicznych. U mnie po użyciu bitu BSY wyświetlacz działa przy dowolnej prędkości SPI. Sama prędkość transmisji (poniżej max) nie powinna mieć wpływu na jej prawidłowy odbiór. Pamiętaj że musisz czekać na BSY=0, nie jak w przypadku TXE na 1 (usunąć ! ).
  • Poziom 30  
    Też racja, można by było też TXE na TC (Transmit Complite) zamienić w flagach i powinno być dobrze.

    W praktyce i tak się korzysta z najwyższej prędkości, ale dla wiedzy na przyszłość informacja przydatna.
  • Poziom 30  
    Byłem pewien że jest, ale jak spojrzałem to musiałem z USART'em pomylić (bo w nim jest).
    W sumie niema sensu aby był taki bit, ponieważ by działał w sumie identycznie jak BSY bo komunikację w obydwu kierunkach inicjuje tylko procesor.
    W USART może być sytuacja że nadchodzi jakaś informacja z zewnątrz a bufor wyjściowy jest wolny do którego już można pisać dane, dlatego jest flaga TC.
  • Użytkownik usunął konto  
  • Poziom 30  
    Postaram się dziś podesłać demonstacyjne źródła dla tej płytki z obsługą wyświetlacza po SPI, ale od razu informuję że ja nie korzystam z bibliotek od ST więc wszystkie operacje wykonywane są na rejestrach.
  • Poziom 30  
    Dokumentacja twierdzi że tak, że jest tam ILI9341.
    Powyższy mój kod od LCD to sterownik tego wyświetlacza po SPI, trzeba tylko zainicjować peryferia i można sterować.
  • Poziom 12  
    dziechu napisał:
    ADI-mistrzu napisał:
    ja nie korzystam z bibliotek od ST więc wszystkie operacje wykonywane są na rejestrach

    I badzo dobrze.
    Na jakim sterowniku jest ten wyświetlacz? ILI9341?


    Bardzo mnie bawią takie teksty, tak te liby może nie są wskazane w przerwaniach, ale np. po 5 miesiącach nie zaglądania w projekt i pisania na inną platformę nawet z obszernymi komentarzami trzeba poświęcić trochę czasu, na rozszyfrowanie inicjalizacji a już nie wspomnę o porcie na inną serie bo rejestry są niby te same ale tak naprawdę inne. Tak że proszę o to aby obeznani w temacie nie zniechęcali innych, bo procek mocarny a sprawa rozchodzi się o 10k na inicjalizacje.
  • Poziom 27  
    Mnie te tzw. liby ;) do niczego nie są potrzebne. Przez lata pisałem w asm bez żadnych wspomagań i dawałem radę. A czasem wracałem do jakiegoś projektu i po kilku latach. Obszerne komentarze są 10x pomocniejsze niż stosowanie bibliotek (moim zdaniem). Często dane peryferium jest używane w konfiguracji domyślnej procesora i wtedy wystarczy 2 - 3 linijki kodu żeby je uruchomić, a z bibliotekami zawsze jest to chyba z 20 linijek. Bez bibliotek kod jest krótszy, bardziej zwarty i dla mnie bardziej czytelny. Ale to być może kwestia przyzwyczajenia. Zaczynałem zabawę z STM32 używając biblioteki i co chwilę miałem jakieś błędy, albo coś nie działało - pomoc tutejsza okazywała się nieodzowna, ale była też niechętna, bo większość tutejszych specjalistów nie toleruje SPL. Kiedy przestałem korzystać z bibliotek, problemy (przynajmniej tego typu) się skończyły. Poza tym kod który napiszę jest moim kodem, a nie jakimś wymieszanym z innymi, nie moimi kodami.
  • Poziom 30  
    W załączniku przykładowy program przekompilowany oraz poniżej kod.

    main.c:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    lcd.h:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    font.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Efektem jest skacząca kostka.
    Zaś efektem wgrania hex'a z załącznika jest uruchomienie prostego silnika graficznego po SPI.
  • Poziom 8  
    Szukałem pomocy w sprawie konfiguracji dokładnie tego samego wyświetlacza na tej samej płytce STM32F4-Disco. Jednak próbowałem to robić poprzez bibliotekę STemWIN.
    Programuje w środowisku Eclipse i po wielu próbach udało mi się ja odpalić.
    Jednak wyświetlacz nie reaguje. Podepnę się pod ten temat i zapytam:
    Czy ktoś próbował obsługiwać ten wyświetlacz poprzez STemWIN ?
    Chodzi mi głównie o ustawienie funkcji konfigurujących wyświetlacz do pracy.

    Fajnie że biblioteka kolegi chodzi (chociaż nie sprawdzałem) jednak STemWIN jest również darmowa i posiada dużo możliwości.
  • Poziom 20  
    Sporo osób ma problemy więc proszę. Lista plików które trzeba umieścić w czystym przykładzie stm32f4_blink_led aby wyświetlacz ożył. (na płytce STM32f429disco)

    (UWAGA DZIAŁA BEZ SPLa)

    W pakiecie:
    -zaktualizowane pliki nagłówkowe od st.
    -zmodyfikowane pliki inicjalizacyjne SDRAM na bazie projektu ze strony en.radzio.dxp.pl (działają na bibliotekach GPIO od freddiego)
    -Oczyszczone z SPLa pliki konfiguracyjne LCD z przykładu od ST.

    Projekt ustawia odpowiednio kontroler ILI, inicjalizuje LTDC, oraz ustawia fioletowe tlo (jak wyświetlacz jest fioletowy znaczy że wszystko ok) dodatkowo zmienione są ustawienia zegarów (procek działa na 180 a nie 168 MHz)

    Pliki nie są dokładnie przetestowane mogą zawierać jakieś drobne błędy ale u mnie wszystko śmiga.
  • Poziom 8  
    Zdaje się że brakuje pliku "gpio.h"
    Korzystam z biblioteki do obsługi peryferiów: stm32f4xx_stdperiph_driver
    Natomiast nie działają mi (tzn. nie ma) następujących flag:

    GPIO_AF12_PP_100MHz
    GPIO_OUT_PP_50MHz
    GPIO_AF5_PP_25MHz_PULL_DOWN
    GPIO_AF14_PP_50MHz
    GPIO_OUT_PP_25MHz
    RCC_CR_HSERDY_bb
    GPIO_MODER_mask

    Stąd też pytanie czy nie znajdują się one czasem w brakującym pliku.
    Czy sprawy nie załatwią koniunkcje typu:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    ?

    Trzy potrzeba abym skorzystał z innej biblioteki ?
    Jeżeli koniunkcje to co w przypadku ostatnich dwóch flag, wyżej wymienionych, które nie działają ?

    Jeżeli wyświetlacz ożyje to będą potem na nim również działały funkcje z biblioteki STemWIN ?
  • Poziom 20  
    ferdezo napisał:
    Zdaje się że brakuje pliku "gpio.h"
    Korzystam z biblioteki do obsługi peryferiów: stm32f4xx_stdperiph_driver
    Natomiast nie działają mi (tzn. nie ma) następujących flag:

    GPIO_AF12_PP_100MHz
    GPIO_OUT_PP_50MHz
    GPIO_AF5_PP_25MHz_PULL_DOWN
    GPIO_AF14_PP_50MHz
    GPIO_OUT_PP_25MHz
    RCC_CR_HSERDY_bb
    GPIO_MODER_mask


    Wyraźnie napisałem że pliki które dodałem są w celu uzupełnienia projektu Freddiego Chopina. Oraz że są bez SPLa. Co do STemWIN powinien działać ale trzeba ją odpowiednio zaimplementować (zapewnić funkcje inicjalizacyjne oraz odpowiednio skonfigurować) Ja aktualnie nam tym pracuje jak będę miał gotowe to mogę wstawić. Niestety ostatnio mam mało czasu.
  • Poziom 9  
    Chciałbym odświeżyć temat.

    Czy ktoś mógłby się podzielić swoją pracą dotyczącą wyświetlania czegokolwiek na wyświetlaczu LCD nie wykorzystując bibliotek ST?

    Projekt przesłany przez kolegę SeerKaza będący modyfikacją projektu Freddiego działa bardzo ładnie, niestety jest to wyłącznie inicjalizacja LCD.

    Korzystając z bibliotek ST udało mi się wyświetlić tekst na LCD, jednak mam problem z wyświetleniem obrazu. Za pomocą programu LCD-image-converter prze konwertowałem bitmapę na tablicę char w pliku c. dodałem plik do projektu. Próbowałem wyświetlić obraz korzystając ze standardowej funkcji z STlib LCD_WriteBMP(&array), jednak nic nie jest wyświetlane.

    Będę wdzięczny za wszelką pomoc
  • Poziom 30  
    Wyżej masz moje biblioteki przecież.
    Ale pewnie Ty byś chciał gotowca który wszystko robi?
  • Poziom 9  
    ADI-mistrzu napisał:
    Wyżej masz moje biblioteki przecież.

    korzystając z twoich bibliotek, a w zasadzie funkcji, zamiast tekstu na ekranie uzyskałem puste pola na litery. Jest to prawdopodobnie moja wina, brak jakiejś funkcji lub ustawienia jakiegoś rejestru, ale trudno jest uczyć się mniej doświadczonym użytkownikom jeżeli publikowane są tylko "najwazniejsze" informacje

    Tak wiec poszedłem na łatwiznę i skorzystałem z bibliotek ST. Chciałbym się jednak czegoś nauczyć. Szczerze mówiąc nie liczyłem na gotowca patrząc na charakter wypowiedzi użytkowników na tym forum.

    Będę wdzięczny jeśli ktoś podrzuci jakąś literaturę pomocną w oswojeniu wyświetlacza. (nie chodzi mi o notę ILI9341)
  • Poziom 30  
    A bibliotekę z czcionkami masz? (a raczej po prostu plik nagłówkowy)
  • Poziom 9  
    Korzystałem z twoich czcionek, gdyż funkcja wyświetlająca tekst była napisana pod znaki o określonym rozmiarze (16x24).
    Tablicę miałem w font.c a w pliku font.h deklaracja stałej z przydomkiem extern
    Kompilator nie zgłaszał żadnych ostrzeżeń