Hi,
ich versuche seit längerem eine selbst gemachte Platine mit einem
LPC2478 in Betrieb zu nehmen. Auf der Platine sind ein externes DRAM,
ein LVDS Transmitter und auf einer weiteren Platine sind ein LVDS
Receiver plus ein TFT Display mit 480x272 Pixeln Auflösung.
Mein problem ist nun, dass ich auf dem Display kein vernünftiges Bild
zustande kriege. Es sind immer nur Teile zu sehen, es sind Streifen im
Bild und das Bild verändert sich mit der Zeit (siehe Bilder). Woran kann
das liegen? Ist der Fehler eher in der Hardware oder der Software zu
suchen?
Bei Bedarf würde ich noch mal meinen Code posten.
Das Display soll eigentlich mehrere bunte Streifen anzeigen, die sind ja
auch Ansatzweise erkennbar. Aber die Farben stimmen überhaupt nicht.
Was sollte denn in dem Bild korrekterweise angezeigt werden?
Ich habe ziemlich ähnliche Hardware in Betrieb, ich hoffe ich kann dir
helfen. Zeig doch mal deine Initialisierung des Displaycontrollers.
Dein Problem sieht auf den ersten Blick eher nach einem Hardwareproblem
aus, evtl. macht ein LVDS Pin kein Kontakt, oder aber du hast bei der
Initialisierung vergessen ein Pin dem Displaycontroller zuzuweisen.
Öhm ja den Testcode hab ich glaube ich sogar aus einem deiner Posts :-)
Das sollen 8 Farbbalken sein in den Farben weiß, türkis, gelb, grün,
lila, blau, rot und schwarz. Was als erstes Auffällt, ist dass die
Farbbalken die man sieht, nicht die Reihenfolge haben wie sie sein
sollte.
Hier mal der Code um die Balken zu zeichnen: 1 | const u32 coltab[] = { 0x00FFFFFF, 0x0000FFFF, 0x00FFFF00, 0x0000FF00,
| 2 | 0x00FF00FF, 0x000000FF, 0x00FF0000, 0x00000000 };
| 3 |
| 4 | ...
| 5 | // Farbbalken anzeigen
| 6 | ptr = (u32 *)0xA0000000;
| 7 | for(y = 0; y < 272; y++)
| 8 | {
| 9 | for(x = 0; x < 480; x++)
| 10 | {
| 11 | *ptr = coltab[x/60];
| 12 | ptr++;
| 13 | }
| 14 | }
|
Und hier der code um den LCD-Controller einzurichten: 1 | void Lcd_Init(void)
| 2 | {
| 3 | // Einschalten des LCD Controllers
| 4 | PCONP |= BIT(20);
| 5 | asm(" NOP");
| 6 |
| 7 | // LCD Controller für 24Bit TFT einrichten
| 8 | LCD_CTRL = 0x2A; // TFT 24Bit, no grey scaler
| 9 | LCD_CFG = 7; // CCLK/8 = 9 Mhz
| 10 | LCD_POL = (0x01 << 26) // Bypass clock divider
| 11 | | ((480 - 1) << 16) // Clock per Line
| 12 | | (0x00 << 14) // ENA aktiv low
| 13 | | (0x01 << 13) // DATA falling edge
| 14 | | (0x01 << 12) // HSYNC aktiv low
| 15 | | (0x01 << 11); // VSYNC aktiv low
| 16 | LCD_TIMH = (1 << 24) // Horizontal back porch (2)
| 17 | | (1 << 16) // Horizontal front porch (2)
| 18 | | (40 << 8) // Horizontal pulse width (41)
| 19 | | (((480 / 16) - 1) << 2); // Pixels per Line
| 20 | LCD_TIMV = (2 << 24) // Vertical back porch (3)
| 21 | | (2 << 16) // Vertical front porch (3)
| 22 | | (10 << 10) // Vertical pulse width (10)
| 23 | | (272 - 1); // Vertical lines
| 24 | LCD_UPBASE = FRAMEBUF;
| 25 | LCD_LPBASE = 0;
| 26 | LCD_CTRL |= BIT(11) | BIT(0);
| 27 | }
|
Das Display habe ich mit 24Bit angebunden, der Controller soll bei 27MHz
laufen.
Geb mal in den PINSEL Registern die Pins des Controllers dem
Displaycontroller frei:
1 | PINSEL0 |= 0x00055500;
| 2 | PINSEL3 |= 0x05555500;
| 3 | PINSEL4 |= 0x050FFFFF;
| 4 | PINSEL9 |= 0x0A000000;
| 5 | PINSEL11 |= 0x0000000F;
|
| (0x01 << 13) // DATA falling edge
habe ich so:
| (0x00 << 13) // DATA falling edge
Außerdem habe ich das TIMV Register anders: 1 | LCD_TIMV = (1 << 24)|(1 << 16)|(9 << 10)|(272-1);
|
Damit die Taktung stimmt sollte der LPC aber mit 72 MHz laufen
(Tippfehler?)
Edit: Das SDRAM läuft korrekt?
Sorry den code wo die pins eingerichtet werden habe ich vergessen zu
posten: 1 | // Pins einrichten
| 2 | PINSEL0 = 0x00055500; // -> LCD
| 3 | PINSEL1 = 0x00000000; // P0[31]
| 4 | PINSEL3 = 0x05555500; // -> LCD
| 5 | PINSEL4 = 0x550FFFFF; // P2[14],P2[15] -> EMC, LCD
| 6 | PINSEL5 = 0x55555555; // P2[16]-P2[31] -> EMC
| 7 | PINSEL6 = 0x55555555; // P3[00]-P3[15] -> EMC
| 8 | PINSEL7 = 0x55555555; // P3[16]-P3[31] -> EMC
| 9 | PINSEL8 = 0x55555555; // P4[00]-P4[15] -> EMC
| 10 | PINSEL9 = 0x5A555555; // P4[16]-P4[27],P4[30],P4[31] -> EMC, LCD
| 11 | PINSEL11 = 0x0000000F; // -> LCD (LCDPWR, 24Bit TFT)
|
Und ja es war ein Tippfehler, der Controller soll bei 72MHz laufen.
Ich habe meine Konfiguration mal angepasst, sodass das TIMV-register
genauso wie deins initialisiert wird. Auch die DATA falling-edge habe
ich so eingestellt wie bei dir. Das brachte aber noch nicht den
Durchbruch. Das Bild zeigt die Veränderung, die Farben sind nun anders,
stimmen aber noch immer nicht mit dem gewünschten überein.
Zum Testen des RAM habe ich diesen Code verwendet: 1 | #define SDRAM_BASE_ADDR 0xA0000000
| 2 | void vTestRam(void)
| 3 | {
| 4 | unsigned int i;
| 5 | unsigned int temp;
| 6 |
| 7 | for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
| 8 | {
| 9 | *(unsigned int*)(SDRAM_BASE_ADDR+i) = i;
| 10 | }
| 11 |
| 12 | for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
| 13 | {
| 14 | temp = *(unsigned int*)(SDRAM_BASE_ADDR+i);
| 15 | if (temp != i)
| 16 | {
| 17 | DebugBreak();
| 18 | }
| 19 | }
| 20 | }
|
Prüfe doch bitte mal ob die Signale: DCLK, HYSNC, VSYNC am Display alle
korrekt anliegen. Spannungspegel, Frequenz.
Wie sieht dein Hardware Aufbau aus?
Also das Messen wird schwierig, ich habe kein Oszi hier. Aber ich kann
ja mal messen, ob der Kontakt überhaupt da ist. Oder mit dem
Logik-Analyzer schauen ob die Signale ausgegeben werden.
Anbei mal meine Beschaltung des Displays.
Überbrücke mal die Widerstände R10 und R11 beim LVDS Transmitter, die
haben da eigentlich nichts verloren.
Ansonsten dürfte SHTDN beim Receiver ein Eingang sein, kein Ausgang.
Aber das ist erstmal nebensächlich.
Also ich habe die Widerstände überbrückt, das hat aber keinen
Unterschied gebracht.
Der SHTDN ist ein Eingang am Receiver und am Display ist ein ähnlicher
Eingang DISP. Beide werden über den LCDPWR-Pin des LPC2478 gesteuert.
Den Bin habe ich über eine Steckerleiste mit den LVDS-Signalen auf die
Platine geführt, siehe SV3.
Ich habe mal versucht das Display einfarbig grün zu malen. Dabei wird
immer nur das halbe Display bemalt, die andere hälfte bleibt weiß. Der
Grünton stimmt, hat allerdings weiße Streifen drin die sich verändern.
Dann habe ich versucht eine hälfte grün die andere rot zu malen.
Ergebnis war eine hälfte in einer Mischfarbe, die andere bleibt weiß.
Ein sehr merkwürdiges Verhalten?
Wie würde sich denn ein falsch konfigurierter oder zu langsammer RAM
bemerkbar machen?
Also ich habe nun nochmals mit dem Settings des LCD-Controller gespielt
und konnte das Ergebnis verbessern (siehe Bild). Ereicht habe ich das
durch reduzieren des LCD panel clock prescaler, der steht nun auf 4.
1 | // Einschalten des LCD Controllers
| 2 | PCONP |= BIT(20);
| 3 | asm(" NOP");
| 4 |
| 5 | // LCD Controller für 24Bit TFT einrichten
| 6 | LCD_CTRL = 0x2A; // TFT 24Bit, no grey scaler
| 7 | LCD_CFG = 3; // CCLK/8 = 9 Mhz
| 8 | LCD_POL = (0x01 << 26) // Bypass clock divider
| 9 | | ((480 - 1) << 16) // Clock per Line
| 10 | | (0x00 << 14) // ENA aktiv low
| 11 | | (0x01 << 13) // DATA falling edge
| 12 | | (0x01 << 12) // HSYNC aktiv low
| 13 | | (0x01 << 11); // VSYNC aktiv low
| 14 | LCD_TIMH = (1 << 24) // Horizontal back porch (2)
| 15 | | (1 << 16) // Horizontal front porch (2)
| 16 | | (40 << 8) // Horizontal pulse width (41)
| 17 | | (((480 / 16) - 1) << 2); // Pixels per Line
| 18 | LCD_TIMV = (1 << 24) // Vertical back porch (3)
| 19 | | (1 << 16) // Vertical front porch (3)
| 20 | | (9 << 10) // Vertical pulse width (10)
| 21 | | (272 - 1); // Vertical lines
| 22 | LCD_UPBASE = 0xA0000000;
| 23 | LCD_LPBASE = 0;
| 24 | LCD_CTRL |= BIT(11) | BIT(0);
|
Allerdings läuft mein System jetzt nicht mehr stabil, ich kann es mit
den Settings nicht debuggen, ich weiß also nicht ob es sich resettet
oder sonst was anstellt. Ich hab bisher auch keine Ahnung woran das
liegen kann.
Auch passen die Settings noch nicht wirklich, da zum einen noch weiße
Streifen durch das Display laufen und zum anderen sitzt nicht jeder
Pixel in jeder Zeile an der richtigen Stelle. Das erkennt man an den
übergängen von einer Farbe zur nächsten, dort sind manche Pixel um einen
oder zwei Pixel verschoben, wobei sich das ständig ändert.
Hat noch jemand eine zündende Idee was mein Problem sein könnte? Die
Anzeige habe ich noch immer nicht komplett hin bekommen. Es werden noch
immer die weißen Streifen angezeigt.
Die Einstellungen für den Display-Controller sind momentan so wie sie
sollten, außer der Displayclock, den musste ich auf 18MHz einstellen
also das doppelte vom normalen. Grundsätzlich scheint hier etwas nicht
zu stimmen.
Dann habe ich noch festgestellt, dass bei jeder UART Übertragung ein
kurzes Flimmern auf dem Display entsteht. Das kann ich mir ebenfalls
nicht erklären, da die Leitungen von Display und UART nicht annähernd
beieinander liegen. Hier muss der Fehler auch im Controller liegen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|