1 | void DisplayInit(){
|
2 | // Display D4 to D0
|
3 | GPIO_InitTypeDef GPIO_InitStruct;
|
4 | GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
|
5 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
|
6 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
7 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
8 | GPIO_Init(GPIOE, &GPIO_InitStruct);
|
9 |
|
10 | // Display D7 to D5
|
11 | GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
|
12 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
|
13 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
14 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
15 | GPIO_Init(GPIOB, &GPIO_InitStruct);
|
16 |
|
17 | // Display *Read | *Write | Data/Command
|
18 | GPIO_InitStruct.GPIO_Pin = LCD_WRITE | LCD_READ | LCD_DC;
|
19 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
|
20 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
21 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
22 | GPIO_Init(GPIOE, &GPIO_InitStruct);
|
23 |
|
24 | // Display *Reset
|
25 | GPIO_InitStruct.GPIO_Pin = LCD_RESET;
|
26 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
|
27 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
28 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
29 | GPIO_Init(GPIOC, &GPIO_InitStruct);
|
30 |
|
31 | //Touch Controller Chip Select
|
32 | GPIO_InitStruct.GPIO_Pin = TCH_CS; //Chip Select Init
|
33 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //Output
|
34 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
35 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
|
36 | GPIO_Init(GPIOE, &GPIO_InitStruct);
|
37 |
|
38 | // SETUP EXTERNAL INTERRUPT PIN
|
39 | GPIO_InitStruct.GPIO_Pin = TCH_INT; // Touch Interrupt
|
40 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // Input
|
41 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
42 | GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
|
43 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
|
44 | GPIO_Init(GPIOC, &GPIO_InitStruct);
|
45 |
|
46 | GPIO_SetBits(GPIOE, TCH_CS); // Touch Controller /Select
|
47 |
|
48 | // PWM Pin Alternate Function DISPLAY BACKLIGHT
|
49 | GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
|
50 | // PWM Output
|
51 | GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
|
52 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
|
53 | GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
|
54 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
|
55 | GPIO_Init(GPIOD, &GPIO_InitStruct);
|
56 |
|
57 | /****************************************************************/
|
58 | /* LCD Backlight PWM */
|
59 | /****************************************************************/
|
60 | TIM_TimeBaseInitTypeDef TIMER_InitStructure;
|
61 | TIMER_InitStructure.TIM_Prescaler = 2;
|
62 | TIMER_InitStructure.TIM_Period = 0;
|
63 | TIMER_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
64 | TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
65 | TIM_TimeBaseInit(TIM4, &TIMER_InitStructure);
|
66 |
|
67 | TIM_OCInitTypeDef TIM_OCInitStructure;
|
68 | TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
|
69 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
70 | TIM_OCInitStructure.TIM_Pulse = 0; // Set PWM duty cycle to 0%
|
71 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
|
72 | TIM_OC1Init(TIM4, &TIM_OCInitStructure); // OC1 -> Channel 1 -> PIN12, PORTD
|
73 | TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
|
74 |
|
75 | TIM_SetAutoreload(TIM4,2099); // Set PWM to 10kHz
|
76 | TIM_Cmd(TIM4, ENABLE); // enable timer / counter (timer4)
|
77 | TIM_ARRPreloadConfig(TIM4, DISABLE); // preload timer configuration
|
78 |
|
79 |
|
80 | /****************************************************************/
|
81 | /* LCD init */
|
82 | /****************************************************************/
|
83 |
|
84 | GPIO_ResetBits(GPIOC , LCD_RESET); // Enable the Reset
|
85 | GPIO_SetBits(GPIOE , LCD_READ); // Disable the Read mode
|
86 | GPIO_SetBits(GPIOE , LCD_WRITE); // Disable the Write mode
|
87 | GPIO_SetBits(GPIOE , LCD_DC); // Enable the Data mode
|
88 | delay(1200); // Wait 120ms
|
89 | GPIO_SetBits(GPIOC , LCD_RESET); // Disable the Reset
|
90 | delay(1200); // Wait 120ms
|
91 |
|
92 | LCD_Cmd(CMD_SOFTRESET); // Soft Reset
|
93 | delay(100); // delay 10ms
|
94 | LCD_Cmd(CMD_DISPOFF); // display off
|
95 | LCD_Cmd(CMD_SLPOUT); // exit SLEEP mode
|
96 | LCD_Cmd(CMD_PWR_CTRL_A); // power control A
|
97 | LCD_Data(0x39);
|
98 | LCD_Data(0x2C);
|
99 | LCD_Data(0x00);
|
100 | LCD_Data(0x34);
|
101 | LCD_Data(0x02);
|
102 | LCD_Cmd(CMD_PWR_CTRL_B); //power control B
|
103 | LCD_Data(0x00);
|
104 | LCD_Data(0x81);
|
105 | LCD_Data(0x30);
|
106 | LCD_Cmd(CMD_PWR_CTRL_1);
|
107 | LCD_Data(0x26); //power control 1
|
108 | LCD_Data(0x04); //second param for ILI9340 (ignored by ILI9341)
|
109 | LCD_Cmd(CMD_PWR_CTRL_2);
|
110 | LCD_Data(0x11); //power control 2
|
111 | LCD_Cmd(CMD_VCOM_CTRL_1);
|
112 | LCD_Data(0x35);
|
113 | LCD_Data(0x3E); //VCOM control 1
|
114 | LCD_Cmd(CMD_MEM_ACC_CTRL);
|
115 | LCD_Data(0xA8); //memory access control = BGR and flip col&add
|
116 | LCD_Cmd(CMD_FRAME_RATE_CTRL);
|
117 | LCD_Data(0x00);
|
118 | LCD_Data(0x18); //frame rate control
|
119 | LCD_Cmd(CMD_DISP_FUNC_CTRL);
|
120 | LCD_Data(0x0A);
|
121 | LCD_Data(0xA2); //display function control
|
122 | LCD_Cmd(CMD_VCOM_CTRL_2);
|
123 | LCD_Data(0xBE); //VCOM control 2
|
124 | LCD_Cmd(CMD_PIXEL_FORMAT);
|
125 | LCD_Data(0x55); //pixel format = 16 bit per pixel
|
126 | LCD_Cmd(GAMMA_CONTROL); //3g gamma control
|
127 | LCD_Data(0x02); //off
|
128 | LCD_Cmd(GAMMA_CURVE); //gamma curve 3
|
129 | LCD_Data(0x01);
|
130 | LCD_Cmd(COLUMN_ADDRESS);
|
131 | LCD_Data(0x00); //column address set
|
132 | LCD_Data(0x00); //start 0x0000
|
133 | LCD_Data(0x00);
|
134 | LCD_Data(0xEF); //end 0x00EF
|
135 | LCD_Cmd(PAGE_ADDRESS);
|
136 | LCD_Data(0x00); //page address set
|
137 | LCD_Data(0x00); //start 0x0000
|
138 | LCD_Data(0x01);
|
139 | LCD_Data(0x3F); //end 0x003F
|
140 | LCD_Cmd(CMD_MEM_ACC_CTRL);
|
141 | LCD_Data(CMD_MEM_ACC_DATA);
|
142 | LCD_Cmd(CMD_PIXEL_FORMAT);
|
143 | LCD_Data(0xC5);
|
144 | LCD_Cmd(CMD_DISPON); //display ON
|
145 | delay(100); // Wait 10ms
|
146 |
|
147 | LCD_Fill(WHITE); // Draw Background
|
148 |
|
149 | /****************************************************************/
|
150 | /* Touch SPI + Interrupt Init */
|
151 | /****************************************************************/
|
152 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI Touch Controller
|
153 | //Set SPI Pins as Alternate Function
|
154 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); //Connect SPI Pin CLK to SPI1
|
155 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); //Connect SPI Pin MOSI to SPI1
|
156 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); //Connect SPI Pin MISO to SPI1
|
157 |
|
158 | GPIO_InitStruct.GPIO_Pin = TCH_CLK | TCH_MISO | TCH_MOSI; // CLK | MISO
|
159 | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
|
160 | GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Alternative Function -> SPI
|
161 | GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
|
162 | GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
163 | GPIO_Init(GPIOA, &GPIO_InitStruct);
|
164 |
|
165 | //SPI Communication Init
|
166 | SPI_InitTypeDef SPI_InitStruct;
|
167 | SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //656.25kHz (84MHz/128)
|
168 | SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //Full Duplex
|
169 | SPI_InitStruct.SPI_Mode = SPI_Mode_Master; //Master
|
170 | SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; //8bit
|
171 | SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; //Software Chip Select
|
172 | SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; //MSB first
|
173 | SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; //Clock Idle High
|
174 | SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; //2nd Edge -> L->H -> Rising edge
|
175 | SPI_Init(SPI1, &SPI_InitStruct); //Setup SPI1
|
176 | SPI_Cmd(SPI1, ENABLE); //Enable SPI1
|
177 |
|
178 | RESTART_SPI:
|
179 |
|
180 | TscWrite (STMPE811_SPI_CFG, 1, STMPE811_SPI_MODE_1 | STMPE811_AUTO_INCR);//STMPE811_SPI_MODE_2 | STMPE811_AUTO_INCR); //MODE 1 and 2 WORKS
|
181 |
|
182 | TscRead(STMPE811_CHIP_ID, 2); // read chip ID
|
183 | if((SPI_Buffer[0] != 0x08)) // if not good -> big problem
|
184 | {
|
185 | goto RESTART_SPI;
|
186 | }
|
187 | if((SPI_Buffer[1] != 0x11)){
|
188 | goto RESTART_SPI;
|
189 | }
|
190 |
|
191 | // Enable TSC,and set TSC operating mode is X, Y only.
|
192 | TscWrite (STMPE811_TSC_CTRL, 1, STMPE811_TSC_CTRL_EN | STMPE811_TSC_CTRL_XY);
|
193 | // Enable TSC and ADC
|
194 | TscWrite (STMPE811_SYS_CTRL2, 1, STMPE811_CTRL2_TS_OFF |
|
195 | STMPE811_CTRL2_GPIO_OFF);
|
196 | // Enable Touch detect, FIFO interrupt.
|
197 | TscWrite (STMPE811_INT_EN, 1, STMPE811_INT_EN_TOUCHDET |
|
198 | STMPE811_INT_EN_TH |
|
199 | STMPE811_INT_EN_FIFOOFLOW);
|
200 | // To select sample time, bit number and ADC reference.
|
201 | TscWrite (STMPE811_ADC_CTRL1, 1, ((0x06 & STMPE811_ADC_CTRL1_SAMPLE_M)
|
202 | << STMPE811_ADC_CTRL1_SAMPLE_S )|
|
203 | STMPE811_ADC_CTRL1_MOD);
|
204 | // To select the ADC clock speed is 3.25 MHz.
|
205 | TscWrite (STMPE811_ADC_CTRL2, 1, STMPE811_ADC_CTRL2_CLK1);
|
206 | // To set Average, Touch Detect Delay and Setting Time setting.
|
207 | TscWrite (STMPE811_TSC_CFG, 1,
|
208 | STMPE811_TSC_CFG_AVE_8|
|
209 | ((0x7 & STMPE811_TSC_CFG_DELAY_M) << STMPE811_TSC_CFG_DELAY_S)|
|
210 | ((0x1 & STMPE811_TSC_CFG_SETTING_M)
|
211 | << STMPE811_TSC_CFG_SETTING_S));
|
212 | // Set FIFO threshold level.
|
213 | TscWrite (STMPE811_FIFO_TH, 1, 0x01);
|
214 | // Reset FIFO.
|
215 | TscWrite (STMPE811_FIFO_STA, 1, STMPE811_FIFO_STA_RESET);
|
216 | // Write 0x00 to put the FIFO back into operation mode.
|
217 | TscWrite (STMPE811_FIFO_STA, 1, 0x00);
|
218 | // Set the data format for Z value.
|
219 | TscWrite (STMPE811_TSC_FRACTION_Z, 1,
|
220 | (0x07 * STMPE811_FRACTION_Z_M) << STMPE811_FRACTION_Z_S);
|
221 | // Set the driving capability of the device for touchscreen controller pins.
|
222 | TscWrite (STMPE811_TSC_I_DRIVE, 1, STMPE811_TSC_I_DRIVE_50);
|
223 | // Set tracking index, set touchscreen controller op. mode and enable TSC
|
224 |
|
225 | TscWrite (STMPE811_TSC_CTRL, 1,STMPE811_TSC_CTRL_EN |STMPE811_TSC_CTRL_XY);
|
226 | // Clear all the interrupt status.
|
227 | TscWrite (STMPE811_INT_STA, 1, 0xFF);
|
228 | // Set interrupt mode and enable interrupt.
|
229 | TscWrite (STMPE811_INT_CTRL, 1, STMPE811_INT_TYPE|
|
230 | STMPE811_INT_GLOBAL);
|
231 |
|
232 | //CHECK IF VALUES OF TC REGISTERS CORRECTLY WRITTEN
|
233 | TRYAGAIN:
|
234 | SPI_Buffer[0]=0;
|
235 | TscRead(STMPE811_ID_VER, 1); //Check SPI communication by asking for Chip ID x03
|
236 | if(SPI_Buffer[0]!= 0x03){
|
237 | goto TRYAGAIN;
|
238 | }
|
239 |
|
240 | // set display backlight
|
241 | uint16_t backlight = 0;
|
242 | while(backlight < 2100){
|
243 | backlight+=4;
|
244 | TIM_SetCompare1(TIM4, backlight); // Set duty cycle to 100%
|
245 | delay(10); //1ms
|
246 | }
|
247 | }
|