Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek 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

ADI-mistrzu 28 Gru 2013 21:02 10986 34
  • #1 28 Gru 2013 21:02
    ADI-mistrzu
    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

    0 29
  • CControls
  • #2 28 Gru 2013 21:10
    tadzik85
    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.

    0
  • #3 28 Gru 2013 21:39
    ADI-mistrzu
    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?

    0
  • #4 28 Gru 2013 21:48
    tadzik85
    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.

    0
  • #5 28 Gru 2013 23:18
    ADI-mistrzu
    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ć.

    0
  • #6 11 Wrz 2014 16:15
    ADI-mistrzu
    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

    1
  • #7 22 Wrz 2014 17:19
    dziechu
    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.

    0
  • #8 22 Wrz 2014 21:52
    ADI-mistrzu
    Poziom 30  

    Tak, zauważyłem że zbyt wolna transmisja jest ignorowana przez wewnętrzny sterownik wyświetlacza.

    0
  • #9 23 Wrz 2014 07:59
    dziechu
    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ąć ! ).

    0
  • #10 23 Wrz 2014 08:37
    ADI-mistrzu
    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.

    0
  • CControls
  • #12 23 Wrz 2014 12:31
    ADI-mistrzu
    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.

    0
  • #13 18 Paź 2014 21:34
    323493
    Użytkownik usunął konto  
  • #14 20 Paź 2014 09:48
    ADI-mistrzu
    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.

    0
  • #15 20 Paź 2014 10:30
    dziechu
    Poziom 27  

    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?

    0
  • #16 20 Paź 2014 11:00
    ADI-mistrzu
    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ć.

    0
  • #17 20 Paź 2014 11:32
    dziechu
    Poziom 27  

    To ja wklejam swoje, co mam:

    Inicjalizacja SPI, GPIO i PWM dla podswietlenia:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Inicjalizacja wyświetlacza:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #18 20 Paź 2014 15:46
    _coder
    Poziom 11  

    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.

    -3
  • #19 20 Paź 2014 16:42
    dziechu
    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.

    -1
  • #20 20 Paź 2014 18:50
    ADI-mistrzu
    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.

    1
  • #21 05 Lis 2014 14:41
    mattsk
    Poziom 12  

    Witam, przepisałem powyższy kod do Keila i zamiast skaczącej kostki mam biały ekran. Czy trzeba jeszcze coś skonfigurować aby program zadziałał? (oprócz konfiguracji kwarcu i całego porjektu w keilu). Dodam że demo graficzne z plku hex działa.

    Pozdrawiam

    0
  • #22 29 Lis 2014 17:38
    ferdezo
    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.

    0
  • #23 30 Lis 2014 14:44
    SeerKaza
    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.

    2
  • #24 01 Gru 2014 14:43
    ferdezo
    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 ?

    0
  • #25 01 Gru 2014 18:00
    SeerKaza
    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.

    0
  • #26 11 Mar 2015 09:11
    czeslaw111
    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

    0
  • #27 11 Mar 2015 12:20
    ADI-mistrzu
    Poziom 30  

    Wyżej masz moje biblioteki przecież.
    Ale pewnie Ty byś chciał gotowca który wszystko robi?

    0
  • #28 11 Mar 2015 23:11
    czeslaw111
    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)

    0
  • #29 12 Mar 2015 07:04
    ADI-mistrzu
    Poziom 30  

    A bibliotekę z czcionkami masz? (a raczej po prostu plik nagłówkowy)

    0
  • #30 12 Mar 2015 08:30
    czeslaw111
    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ń

    0