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

XMEGA i wyświetlacz TFT 800x480 z kontrolerem FT813

Rasel 07 Sie 2019 12:41 711 4
  • #1 18102023
    Rasel
    Poziom 22  
    Próbuję uruchomić 7 calowy wyświetlacz Riverdi typu RVT70UQFNWC00 z pojemnościowym panelem dotykowym. Korzystam z własnej płytki z mikrokontrolerem Xmega 128A1U, Atmel Studio 7 oraz wiedzy i biblioteki zawartych w książce "Sterowanie wyświetlaczami LCD" autorstwa Tomasza Francuza. Do komunikacji z wyświetlaczem używam interfejsu SPI. Tasiemka łącząca moją płytkę PCB z wyświetlaczem ma długość 152 mm.

    Cztery pliki z w/w biblioteki zmodyfikowałem zgodnie z sugestiami zawartymi w książce i potrzebami wynikającymi z zastosowanego mikrokontrolera, portami wykorzystanymi do komunikacji SPI i rodzajem użytego wyświetlacza. Zmodyfikowane pliki są w załączniku, każda zmiana którą wprowadziłem opatrzona jest w komentarzu trzema plusami +++.

    Mój problem polega na tym, że wyświetlacz działa tylko częściowo, tzn. mikrokontroler komunikuje się z nim (widzę to na analizatorze stanów logicznych), ale jedyne co widać na ekranie po inicjalizacji kontrolera FT813 to kolorowe tło. Nie widać żadnych tekstów, kropek, linii itp. Dziwne jest również to, że wywołanie funkcji kalibracji panelu dotykowego jest ignorowane - program nie czeka na naciśnięcie ekranu w trzech miejscach ale następuje natychmiastowy powrót z tej funkcji.

    Czy ktoś z Was spotkał się z podobnym problemem i wie gdzie popełniam błąd?
  • #2 18103525
    tmf
    VIP Zasłużony dla elektroda
    Najpierw sprawdź poprawność komunikacji po SPI. W tym celu odczytaj jakiś rejestr FT o znanej wartości. Następnie sprawdź poprawność zapisów. Jak na 100% będziesz pewien, że to działa to można przejść dalej. Kolorowe tło może świadczyć o braku display list. Skoro programujesz XMEGA to z pewnością masz debugger. Warto go użyć do prześledzenia co robi program.
  • #3 18103704
    Rasel
    Poziom 22  
    TMF dziękuję za odpowiedź.
    tmf napisał:
    Najpierw sprawdź poprawność komunikacji po SPI. W tym celu odczytaj jakiś rejestr FT o znanej wartości. Następnie sprawdź poprawność zapisów.

    To sprawdziłem. Zapis i odczyt po SPI działa prawidłowo. Odczytuję wcześniej wpisane liczby do rejestrów FT813 i znajdują się tam wpisane liczby.
    tmf napisał:
    Jak na 100% będziesz pewien, że to działa to można przejść dalej. Kolorowe tło może świadczyć o braku display list.


    Po wpisaniu takiej prostej display listy:
    
    Ft_Gpu_CoCmd_Dlstart(phost);
    Ft_App_WrCoCmd_Buffer(phost,CLEAR(1, 1, 1));
    Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(231, 239, 75));
    Ft_Gpu_CoCmd_Text(phost,16, 131, 28, 0, "Nacisnij kolejne punkty w celu kalibracji panela");
    Ft_Gpu_CoCmd_Calibrate(phost, 0);		
    Ft_App_WrCoCmd_Buffer(phost, DISPLAY());
    Ft_Gpu_CoCmd_Swap(phost);
    Ft_App_Flush_Co_Buffer(phost);
    Ft_Gpu_Hal_WaitCmdfifo_empty(phost);
    

    ekran jest pusty, a program przechodzi dalej nie czekając na trzy naciśnięcia dla kalibracji panelu dotykowego.

    Przed chwilą wpisałem "ręcznie" display listę bezpośrednio do pamięci FT813 od adresu RAM_DL (0x300000):
    
    FT80x_memory_WR_32(RAM_DL + 0x000, CLEAR_COLOR_RGB(0,0,155));
    FT80x_memory_WR_32(RAM_DL + 0x004, CLEAR(1,1,1));
    FT80x_memory_WR_32(RAM_DL + 0x008, COLOR_RGB(255, 255, 255)); // change color
    FT80x_memory_WR_32(RAM_DL + 0x00C, BEGIN(FT_BITMAPS)); // start drawing bitmaps
    FT80x_memory_WR_32(RAM_DL + 0x010, VERTEX2II(45+0-2, 110, 31, 'T'));		// ascii T in font 31
    FT80x_memory_WR_32(RAM_DL + 0x014, VERTEX2II(45+25, 110, 31, 'e'));		// ascii e
    FT80x_memory_WR_32(RAM_DL + 0x018, VERTEX2II(45+50, 110, 31, 's'));		// ascii s
    FT80x_memory_WR_32(RAM_DL + 0x01C, VERTEX2II(45+60, 110, 31, 't'));		// ascii t
    FT80x_memory_WR_32(RAM_DL + 0x020, END());
    FT80x_memory_WR_32(RAM_DL + 0x024, COLOR_RGB(0, 127, 255)); // change color 
    FT80x_memory_WR_32(RAM_DL + 0x028, POINT_SIZE(320)); // set point size to 20 pixels in radius
    FT80x_memory_WR_32(RAM_DL + 0x02C, BEGIN(FT_POINTS)); // start drawing points
    FT80x_memory_WR_32(RAM_DL + 0x030, VERTEX2II(120, 250, 0, 0)); // red point		
    FT80x_memory_WR_32(RAM_DL + 0x034, END());
    FT80x_memory_WR_32(RAM_DL + 0x038, DISPLAY());
    FT80x_memory_WR_8(REG_DLSWAP, DLSWAP_FRAME);//display list swap
    


    W tym przypadku tekst i grafika pojawiają się na ekranie. To wskazuje, że problem jest gdzieś w wyższej warstwie oprogramowania.

    Analizując dane z analizatora stanów logicznych podpiętego do magistrali SPI widzę, że pierwsza display lista, z dwóch wyżej zamieszczonych, jest wysyłana pod zły adres. Zamiast 0x300000 właściwego dla układów FT81x, jest wysyłana pod adres 0x100000 właściwy dla rodziny FT80x. Wygląda na to, że najstarszy bit adresu jest gdzieś niepotrzebnie zerowany.
  • #4 18105875
    Rasel
    Poziom 22  
    Problem rozwiązuje zakomentowanie w pliku "FT_Gpu.h" całego bloku definicji stałych dla kontrolera FT80x, rozpoczynającego się od:

    
    #ifndef FT_81X_ENABLE
    
    // For FT801 enable the switch in platform.h file 
    // Lower boundary of trimming 
    #define LOW_FREQ_BOUND  47040000L//98% of 48Mhz
    .
    .
    .
    #define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0))
    #define DISPLAY() ((0UL<<24))
    #else
    

    Dzieje się tak mimo tego, że w pliku "FT_Platform.h" jest zdefiniowana stała:

    
    #define FT_81X_ENABLE							(1)
    
  • #5 18106540
    tmf
    VIP Zasłużony dla elektroda
    Generalnie takie definicje powinny być raczej w opcjach projektu, nie w plikach nagłówkowych. Dzięki temu są widoczne w całym projekcie, a nie tylko w miejscach w których jest zainkludowany odpowiedni plik.
REKLAMA