STM Урок 72. Touch panel FT5336. Часть 2

 

 

 

 

Урок 72

 

Часть 2

 

Touch panel FT5336

 

 

В предыдущей части занятия мы настроили проект, написали некоторые служебные функции, а также функцию инициализации нашего тачскрина.

 

Отключим прерывания в микросхеме

 

  tsOrientation = TS_SWAP_XY;

  //Configure the FT5336 device to stop generating IT on the given INT pin

  regValue = (FT5336_G_MODE_INTERRUPT_POLLING & (FT5336_G_MODE_INTERRUPT_MASK >> FT5336_G_MODE_INTERRUPT_SHIFT)) << FT5336_G_MODE_INTERRUPT_SHIFT;

  TS_IO_Write(TS_I2C_ADDRESS, FT5336_GMODE_REG, regValue);

}

 

Занесём в структуру усешную инициализацию контроллера тачскрина

 

  TS_IO_Write(TS_I2C_ADDRESS, FT5336_GMODE_REG, regValue);

  ft5336_handle.i2cInitialized = FT5336_I2C_INITIALIZED;

}

 

На этом функция инициализации завершена.

Давайте немного отдохнём от библиотеки тачскрина и напишем заготовку для теста в бесконечном цикле функции main(). Мы не будем трогать никакие наши прошлые тесты, а добавим тест вначале цикла, мы будем висеть в этом тесте, пока не нажмём синюю кнопку. Для этого сначала напишем функцию отслеживания нажатия этой кнопки до функции записи файла Bmp в SDRAM

 

/* USER CODE BEGIN 0 */

uint8_t CheckForUserInput(void)

{

  if (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_11) != GPIO_PIN_RESET)

  {

    HAL_Delay(10);

    while (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_11) != GPIO_PIN_RESET);

    return 1 ;

  }

  return 0;

}

//---------------------------------------------------------------------------

uint32_t OpenBMP(uint8_t *ptr, const char* fname)

 

А вот теперь в бесконечном цикле напишем заготовку для нашего будущего теста

 

/* USER CODE BEGIN 3 */

//ts test

TFT_FillScreen(LCD_COLOR_BLACK);

TFT_SetFont(&Font20);

TFT_SetTextColor(LCD_COLOR_MAGENTA);

TFT_SetBackColor(LCD_COLOR_BLACK);

TFT_DisplayString(0, 5, (uint8_t *)"TS TEST", CENTER_MODE);

TFT_SetFont(&Font16);

TFT_SetTextColor(LCD_COLOR_DARKGREEN);

TFT_DisplayString(0, 27, (uint8_t *)"Click the custom button to continue", CENTER_MODE);

while(CheckForUserInput()==0)

{

  HAL_Delay(10);

}

TFT_FillScreen(LCD_COLOR_BLACK);

//вывод на экран отдельных символов

TFT_SetFont(&Font24);

 

Соберём код, запустим его и убедимся, что наша кнопка работает.

Добавим ещё одну структуру в файл ft5336.h

 

} ft5336_handle_TypeDef;

//------------------------------------------

typedef struct

{

  uint8_t touchDetected; /*!< Total number of active touches detected at last scan */

  uint16_t touchX[TS_MAX_NB_TOUCH]; /*!< Touch X[0], X[1] coordinates on 12 bits */

  uint16_t touchY[TS_MAX_NB_TOUCH]; /*!< Touch Y[0], Y[1] coordinates on 12 bits */

  uint8_t touchWeight[TS_MAX_NB_TOUCH]; /*!< Touch_Weight[0], Touch_Weight[1] : weight property of touches */

  uint8_t touchEventId[TS_MAX_NB_TOUCH]; /*!< Touch_EventId[0], Touch_EventId[1] : take value of type @ref TS_TouchEventTypeDef */

  uint8_t touchArea[TS_MAX_NB_TOUCH]; /*!< Touch_Area[0], Touch_Area[1] : touch area of each touch */

  uint32_t gestureId; /*!< type of gesture detected : take value of type @ref TS_GestureIdTypeDef */

} TS_StateTypeDef;

//------------------------------------------

 

Ещё добавим перечисление

 

} TS_StateTypeDef;

//------------------------------------------

typedef enum

{

  TS_OK = 0x00, /*!< Touch Ok */

  TS_ERROR = 0x01, /*!< Touch Error */

  TS_TIMEOUT = 0x02, /*!< Touch Timeout */

  TS_DEVICE_NOT_FOUND = 0x03 /*!< Touchscreen device not found */

}TS_StatusTypeDef;

//------------------------------------------

 

 

В файл ft5336.c добавим функцию считывания статуса тачскрина

 

//----------------------------------------

uint8_t TS_GetState(TS_StateTypeDef *TS_State)

{

  static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0};

  static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0};

  uint8_t ts_status = TS_OK;

  uint16_t x[TS_MAX_NB_TOUCH];

  uint16_t y[TS_MAX_NB_TOUCH];

  uint16_t brute_x[TS_MAX_NB_TOUCH];

  uint16_t brute_y[TS_MAX_NB_TOUCH];

  uint16_t x_diff;

  uint16_t y_diff;

  uint32_t index;

  uint32_t weight = 0;

  uint32_t area = 0;

  uint32_t event = 0;

}

//----------------------------------------

 

Добавим на данную функцию прототип в заголовочном файле, затем перейдём в файл main.c, увеличим размер глобальной строковой переменной и добавим ещё одну глобальную переменную

 

char str1[30];

static TS_StateTypeDef TS_State;

/* USER CODE END PV */

 

Продолжим наш тест и добавим туда вызов только что написанной функции и условие с телами

 

while(CheckForUserInput()==0)

{

  TS_GetState(&TS_State);

  if(TS_State.touchDetected)

  {

  }

  else

  {

  }

  HAL_Delay(10);

 

Вернёмся в файл ft5336.c и добавим в там функцию отслеживания использования тачскрина после функции чтения идентификатора 

 

//----------------------------------------

uint8_t TS_DetectTouch(uint16_t DeviceAddr)

{

  volatile uint8_t nbTouch = 0;

  nbTouch = TS_IO_Read(DeviceAddr, FT5336_TD_STAT_REG);

  nbTouch &= FT5336_TD_STAT_MASK;

  if(nbTouch > FT5336_MAX_DETECTABLE_TOUCH)

  {

    nbTouch = 0;

  }

  ft5336_handle.currActiveTouchNb = nbTouch;

  ft5336_handle.currActiveTouchIdx = 0;

  return (nbTouch);

}

//----------------------------------------

 

Вызовем её в функции TS_GetState, тем самым, если использование было, то запишем количество одновременных использований (сколько пальцев одновременно используют TS (давайте так будем в дальнейшем называть наш тачскрин)) в соответствующее поле структуры

 

  uint32_t event = 0;

  TS_State->touchDetected = TS_DetectTouch(TS_I2C_ADDRESS);

}

 

Дальше добавим условие обнаружения использования

 

TS_State->touchDetected = TS_DetectTouch(TS_I2C_ADDRESS);

if(TS_State->touchDetected)

{

}

 

Теперь пробежимся по нашему количеству одновременных использований TS

 

if(TS_State->touchDetected)

{

  for(index=0; index < TS_State->touchDetected; index++)

  {

  }

}

 

В следующей части занятия мы добавим две интересные функции сбора координат и другой информации действий с TS и воспользуемся ими в функции определения статуса.

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

 

Техническая документация на драйвер TS FT5336

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM Touch panel FT5336

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*