#define TP_IRQ_PORT GPIOA #define TP_IRQ_PIN (1<<10) #define TP_CLK_PORT GPIOB #define TP_CLK_PIN (1<<0) #define TP_MISO_PORT GPIOA #define TP_MISO_PIN (1<<12) #define TP_MOSI_PORT GPIOB #define TP_MOSI_PIN (1<<8) #define TP_CS_PORT GPIOB #define TP_CS_PIN (1<<1) #define CMD_RDX 0xD0 #define CMD_RDY 0x90 #define NO_OF_POSITION_SAMPLES 16 //Internal Touchpad command, do not call directly uint16_t TP_Readx(void) { uint8_t i = 16, a=0; uint16_t value = 0; while(i > 0x00) { value <<= 1; TP_CLK_PORT->BSRR=TP_CLK_PIN; _delay_us(50); TP_CLK_PORT->BSRR=TP_CLK_PIN<<16; _delay_us(50); if ((TP_MISO_PORT->IDR&TP_MISO_PIN)!=0) { value++; } i--; }; return value; } //Internal Touchpad command, do not call directly void TP_Writex(uint8_t value) { uint8_t i = 0x08,a=0; TP_CLK_PORT->BSRR=TP_CLK_PIN<<16; while(i > 0) { if((value & 0x80) != 0x00) { TP_MOSI_PORT->BSRR=TP_MOSI_PIN; } else { TP_MOSI_PORT->BSRR=TP_MOSI_PIN<<16; } value <<= 1; TP_CLK_PORT->BSRR=TP_CLK_PIN; _delay_us(50); TP_CLK_PORT->BSRR=TP_CLK_PIN<<16; _delay_us(50); i--; }; } bool ILI9341_TouchGetCoordinates(uint16_t* x, uint16_t* y) { static const uint8_t cmd_read_x[] = { READ_X }; static const uint8_t cmd_read_y[] = { READ_Y }; static const uint8_t zeroes_tx[] = { 0x00, 0x00 }; ILI9341_TouchSelect(); uint32_t avg_x = 0; uint32_t avg_y = 0; uint8_t nsamples = 0; for(uint8_t i = 0; i < 16; i++) { if(!ILI9341_TouchPressed()) break; nsamples++; TP_Writex(READ_Y); // HAL_SPI_Transmit(&ILI9341_TOUCH_SPI_PORT, (uint8_t*)cmd_read_y, sizeof(cmd_read_y), HAL_MAX_DELAY); uint8_t y_raw[2]; *y_raw= TP_Readx(); // HAL_SPI_TransmitReceive(&ILI9341_TOUCH_SPI_PORT, (uint8_t*)zeroes_tx, y_raw, sizeof(y_raw), HAL_MAX_DELAY); TP_Writex(READ_X); // HAL_SPI_Transmit(&ILI9341_TOUCH_SPI_PORT, (uint8_t*)cmd_read_x, sizeof(cmd_read_x), HAL_MAX_DELAY); uint8_t x_raw[2]; // HAL_SPI_TransmitReceive(&ILI9341_TOUCH_SPI_PORT, (uint8_t*)zeroes_tx, x_raw, sizeof(x_raw), HAL_MAX_DELAY); *x_raw= TP_Readx(); avg_x += (((uint16_t)x_raw[0]) << 8) | ((uint16_t)x_raw[1]); avg_y += (((uint16_t)y_raw[0]) << 8) | ((uint16_t)y_raw[1]); } ILI9341_TouchUnselect(); if(nsamples < 16) return false; uint32_t raw_x = (avg_x / 16); cursor_x=20; cursor_y=20; lcd_int(raw_x); if(raw_x < ILI9341_TOUCH_MIN_RAW_X) raw_x = ILI9341_TOUCH_MIN_RAW_X; if(raw_x > ILI9341_TOUCH_MAX_RAW_X) raw_x = ILI9341_TOUCH_MAX_RAW_X; uint32_t raw_y = (avg_y / 16); cursor_x=20; cursor_y=40; lcd_int(raw_y); if(raw_y < ILI9341_TOUCH_MIN_RAW_Y) raw_y = ILI9341_TOUCH_MIN_RAW_Y; if(raw_y > ILI9341_TOUCH_MAX_RAW_Y) raw_y = ILI9341_TOUCH_MAX_RAW_Y; // // Uncomment this line to calibrate touchscreen: UART_Printf("raw_x = %d, raw_y = %d\r\n", x, y); *x = (raw_x - ILI9341_TOUCH_MIN_RAW_X) * ILI9341_TOUCH_SCALE_X / (ILI9341_TOUCH_MAX_RAW_X - ILI9341_TOUCH_MIN_RAW_X); *y = (raw_y - ILI9341_TOUCH_MIN_RAW_Y) * ILI9341_TOUCH_SCALE_Y / (ILI9341_TOUCH_MAX_RAW_Y - ILI9341_TOUCH_MIN_RAW_Y); return true; }