STM32F103 TFT SPI ILI9225

Gast #4225018
Lesenswert?

Hallo liebe Gemeinde,

Ich möchte gerne ein TFT Display mit 2,2" über SPI ansteuern.
Ich benutze ein STM32F103 mit Folgender Pin Belegung.

STM32       TFT
PA2   ->    RST
PA3   ->    RS
PA4   ->    CS
PA5   ->    SCK
PA7   ->    MOSI
3.3V  ->    VCC
GND   ->    GND

Als erstes möchte ich das TFT Initialisieren. Leider komme ich damit 
nicht ganz klar.
Wie sende ich denn ein Befehl ans TFT?

Schritt 1:
Ich muss CS auf Low ziehen.
Schritt 2:
Startbyte(0b01110(ID?)00) senden
Ist das erstmal so richtig?
Schritt 3:
Befehle für Initialisirung senden.

Ich hoffe ihr könnt mir erstmal sagen ob das ganze soweit richtig ist.

lg Motze
Angehängte Dateien:
Gast #4226757
Lesenswert?

Wie Sende ich an besten Zeichen auf das TFT mein Weg scheint mir sehr 
umständlich zu sein.

hier der code:
1
void TFT_Draw_Char(uint16_t x, uint16_t y, uint16_t font_color, uint16_t back_color)
2
{
3
  Write_Command(0x36, x + 7);
4
  Write_Command(0x37, x);
5
  Write_Command(0x38, y + 5);
6
  Write_Command(0x39, y);
7
  
8
  Write_Command(0x20, x);
9
  Write_Command(0x21, y);
10
  
11
  Write_Register(0x22);
12
  HAL_GPIO_WritePin(GPIOA, RS, GPIO_PIN_SET);
13
  HAL_GPIO_WritePin(GPIOA, CS, GPIO_PIN_RESET);
14
  
15
  Write_Fast_Data(back_color);
16
  Write_Fast_Data(font_color);
17
  Write_Fast_Data(font_color);
18
  Write_Fast_Data(font_color);
19
  Write_Fast_Data(font_color);
20
  Write_Fast_Data(font_color);
21
  Write_Fast_Data(font_color);
22
  Write_Fast_Data(font_color);
23
  
24
  Write_Fast_Data(font_color);
25
  Write_Fast_Data(back_color);
26
  Write_Fast_Data(back_color);
27
  Write_Fast_Data(back_color);
28
  Write_Fast_Data(font_color);
29
  Write_Fast_Data(back_color);
30
  Write_Fast_Data(back_color);
31
  Write_Fast_Data(back_color);
32
  
33
  Write_Fast_Data(font_color);
34
  Write_Fast_Data(back_color);
35
  Write_Fast_Data(back_color);
36
  Write_Fast_Data(back_color);
37
  Write_Fast_Data(font_color);
38
  Write_Fast_Data(back_color);
39
  Write_Fast_Data(back_color);
40
  Write_Fast_Data(back_color);
41
  
42
  Write_Fast_Data(font_color);
43
  Write_Fast_Data(back_color);
44
  Write_Fast_Data(back_color);
45
  Write_Fast_Data(back_color);
46
  Write_Fast_Data(font_color);
47
  Write_Fast_Data(back_color);
48
  Write_Fast_Data(back_color);
49
  Write_Fast_Data(back_color);
50
  
51
  Write_Fast_Data(back_color);
52
  Write_Fast_Data(font_color);
53
  Write_Fast_Data(font_color);
54
  Write_Fast_Data(font_color);
55
  Write_Fast_Data(font_color);
56
  Write_Fast_Data(font_color);
57
  Write_Fast_Data(font_color);
58
  Write_Fast_Data(font_color);
59
  
60
  HAL_GPIO_WritePin(GPIOA, CS, GPIO_PIN_SET);
61
}

Das ganze gibt ein A aus.
lg Motze
Gast #4226770
Lesenswert?

Lege dir einen Zeichensatz an, den du dann nur zur Ausgabe ausgibst:
1
//Schrift der Größe 8
2
const char font8[115][8]=
3
{
4
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},  // 0x00 Space
5
  {0x00,0x10,0x1C,0x1F,0x1C,0x10,0x00,0x00},  // 0x10 Pfeil rechts
6
  {0x00,0x01,0x07,0x1F,0x07,0x01,0x00,0x00},  // 0x11  Pfeil Links
7
  {0x00,0x04,0x04,0x0E,0x0E,0x1F,0x00,0x00},  // 0x1E Pfeil oben
8
  {0x00,0x1F,0x0E,0x0E,0x04,0x04,0x00,0x00},  // 0x1F Pfeil unten
9
  {0x04,0x04,0x04,0x04,0x00,0x04,0x00,0x00},  // 0x21 !
10
  {0x0A,0x0A,0x00,0x00,0x00,0x00,0x00,0x00},  // 0x22 "
11
  {0x00,0x05,0x1F,0x0A,0x1F,0x14,0x00,0x00},  // 0x23 #
12
  {0x04,0x0E,0x0C,0x04,0x06,0x0E,0x04,0x00},  // 0x24 $
13
  {0x09,0x15,0x0E,0x0E,0x15,0x12,0x00,0x00},  // 0x25 %
14
  {0x04,0x0A,0x0C,0x15,0x12,0x0D,0x00,0x00},  // 0x26 &
15
  {0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00},  // 0x27 '
16
  {0x03,0x04,0x08,0x08,0x08,0x04,0x03,0x00},  // 0x28 (
17
  {0x18,0x04,0x02,0x02,0x02,0x04,0x18,0x00},  // 0x29 )
18
  {0x04,0x0A,0x04,0x0A,0x00,0x00,0x00,0x00},  // 0x2A *
19
  {0x00,0x00,0x00,0x04,0x0E,0x04,0x00,0x00},  // 0x2B +
20
  {0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x08},  // 0x2C ,
21
  {0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00},  // 0x2D -
22
  {0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00},  // 0x2E .
23
  {0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x00},  // 0x2F /
24
  {0x06,0x09,0x09,0x09,0x09,0x06,0x00,0x00},  // 0x30 0
25
  {0x04,0x0C,0x04,0x04,0x04,0x0E,0x00,0x00},  // 0x31 1
26
  {0x0C,0x02,0x02,0x04,0x08,0x0E,0x00,0x00},  // 0x32 2
27
  {0x0C,0x02,0x0C,0x02,0x02,0x0C,0x00,0x00},  // 0x33 3
28
  {0x02,0x06,0x0A,0x0F,0x02,0x02,0x00,0x00},  // 0x34 4
29
  {0x0E,0x08,0x0C,0x02,0x02,0x0C,0x00,0x00},  // 0x35 5
30
  {0x06,0x08,0x0E,0x09,0x09,0x06,0x00,0x00},  // 0x36 6
31
  {0x0F,0x01,0x02,0x04,0x04,0x04,0x00,0x00},  // 0x37 7
32
  {0x06,0x09,0x06,0x09,0x09,0x06,0x00,0x00},  // 0x38 8
33
  {0x06,0x09,0x09,0x07,0x01,0x06,0x00,0x00},  // 0x39 9
34
  {0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00},  // 0x3A :
35
  {0x00,0x00,0x04,0x00,0x00,0x04,0x04,0x08},  // 0x3B ;
36
  {0x00,0x01,0x02,0x0C,0x02,0x01,0x00,0x00},  // 0x3C <
37
  {0x00,0x00,0x0F,0x00,0x0F,0x00,0x00,0x00},  // 0x3D =
38
  {0x00,0x08,0x04,0x03,0x04,0x08,0x00,0x00},  // 0x3E >
39
  {0x0E,0x01,0x02,0x04,0x00,0x04,0x00,0x00},  // 0x3F ?
40
  {0x06,0x09,0x13,0x15,0x17,0x10,0x0F,0x00},  // 0x40 @
41
  {0x00,0x04,0x0A,0x0A,0x1F,0x11,0x00,0x00},  // 0x41 A
42
  {0x00,0x0E,0x0A,0x0C,0x0A,0x0E,0x00,0x00},  // 0x42 B
43
  {0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00},  // 0x43 C
44
  {0x00,0x0E,0x09,0x09,0x09,0x0E,0x00,0x00},  // 0x44 D
45
  {0x00,0x0E,0x08,0x0E,0x08,0x0E,0x00,0x00},  // 0x45 E
46
  {0x00,0x0E,0x08,0x0E,0x08,0x08,0x00,0x00},  // 0x46 F
47
  {0x00,0x07,0x08,0x0B,0x09,0x07,0x00,0x00},  // 0x47 G
48
  {0x00,0x09,0x09,0x0F,0x09,0x09,0x00,0x00},  // 0x48 H
49
  {0x00,0x0E,0x04,0x04,0x04,0x0E,0x00,0x00},  // 0x49 I
50
  {0x00,0x0E,0x02,0x02,0x02,0x0C,0x00,0x00},  // 0x4A J
51
  {0x00,0x09,0x0A,0x0C,0x0A,0x09,0x00,0x00},  // 0x4B K
52
  {0x00,0x08,0x08,0x08,0x08,0x0F,0x00,0x00},  // 0x4C L
53
  {0x00,0x11,0x1B,0x15,0x15,0x11,0x00,0x00},  // 0x4D M
54
  {0x00,0x09,0x0D,0x0B,0x09,0x09,0x00,0x00},  // 0x4E N
55
  {0x00,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},  // 0x4F O
56
  {0x00,0x0E,0x09,0x0E,0x08,0x08,0x00,0x00},  // 0x50 P
57
  {0x00,0x0E,0x11,0x11,0x11,0x0E,0x02,0x01},  // 0x51 Q
58
  {0x00,0x0C,0x0A,0x0C,0x0A,0x09,0x00,0x00},  // 0x52 R
59
  {0x00,0x06,0x08,0x04,0x02,0x0C,0x00,0x00},  // 0x53 S
60
  {0x00,0x1F,0x04,0x04,0x04,0x04,0x00,0x00},  // 0x54 T
61
  {0x00,0x09,0x09,0x09,0x09,0x06,0x00,0x00},  // 0x55 U
62
  {0x00,0x09,0x09,0x09,0x06,0x06,0x00,0x00},  // 0x56 V
63
  {0x00,0x11,0x15,0x15,0x0A,0x0A,0x00,0x00},  // 0x57 W
64
  {0x00,0x11,0x0A,0x04,0x0A,0x11,0x00,0x00},  // 0x58 X
65
  {0x00,0x11,0x0A,0x04,0x04,0x04,0x00,0x00},  // 0x59 Y
66
  {0x00,0x0F,0x01,0x06,0x08,0x0F,0x00,0x00},  // 0x5A Z
67
  {0x06,0x04,0x04,0x04,0x04,0x04,0x06,0x00},  // 0x5B [
68
  {0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},  // 0x5C Backwardslash
69
  {0x0C,0x04,0x04,0x04,0x04,0x04,0x0C,0x00},  // 0x5D ]
70
  {0x04,0x0A,0x0A,0x11,0x11,0x00,0x00,0x00},  // 0x5E ^
71
  {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00},  // 0x5F _
72
  {0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00},  // 0x60 `
73
  {0x00,0x00,0x0C,0x02,0x0E,0x0F,0x00,0x00},  // 0x61 a
74
  {0x08,0x08,0x0E,0x09,0x09,0x0E,0x00,0x00},  // 0x62 b
75
  {0x00,0x00,0x06,0x08,0x08,0x06,0x00,0x00},  // 0x63 c
76
  {0x02,0x02,0x0E,0x12,0x12,0x0E,0x00,0x00},  // 0x64 d
77
  {0x00,0x00,0x04,0x0E,0x08,0x06,0x00,0x00},  // 0x65 e
78
  {0x03,0x04,0x0F,0x04,0x04,0x04,0x00,0x00},  // 0x66 f
79
  {0x00,0x00,0x07,0x09,0x0F,0x01,0x0E,0x00},  // 0x67 g
80
  {0x08,0x08,0x0A,0x0D,0x09,0x09,0x00,0x00},  // 0x68 h
81
  {0x04,0x00,0x0C,0x04,0x04,0x04,0x00,0x00},  // 0x69 i
82
  {0x02,0x00,0x0E,0x02,0x02,0x02,0x0C,0x00},  // 0x6A j
83
  {0x08,0x08,0x0A,0x0C,0x0A,0x09,0x00,0x00},  // 0x6B k
84
  {0x0C,0x04,0x04,0x04,0x04,0x04,0x00,0x00},  // 0x6C l
85
  {0x00,0x00,0x15,0x1F,0x15,0x15,0x00,0x00},  // 0x6D m
86
  {0x00,0x00,0x0A,0x0D,0x09,0x09,0x00,0x00},  // 0x6E n
87
  {0x00,0x00,0x06,0x09,0x09,0x06,0x00,0x00},  // 0x6F o
88
  {0x00,0x00,0x0E,0x09,0x09,0x0E,0x08,0x00},  // 0x70 p
89
  {0x00,0x00,0x0E,0x12,0x12,0x0E,0x02,0x00},  // 0x71 q
90
  {0x00,0x00,0x0A,0x0C,0x08,0x08,0x00,0x00},  // 0x72 r
91
  {0x00,0x00,0x06,0x0C,0x02,0x0C,0x00,0x00},  // 0x73 s
92
  {0x00,0x04,0x0F,0x04,0x04,0x02,0x00,0x00},  // 0x74 t
93
  {0x00,0x00,0x09,0x09,0x0B,0x05,0x00,0x00},  // 0x75 u
94
  {0x00,0x00,0x09,0x09,0x06,0x06,0x00,0x00},  // 0x76 v
95
  {0x00,0x00,0x15,0x15,0x0E,0x0A,0x00,0x00},  // 0x77 w
96
  {0x00,0x00,0x09,0x06,0x06,0x09,0x00,0x00},  // 0x78 x
97
  {0x00,0x00,0x09,0x09,0x06,0x06,0x1C,0x00},  // 0x79 y
98
  {0x00,0x00,0x0E,0x06,0x08,0x0E,0x00,0x00},  // 0x7A z
99
  {0x02,0x04,0x04,0x08,0x04,0x04,0x02,0x00},  // 0x7B {
100
  {0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},  // 0x7C |
101
  {0x08,0x04,0x04,0x02,0x04,0x04,0x08,0x00},  // 0x7D }
102
  {0x00,0x00,0x00,0x0D,0x12,0x00,0x00,0x00},  // 0x7E ~
103
  {0x09,0x00,0x09,0x09,0x0B,0x05,0x00,0x00},  // 0x81 ü
104
  {0x0A,0x00,0x0C,0x02,0x0E,0x0F,0x00,0x00},  // 0x84 ä
105
  {0x0A,0x04,0x0A,0x0A,0x1F,0x11,0x00,0x00},  // 0x8E Ä
106
  {0x09,0x00,0x06,0x09,0x09,0x06,0x00,0x00},  // 0x94 ö
107
  {0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},  // 0x99 Ö
108
  {0x12,0x09,0x09,0x09,0x09,0x06,0x00,0x00},  // 0x9A Ü
109
  {0x00,0x01,0x06,0x0B,0x0D,0x06,0x08,0x00},  // 0x9B o Durchmesser
110
  {0x00,0x05,0x0A,0x14,0x0A,0x05,0x00,0x00},  // 0xAE >>
111
  {0x00,0x14,0x0A,0x05,0x0A,0x14,0x00,0x00},  // 0xAF <<
112
  {0x04,0x0A,0x0A,0x0A,0x09,0x0A,0x00,0x00},  // 0xE1 ß
113
  {0x00,0x00,0x09,0x09,0x0B,0x0D,0x08,0x00},  // 0xE6 micro
114
  {0x00,0x00,0x04,0x0E,0x04,0x0E,0x00,0x00},  // 0xF1 +-
115
  {0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00},  // 0xF8 °
116
  {0x0C,0x04,0x04,0x04,0x0E,0x00,0x00,0x00},  // 0xFB hoch 1
117
  {0x0C,0x02,0x0C,0x02,0x0C,0x00,0x00,0x00},  // 0xFC ³
118
  {0x0C,0x02,0x04,0x08,0x0E,0x00,0x00,0x00},  // 0xFD ²
119
};
Gast #4226807
Lesenswert?

So jetzt habe ich die Tabelle mal nur mit einem A gemacht aber wie frage 
ich die Werte in der Tabelle am besten ab.

meine aktuelle lösung ist:
1
const char font8[1][8]=
2
{
3
   {0x7F, 0x88, 0x88, 0x88, 0x7F} //A
4
};
5

6

7
for(i = 0; i < 8; i++)
8
{
9
   Write_Fast_Data(font8[1][i]);
10
}

leider funtkioniert das ganze noch nicht richtig.
Gast #4228313
Lesenswert?

So das mit den Zeichen ausgeben habe ich gerade gelöst. Leider ist es 
aber so das der Kontrast sehr schwach ist wenn ich die Oszillator 
Frequenz erhöhe vom TFT. Ich habe sie jetzt wieder herunter gesetzt. 
Jetzt flackert das TFT aber wieder. Kann es sein dass es ständig das 
Bild neu Aufbaut? Kann ich das abschalten und nur dann wenn sich was 
ändert neu aufbauen lassen?

mfg Motze
Gast #4229148
Lesenswert?

So Initialisire ich das Display.
1
        //software reset
2
  Write_Command(0x28, 0x00CE);
3
  //Driver Output Controll
4
  Write_Command(0x01, 0x011C);
5
  //Entry mode (Ausrihtung des Displays)
6
  Write_Command(0x03, 0x1010);
7
  
8
  //Display Controll
9
  Write_Command(0x07, 0x0017);
10
  HAL_Delay(50);
11
  
12
  //Power Controll 2
13
  Write_Command(0x11, 0x1000);
14
  //Ram Adresse Set
15
  Write_Command(0x20, 0x0000);
16
  Write_Command(0x21, 0x0000);
17
  HAL_Delay(50);
18
  
19
  //Gate Scan Controll
20
  Write_Command(0x30, 0x0000);
21
  //Vertical Scroll Controll 1
22
  Write_Command(0x31, 0x00DB);
23
  Write_Command(0x32, 0x0000);
24
  //Vertical Scroll Conttrll 1
25
  Write_Command(0x33, 0x0000);
26
  //Partial Screen Driving Position
27
  Write_Command(0x34, 0x00DB);
28
  Write_Command(0x35, 0x0000);
29
  //Horizontal and Vertical RAM Address Position
30
  Write_Command(0x36, 0x00AF);
31
  Write_Command(0x37, 0x0000);
32
  Write_Command(0x38, 0x00DB);
33
  Write_Command(0x39, 0x0000);
34
  HAL_Delay(50);
35
  
36
  //LCD Driving Waveform Control
37
  Write_Command(0x02, 0x0000);
38
  HAL_Delay(50);
39

40
  //Gamma Control
41
  Write_Command(0x50, 0x0000); 
42
  Write_Command(0x51, 0x0C05); 
43
  Write_Command(0x52, 0x0302); 
44
   Write_Command(0x53, 0x0007); 
45
   Write_Command(0x54, 0x0302); 
46
   Write_Command(0x55, 0x050C); 
47
   Write_Command(0x56, 0x0000); 
48
   Write_Command(0x57, 0x0700); 
49
   Write_Command(0x58, 0x1C00); 
50
   Write_Command(0x59, 0x001C); 
51

52
 
53
  //Ram Adresse Set
54
   Write_Command(0x20, 0x0000); 
55
   Write_Command(0x21, 0x0000);
56
  
57
  //Display Control 1
58
   Write_Command(0x07, 0x0012);
59
  HAL_Delay(200);
60
  //Display Control 1
61
   Write_Command(0x07, 0x1017); 
62
  //Oszillator
63
  //Write_Command(0x0D, 0x0F01); 
64
  HAL_Delay(80);

Wie kann ich den Kontrast verändern und das Flackern stoppen?

mfg Motze
Gast #4229417
Lesenswert?

Ne habe ich noch nicht gemessen werde ich aber morgen mal machen.
Was ich halt bemerkt habe ist das, wenn ich die Oszillatorfrequenz 
erhöht habe, das Flackern aufgehört hat.
Leider der Kontrast dadurch schlechter wurde.
Mir kommt es so vor dass das Bild permanent aufgebaut wird und dadurch 
der Kontrast flöhten geht.
Kann ich das Bild nicht einmal aufbauen und erst wenn sich was änderte 
dann wieder aufbauen?

mfg Motze
Persönliche Seite #4229468
Lesenswert?

Motze schrieb:
> Kann ich das Bild nicht einmal aufbauen und erst wenn sich was änderte
> dann wieder aufbauen?

Selbstverständlich. Eigentlich macht man das immer so. Oder noch besser: 
Du überschreibst nur die Änderungen und baust das Bild nicht komplett 
neu auf.

Natürlich kommen dadurch ein paar Programm-Zeilen hinzu, aber von Nix 
kommt nix. ;-)

Zumindest habe ich das so gemacht. Bibliotheken sind so 'ne Sache: Ich 
musste damals eine Tortengrafik aktualisieren und nur die Änderungen neu 
zeichnen. Da hatte ich nichts Fertiges gefunden.
Gast #4229777
Lesenswert?

Hi weist du auch welches Register ich verändern muss? Habe jetzt mit 
fast allen rumgespielt, leider ohne Erfolg.
Aber der Kontrast ist jetzt besser geworden durch das Register:
1
Write_Command(0x10, 0x0F00); 
2
Write_Command(0x13, 0x002A);

Beim zweiten bin ich mir nicht sicher ob ich das richtig eingestellt 
habe.
Mein TFT läuft mit 3.3V.

mfg Motze
Persönliche Seite #4230179
Lesenswert?

Torsten C. schrieb:
> Kontrast: In Grenzen mit Gamma Control.
Motze schrieb:
> Hi weist du auch welches Register ich verändern muss?
Du hast doch selbst geschrieben:
> //Gamma Control
>   Write_Command(0x50, 0x0000);
>   Write_Command(0x51, 0x0C05);
>   Write_Command(0x52, 0x0302);
>   Write_Command(0x53, 0x0007);
>   …

Hast Du mal ins Datenblatt geschaut und nach "Gamma" gesucht?

Ich habe für meine Displays eine kleine Anwendung geschrieben, um die 
RGB-Werte zu optimieren und Gamma optimal einzustellen. Da die optimalen 
Werte von Glas zu Glas unterschiedlich sind, kann Dir niemand die Werte 
für Dein Exemplar sagen.

Motze schrieb:
> Mein TFT läuft mit 3.3V.

Wenn Ripple drauf ist, dann wie oben gesagt …

Eventuell umlöten und Backlight über 5V versorgen oder einen fetten 
Kondensator an die 3,3V. Hast Du denn mal gemessen, ob Ripple drauf ist?
Angehängte Dateien:
Gast #4742710
Lesenswert?

Hi,
ich habe ein ähnliches setup mit STM32F411 und dem ILI9225 TFT. Ich 
bekomme das Ding aber nicht zum laufen. Könnte jemand die Funktion 
"Write_Command(xx, xx);" posten? Ich bin mir nicht sicher ob ich die 
Bytes richtig raus schiebe.
Schon mal Danke!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren