Guten Morgen!
Ich beisse mir gerade die Zähne an der Ansteuerung eines LCD-Displays
aus. Angeblich soll das Modul einen ILI9341 drauf haben, ich glaube das
aber unterdessen nicht mehr...
Wenn ich Register 0 auslese, erhalte ich immer 0 statt der bei vielen
Controllern erwarteten Geräte-ID. Auch bei Register 4, wo beim ILI9341
die Hersteller-ID sein sollte, erhalte ich 0. Bei Register 9 (Status?)
erhalte ich 00 40 00 00. Das passt nicht mit den im ILI9341 Datenblatt
dokumentierten Reset-Werten.
Wahrscheinlich ist also ein anderes Modul verbaut, aber welches?
Was ich auch nicht verstehe: In z.B. der UTFT-Bibliothek wird der
ILI9341 mit unten stehendem Code initialisiert. In meinem Datenblatt
(V1.02) sind aber Kommandos 0xcb und 0xcf etc. nicht dokumentiert.
1 | case ILI9341_S5P:
|
2 | LCD_Write_COM(0xCB);
|
3 | LCD_Write_DATA(0x39);
|
4 | LCD_Write_DATA(0x2C);
|
5 | LCD_Write_DATA(0x00);
|
6 | LCD_Write_DATA(0x34);
|
7 | LCD_Write_DATA(0x02);
|
8 |
|
9 | LCD_Write_COM(0xCF);
|
10 | LCD_Write_DATA(0x00);
|
11 | LCD_Write_DATA(0XC1);
|
12 | LCD_Write_DATA(0X30);
|
13 |
|
14 | LCD_Write_COM(0xE8);
|
15 | LCD_Write_DATA(0x85);
|
16 | LCD_Write_DATA(0x00);
|
17 | LCD_Write_DATA(0x78);
|
18 |
|
19 | LCD_Write_COM(0xEA);
|
20 | LCD_Write_DATA(0x00);
|
21 | LCD_Write_DATA(0x00);
|
22 |
|
23 | LCD_Write_COM(0xED);
|
24 | LCD_Write_DATA(0x64);
|
25 | LCD_Write_DATA(0x03);
|
26 | LCD_Write_DATA(0X12);
|
27 | LCD_Write_DATA(0X81);
|
28 |
|
29 | LCD_Write_COM(0xF7);
|
30 | LCD_Write_DATA(0x20);
|
31 |
|
32 | LCD_Write_COM(0xC0); //Power control
|
Da die Frage kommen wird: Ich steuere das Modul mit 16bit parallel an.,
über Ports A (D0..7) und D (D8..15) eines PIC18F46K20 an, der mit 16MHz
läuft. Die Pegel sämtlicher Steuerleitungen (WR,RD,CS,RS,RESET) habe ich
nachgemessen, die Ansteuerung stimmt. Ebenso kann ich die Pegel der
Ports A und D einlesen. Ich bin ziemlich sicher, dass hier alles stimmt.
Trotzdem hier der Code (bleibt natürlich nicht so, ist erst mal ein Hack
für Tests):
1 | #define WR_L LATEbits.LATE0=0
|
2 | #define WR_H LATEbits.LATE0=1
|
3 | #define RD_L LATEbits.LATE1=0
|
4 | #define RD_H LATEbits.LATE1=1
|
5 | #define RESET_L LATEbits.LATE2=0
|
6 | #define RESET_H LATEbits.LATE2=1
|
7 | #define CS_L LATBbits.LATB5=0
|
8 | #define CS_H LATBbits.LATB5=1
|
9 | #define RS_L LATBbits.LATB4=0
|
10 | #define RS_H LATBbits.LATB4=1
|
11 |
|
12 | CS_L;
|
13 | RS_L;
|
14 | LATA=0x00; // DB0--15 = 0
|
15 | LATD=0x00;
|
16 | TRISA=0; // ports = output
|
17 | TRISD=0;
|
18 | WR_L; // pulse WR
|
19 | NOP;
|
20 | WR_H;
|
21 | RS_H;
|
22 | TRISA=0xff; // ports = input
|
23 | TRISD=0xff;
|
24 | RD_L;
|
25 | NOP;
|
26 | RS232hex(PORTA);
|
27 | RS232hex(PORTD);
|
28 | RD_H;
|
29 | CS_H;
|
30 |
|
31 | // liefert : 0000
|
32 |
|
33 | CS_L;
|
34 | RS_L;
|
35 | LATA=0x09; // DB0--15 = 0
|
36 | LATD=0x00;
|
37 | TRISA=0; // ports = output
|
38 | TRISD=0;
|
39 | WR_L; // pulse WR
|
40 | NOP; NOP; NOP; NOP;
|
41 | WR_H;
|
42 | RS_H;
|
43 | TRISA=0xff; // ports = input
|
44 | TRISD=0xff;
|
45 |
|
46 | for( i=0; i<5u; i++) {
|
47 | RD_L;
|
48 | NOP; NOP;
|
49 | RS232hex(PORTD);
|
50 | RS232hex(PORTA);
|
51 | RS232space();
|
52 | RD_H;
|
53 | }
|
54 |
|
55 | // liefert : 0000 0000 0040 0000 0000
|
56 |
|
57 | CS_H;
|
Ein Photo des Moduls ist hier:
https://www.mikrocontroller.net/attachment/283390/lcd1.jpg
Rechts unten am dem Glas des Moduls steht "HR4 8637S G3/2"
Wäre froh um einen Tipp wie ich hier weiterkomme...