Hallo, ich möchte ein Display mit ILITEK LCD-Controller an einem STM32F4 mit Segger emWin betreiben. Das Display ist über das RGB-Interface angeschlossen und mittels CubeMX wurde das TFT-Interface hinzugefügt. Nun Habe ich in emWin den Display-Treiber für den ILITEK ausgewählt und versuche ein "Hello World" auf dem Display auszugeben. Beim GUI_Init lande ich in der Callback-Funktion LCD_X_Displaydriver. Kann mir jemand einen Startpunkt geben, wie ich den LCD-Controller mittels RGB-Mode in Gang bekomme? Ich stehe da grad etwas auf dem Schlauch. Ich weiss auch, dass das sehr allgemein ist, aber ich will ja keinen Code, sondern nur einen Tip, welche SChritte ich tun muss, damit emWin mit dem RGB-Interfcae zusammen mit dem LCD-Controller läuft. Danke im Voraus!
Ja, sag mal, kannst du immer nur mit Bauklötzchen spielen? Was beinhaltet denn dieses Seggersche Paket EmWin - weißt du das? Hast du dir die Doku zu EmWin gründlich durchgelesen? Ist dir klar, daß ein Paket aus Widgets, Windows und Renderer auf ein grafisches System aufsetzt, das DU DU DU liefern mußt? Hast du dir ein zu deiner Hardware passendes grafisches System geschrieben und ausprobiert? W.S.
Ja das ist mir klar und genau da liegt ja meine Frage. Das hat jetzt nichts mit Bauklötzchen zu tun. Ich habe mir auch schon in den Samples die Implementierung für das 16 Bit Interface angesehen und verstehe auch, was da passiert. Nur komme ich irgendwie mit dem RGB Interface und der Hardware-Initialisierung aus CubeMX nicht weiter. Aber da ich schon häufiger mitgelesen habe, war mir klar, dass auch solche Antworten kommen müssen...
Hi! Dass Du die entsprechenden Zugriffe der emWin auf die Portpins umsetzen musst, dürfte klar sein. Auch die Reset- und ChipSelect-Leitung nicht vergessen. Dann kommt allerdings irgendwann der Punkt, wo die emWin die Intialisierung des LCD-Controllers auf Dich abwälzt. Da musst Du dann im Datenblatt des Displays nachschauen. Da sollte eine Initialisierungs-Sequenz vorhanden sein. (Befehle / evtl Delays dazwischen) Warum im Display-Datenblatt nachschauen und nicht im Datenblatt des Controllers? Weil es darauf ankommt, wie der Display-Hersteller das Ding verbaut hat. (Boost-Kondensatoren usw usf... Da gibt es viele Möglichkeiten - die richtige zufällig zu erwischen ist quasi aussichtslos.) Grüsse!
Jörg S. schrieb: > Das hat jetzt > nichts mit Bauklötzchen zu tun Oh doch! Was macht denn so ganz konkret die "Hardware-Initialisierung aus CubeMX"? Hast du das wirklich verstanden, was da abgeht oder zumindest abgehen sollte? Soweit ich das sehe, ist zumindest einer der Ilitek-Controller ein gemixter Controller, der sowohl 18 Bit (6+6+6) RGB nebst DOTCLOCK, DE, HSYNC, VSYNC als auch Portbetrieb via /CS, /WR, /RD, D/C versteht. Du mußt dich also wirklich zu allererst in die Doku zum TFT-Controller und zu deinem konkreten Display einlesen. Dann mußt du dich in die Doku zum betreffenden STM32 einlesen und entscheiden, auf welche Weise das Display überhaupt an diesem Controller betrieben werden soll. Wenn es im Portbetrieb sein soll (oder muß), dann wäre es völlig verkehrt, es am eingebauten TFT-Controller betreiben zu wollen. Andernfalls, wenn es im passiven Mode per 16 oder 18 Bit RGB betrieben werden sollte, dann mußt du den erforderlichen RAM vorhalten und den im STM32 eingebauten TFT Controller richtig aufsetzen. Merkst du jetzt, daß es eben nicht wirklich ausreicht, in irgend einem CubeXYZ ein Häkchen zu setzen? W.S.
Kurze Frage.. ist es normal, dass ich nach dem LTDC-Init einmalig einen FIFO_Underrun Interrupt bekomme und danach nicht mehr? Das soll ja passieren, wenn der Framebuffer zu klein ist. den hab ich jedoch mit 320*240*2 angelegt und dem InitStruct übergeben. Die HSYNC,VSYNC, DE und PIXELCLOCK Signale sehen am Oskar gut aus. ich bekomme aber trotzdem nix aufs Display. den ILITEK Controller hab ich nach Datenblatt über das 3Wire Serial Interface auf RGB und Modus RGB565 konfiguriert. Ich weiss nur momentan nicht obs an der Init-Sequenz des ILITEK oder an dem LTDC liegt, dass ich nix sehe. BTW, das Display ändert sich nach der INIT-Sequenz. Vorher sieht man das Backlight weiss durchscheinen, danach wird das Bild grau.... Es ist dabei egal, was ich in den Framebuffer schreibe.
Hallo, anbei mal meine Initialisierung: Framebuffer:
1 | U32 aMemory[(320*240*2)/4]; |
Init LTDC
1 | hltdc.Instance = LTDC; |
2 | hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; |
3 | hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; |
4 | hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; |
5 | hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; |
6 | hltdc.Init.HorizontalSync = 9; |
7 | hltdc.Init.VerticalSync = 1; |
8 | hltdc.Init.AccumulatedHBP = 29; |
9 | hltdc.Init.AccumulatedVBP = 3; |
10 | hltdc.Init.AccumulatedActiveW = 349; |
11 | hltdc.Init.AccumulatedActiveH = 243; |
12 | hltdc.Init.TotalWidth = 359; |
13 | hltdc.Init.TotalHeigh = 257; |
14 | hltdc.Init.Backcolor.Blue = 0; |
15 | hltdc.Init.Backcolor.Green = 0; |
16 | hltdc.Init.Backcolor.Red = 0; |
17 | HAL_LTDC_Init(&hltdc); |
18 | |
19 | pLayerCfg.WindowX0 = 30; |
20 | pLayerCfg.WindowX1 = 350; |
21 | pLayerCfg.WindowY0 = 3; |
22 | pLayerCfg.WindowY1 = 243; |
23 | pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; |
24 | pLayerCfg.Alpha = 0x0; |
25 | pLayerCfg.Alpha0 = 0x0; |
26 | pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; |
27 | pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; |
28 | pLayerCfg.FBStartAdress = (uint32_t)aMemory; |
29 | pLayerCfg.ImageWidth = 320; |
30 | pLayerCfg.ImageHeight = 240; |
31 | pLayerCfg.Backcolor.Blue = 0; |
32 | pLayerCfg.Backcolor.Green = 0; |
33 | pLayerCfg.Backcolor.Red = 0; |
34 | HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0); |
Init Sequenz ILI9342C wie ich sie aus dem Datenblatt verstanden hab
1 | //************* Start Initial Sequence **********//
|
2 | send_ctrl_cmd(0x01); //SoftwareReset |
3 | HAL_Delay(10); |
4 | |
5 | send_ctrl_cmd(0xD9); //Get External Register for SPI |
6 | send_data_cmd(0x10); //(D7:0, D6:0, D5:0, D4[ENSPI]:1, SPIEXTORD[D3:0, D2:0, D1:0, D0:0]) |
7 | |
8 | send_ctrl_cmd(0x20); //Display Inversion OFF |
9 | |
10 | send_ctrl_cmd(0x3A); //COLMOD PixelFormat Set //RGB565 |
11 | send_data_cmd(0x55); //(D7:0, D[6:4]:101, D3:0, D[2:0]:101) |
12 | |
13 | send_ctrl_cmd(0x51); //Write Display Brightness |
14 | send_data_cmd(0xFF); //(FF=maxBrightness) |
15 | |
16 | send_ctrl_cmd(0x53); //Write CTRL Display |
17 | send_data_cmd(0x24); //(D7:0, D6:0, D5:1, D4:0, D3:0, D2:1, D1:0, D0:0) |
18 | |
19 | send_ctrl_cmd(0xB0); //RGB Interface Signal Control |
20 | send_data_cmd(0x40); //(D7:0, RCM[D6:1, D5:0], D4:0, D3:0, D2:0, D1:0, D0:0) //RGB 16Bit 65K |
21 | |
22 | send_ctrl_cmd(0xB4); //Display Inversion Control |
23 | send_data_cmd(0x00); //(D7:0, D6:0, D5:0, D4:0, D3:0, D2:0, DINV[D1:0, D0:0]) |
24 | |
25 | |
26 | |
27 | send_ctrl_cmd(0xB5); //Blanking Porch Control |
28 | send_data_cmd(0x02); //(D7:0, VFP[D6:0, D5:0, D4:0, D3:0, D2:0, D1:1, D0:0]) |
29 | send_data_cmd(0x02); //(D7:0, VBP[D6:0, D5:0, D4:0, D3:0, D2:0, D1:1, D0:0]) |
30 | send_data_cmd(0x0A); //(D7:0, HFP[D6:0, D5:0, D4:0, D3:1, D2:0, D1:1, D0:0]) |
31 | send_data_cmd(0x14); //(D7:0, HBP[D6:0, D5:0, D4:1, D3:0, D2:1, D1:0, D0:0]) |
32 | |
33 | send_ctrl_cmd(0xF6); //Interface Control |
34 | send_data_cmd(0x01); //WEMODE=1 |
35 | send_data_cmd(0x00); // |
36 | send_data_cmd(0x06); //ENDIAN=0(MSBfirst), DM:01:RGB-InterfaceMode,RM:RGB-Inteface-Mode,RIM:0:16BitRGB |
37 | |
38 | ///////////////////////////////////////////////
|
39 | send_ctrl_cmd(0x11);//Exit Sleep |
40 | HAL_Delay(80); |
41 | send_ctrl_cmd(0x11);//Exit Sleep |
42 | HAL_Delay(80); |
43 | |
44 | send_ctrl_cmd(0x29);//Display On |
45 | HAL_Delay(20); |
46 | |
47 | send_ctrl_cmd(0x2C);//Display On |
Ist das schön, dass du der staunenden Masse die Lösung verrätst...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.