盼盼_dRglQm · 2 天前

【Mini-F5375-OB开发板评测】硬件I2C之触摸屏驱动GT911

【前言】
之前我驱动好了TFTLCD屏ST7789,接着驱动触摸屏GT911。在这一篇里,我将介绍如何初始化硬件IIC,并实现I2C的读写。以及GT911的驱动配置、读取他的触摸数据。
【管脚的选取】
1、开发板上已经有一个AT24C02连接到了PC6/PC7上,所以把GT911也连接到了这两个管脚之上,方面以后读取EEPROM做准备。
2、GT911的INT与RST,我选取就近的两个PC4/PC5,并做了宏定义如下:

// 触摸IC引脚和中断
#define GTP_RST_GPIO_PORT GPIOC
#define GTP_RST_GPIO_PIN GPIO_Pin_4
#define GTP_INT_GPIO_PORT GPIOC
#define GTP_INT_GPIO_PIN GPIO_Pin_5

【I2C】配置
1、我将他配置为I2C MASTER,并配置速度为100KHz

        /***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_Configure(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    I2C_InitTypeDef  I2C_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);

    I2C_StructInit(&I2C_InitStruct);
    I2C_InitStruct.I2C_Mode       = I2C_MODE_MASTER;
    I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;
    I2C_InitStruct.I2C_ClockSpeed = 100000;
    I2C_Init(I2C1, &I2C_InitStruct);

    I2C_TargetAddressConfig(I2C1, GT911_DIV_W);

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_4);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    I2C_Cmd(I2C1, ENABLE);
}

2、在GT911的初始化时,由于GT911的INT需要特殊的时序来配置I2C的地址,我配置驱动如下:

void GTP_Init(void)
{
    I2C_Configure();
    
  /*初始化gt9157的设备地址为0x28/0x29*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GTP_RST_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High;
    GPIO_Init(GTP_RST_GPIO_PORT,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    GPIO_Init(GTP_INT_GPIO_PORT,&GPIO_InitStructure);
    
    
    GPIO_ResetBits(GTP_INT_GPIO_PORT, GTP_INT_GPIO_PIN);
    GPIO_ResetBits(GTP_RST_GPIO_PORT, GTP_RST_GPIO_PIN);
    PLATFORM_DelayMS(100);
    
 /*复位为低电平,为初始化做准备*/
    GPIO_SetBits(GTP_INT_GPIO_PORT,GTP_INT_GPIO_PIN);
    PLATFORM_DelayMS(5);
    
    /*拉高一段时间,进行初始化*/
    GPIO_SetBits(GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
    PLATFORM_DelayMS(5);
    GPIO_ResetBits(GTP_INT_GPIO_PORT, GTP_INT_GPIO_PIN);
    PLATFORM_DelayMS(50);
    
    /*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
    
    GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    
    GPIO_Init(GTP_INT_GPIO_PORT,&GPIO_InitStructure);
    
  // 读取ID
  PLATFORM_DelayMS(100);
  uint8_t GTP_ID[4];
  GTXXXX_ReadReg(GT_PID_REG, GTP_ID, 4);
  printf("GTP_ID:%s\n", GTP_ID);

  // 写入配置表
  GTXXXX_WriteReg(GT_CFGS_REG, (uint8_t *)CTP_CFG_GT911, sizeof(CTP_CFG_GT911));
  PLATFORM_DelayMS(100);

 
  // 转换为软复位模式
  uint8_t _temp = 2; // 中间变量
  GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
  PLATFORM_DelayMS(100);

  _temp = 0; // 中间变量
  GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
}

3、同时编写写入GT911寄存器与读取寄存器的函数如下:

/***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_TxData_Polling(uint8_t *Buffer, uint8_t Length)
{
    uint8_t i = 0;

    for (i = 0; i < Length; i++)
    {
        I2C_SendData(I2C1, (uint8_t)Buffer[i]);
                
        while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
        {
        }
    }
}

/***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_RxData_Polling(uint8_t *Buffer, uint16_t Length)
{
    uint8_t i = 0;

    for (i = 0; i < Length; i++)
    {
        I2C_ReadCmd(I2C1);

        while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_RFNE))
        {
        }

        Buffer[i] = I2C_ReceiveData(I2C1);
    }
}



void GTXXXX_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
    uint8_t len;
    len = _ucLen;
  uint8_t sen_buf[2];
    sen_buf[0] = _usRegAddr>>8;
    sen_buf[1] = _usRegAddr & 0xFF;
    I2C_TxData_Polling((uint8_t *)&sen_buf, 0x02);
    I2C_TxData_Polling(_pRegBuf, len);
    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }

    I2C_GenerateSTOP(I2C1);

    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }
}

void GTXXXX_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
    
    uint8_t sen_buf[2];
    sen_buf[0] = _usRegAddr>>8;
    sen_buf[1] = _usRegAddr & 0xFF;
    I2C_TxData_Polling((uint8_t *)&sen_buf, 0x02);
    I2C_RxData_Polling((uint8_t *)_pRegBuf, _ucLen);

    I2C_GenerateSTOP(I2C1);

    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }
}

到此移植就基本完成。
完成代码如下:
GT911.c

/*
 * gt9xx.c
 *
 *  Created on: Mar 20, 2024
 *      Author: ZuoenDeng
 */
#include "gt911.h"
#include <stdio.h>

/*创建触摸结构体*/
Touch_Struct User_Touch;

// GT911驱动配置,默认使用第一份配置文件,如果屏幕异常,可尝试使用第二份
#if 1
const uint8_t CTP_CFG_GT911[] = {
    0x41, 0x20, 0x03, 0xE0, 0x01, 0x05, 0x3D, 0x00, 0x01, 0x08,
    0x1E, 0x05, 0x3C, 0x3C, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x1A, 0x1C, 0x1E, 0x14, 0x8A, 0x2A, 0x0C,
    0x2A, 0x28, 0xEB, 0x04, 0x00, 0x00, 0x01, 0x61, 0x03, 0x2C,
    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x14, 0x3C, 0x94, 0xC5, 0x02, 0x08, 0x00, 0x00, 0x04,
    0xB7, 0x16, 0x00, 0x9F, 0x1B, 0x00, 0x8B, 0x22, 0x00, 0x7B,
    0x2B, 0x00, 0x70, 0x36, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0E, 0x0C, 0x0A,
    0x08, 0x06, 0x04, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x24, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C,
    0x18, 0x16, 0x13, 0x12, 0x10, 0x0F, 0x0A, 0x08, 0x06, 0x04,
    0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0A, 0x00};
#else
const uint8_t CTP_CFG_GT911[] = {
    0x00, 0x20, 0x03, 0xE0, 0x01, 0x05, 0x0D, 0x00, 0x01, 0x08,
    0x28, 0x0F, 0x50, 0x32, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x2A, 0x0C,
    0x45, 0x47, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0x2D,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x64, 0x32, 0x00, 0x00,
    0x00, 0x28, 0x64, 0x94, 0xC5, 0x02, 0x07, 0x00, 0x00, 0x04,
    0x9C, 0x2C, 0x00, 0x8F, 0x34, 0x00, 0x84, 0x3F, 0x00, 0x7C,
    0x4C, 0x00, 0x77, 0x5B, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0E, 0x0C, 0x0A,
    0x08, 0x06, 0x04, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x16, 0x18, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21,
    0x22, 0x24, 0x13, 0x12, 0x10, 0x0F, 0x0A, 0x08, 0x06, 0x04,
    0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x24, 0x01};
#endif

        
        /***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_Configure(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    I2C_InitTypeDef  I2C_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);

    I2C_StructInit(&I2C_InitStruct);
    I2C_InitStruct.I2C_Mode       = I2C_MODE_MASTER;
    I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;
    I2C_InitStruct.I2C_ClockSpeed = 100000;
    I2C_Init(I2C1, &I2C_InitStruct);

    I2C_TargetAddressConfig(I2C1, GT911_DIV_W);

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_4);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    I2C_Cmd(I2C1, ENABLE);
}


/***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_TxData_Polling(uint8_t *Buffer, uint8_t Length)
{
    uint8_t i = 0;

    for (i = 0; i < Length; i++)
    {
        I2C_SendData(I2C1, (uint8_t)Buffer[i]);
                
        while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
        {
        }
    }
}

/***********************************************************************************************************************
  * @brief
  * @note   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void I2C_RxData_Polling(uint8_t *Buffer, uint16_t Length)
{
    uint8_t i = 0;

    for (i = 0; i < Length; i++)
    {
        I2C_ReadCmd(I2C1);

        while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_RFNE))
        {
        }

        Buffer[i] = I2C_ReceiveData(I2C1);
    }
}



void GTXXXX_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
    uint8_t len;
    len = _ucLen;
  uint8_t sen_buf[2];
    sen_buf[0] = _usRegAddr>>8;
    sen_buf[1] = _usRegAddr & 0xFF;
    I2C_TxData_Polling((uint8_t *)&sen_buf, 0x02);
    I2C_TxData_Polling(_pRegBuf, len);
    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }

    I2C_GenerateSTOP(I2C1);

    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }
}

void GTXXXX_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
    
    uint8_t sen_buf[2];
    sen_buf[0] = _usRegAddr>>8;
    sen_buf[1] = _usRegAddr & 0xFF;
    I2C_TxData_Polling((uint8_t *)&sen_buf, 0x02);
    I2C_RxData_Polling((uint8_t *)_pRegBuf, _ucLen);

    I2C_GenerateSTOP(I2C1);

    while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
    {
    }
}

void GTP_Init(void)
{
    I2C_Configure();
    
  /*初始化gt9157的设备地址为0x28/0x29*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GTP_RST_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High;
    GPIO_Init(GTP_RST_GPIO_PORT,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    GPIO_Init(GTP_INT_GPIO_PORT,&GPIO_InitStructure);
    
    
    GPIO_ResetBits(GTP_INT_GPIO_PORT, GTP_INT_GPIO_PIN);
    GPIO_ResetBits(GTP_RST_GPIO_PORT, GTP_RST_GPIO_PIN);
    PLATFORM_DelayMS(100);
    
 /*复位为低电平,为初始化做准备*/
    GPIO_SetBits(GTP_INT_GPIO_PORT,GTP_INT_GPIO_PIN);
    PLATFORM_DelayMS(5);
    
    /*拉高一段时间,进行初始化*/
    GPIO_SetBits(GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
    PLATFORM_DelayMS(5);
    GPIO_ResetBits(GTP_INT_GPIO_PORT, GTP_INT_GPIO_PIN);
    PLATFORM_DelayMS(50);
    
    /*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
    
    GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    
    GPIO_Init(GTP_INT_GPIO_PORT,&GPIO_InitStructure);
    
  // 读取ID
  PLATFORM_DelayMS(100);
  uint8_t GTP_ID[4];
  GTXXXX_ReadReg(GT_PID_REG, GTP_ID, 4);
  printf("GTP_ID:%s\n", GTP_ID);

  // 写入配置表
  GTXXXX_WriteReg(GT_CFGS_REG, (uint8_t *)CTP_CFG_GT911, sizeof(CTP_CFG_GT911));
  PLATFORM_DelayMS(100);

 
  // 转换为软复位模式
  uint8_t _temp = 2; // 中间变量
  GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
  PLATFORM_DelayMS(100);

  _temp = 0; // 中间变量
  GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);


}

/*
  功能:gt911触摸扫描,判断当前是否被触摸
  参数1:
*/
void GTXXXX_Scanf(void)
{
  uint8_t _temp; // 中间变量

  GTXXXX_ReadReg(GT_GSTID_REG, &_temp, 1); // 读取状态寄存器

  // 记录触摸状态
  User_Touch.Touch_State = _temp;
  User_Touch.Touch_Number = (User_Touch.Touch_State & 0x0f); // 获取触摸点数
  User_Touch.Touch_State = (User_Touch.Touch_State & 0x80);  // 触摸状态

  // 判断是否有触摸数据
  switch (User_Touch.Touch_State)
  {
  case TOUCH__NO: // 没有数据
    break;
  case TOUCH_ING: // 触摸中~后,有数据,并读出数据
    for (uint8_t i = 0; i < User_Touch.Touch_Number; i++)
    {
      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + X_L), &_temp, 1); // 读出触摸x坐标的低8位
      User_Touch.Touch_XY[i].X_Point = _temp;
      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + X_H), &_temp, 1); // 读出触摸x坐标的高8位
      User_Touch.Touch_XY[i].X_Point |= (_temp << 8);

      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + Y_L), &_temp, 1); // 读出触摸y坐标的低8位
      User_Touch.Touch_XY[i].Y_Point = _temp;
      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + Y_H), &_temp, 1); // 读出触摸y坐标的高8位
      User_Touch.Touch_XY[i].Y_Point |= (_temp << 8);

      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + S_L), &_temp, 1); // 读出触摸大小数据的低8位
      User_Touch.Touch_XY[i].S_Point = _temp;
      GTXXXX_ReadReg((GT_TPD_Sta + i * 8 + S_H), &_temp, 1); // 读出触摸大小数据的高8位
      User_Touch.Touch_XY[i].S_Point |= (_temp << 8);
    }

    _temp = 0;
    GTXXXX_WriteReg(GT_GSTID_REG, &_temp, 1); // 清除数据标志位
    break;
  }
}

void GTP911_Test(void)
{
  GTXXXX_Scanf(); // 不断扫描
  if (User_Touch.Touch_State == 0x80)
  {
    for (uint8_t i = 0; i < User_Touch.Touch_Number; i++)
    {
      printf("X : %d  ", User_Touch.Touch_XY[i].X_Point);
      printf("Y : %d  ", User_Touch.Touch_XY[i].Y_Point);
      printf("S : %d\r\n\r\n", User_Touch.Touch_XY[i].S_Point);
    }
    User_Touch.Touch_State = 0;
    User_Touch.Touch_Number = 0;
  }
}

GT911.h


#ifndef GT911_H_
#define GT911_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"
#include "hal_i2c.h"
    
/*
//引脚图:
SDA--PB13
SCL--PB14
INT--PC8
RST--PB5
*/
// 触摸IC引脚和中断
#define GTP_RST_GPIO_PORT GPIOC
#define GTP_RST_GPIO_PIN GPIO_Pin_4
#define GTP_INT_GPIO_PORT GPIOC
#define GTP_INT_GPIO_PIN GPIO_Pin_5
// #define GTP_INT_EXTI_IRQ EXTI4_IRQn //

/*I2C句柄*/
#define GT911_I2C I2C1

// 触摸IC设备地址
#define GT911_DIV_W 0x28
#define GT911_DIV_R 0x29

// GT911 部分寄存器定义
#define GT_CTRL_REG 0X8040  // GT911控制寄存器
#define GT_CFGS_REG 0X8047  // GT911配置起始地址寄存器
#define GT_CHECK_REG 0X80FF // GT911校验和寄存器
#define GT_PID_REG 0X8140   // GT911产品ID寄存器

#define GT_GSTID_REG 0X814E // GT911当前检测到的触摸情况,第7位是触摸标志位,低4位是触摸点数个数

#define GT_TPD_Sta 0X8150 // 触摸点起始数据地址
#define GT_TP1_REG 0X8150 // 第一个触摸点数据地址
#define GT_TP2_REG 0X8158 // 第二个触摸点数据地址
#define GT_TP3_REG 0X8160 // 第三个触摸点数据地址
#define GT_TP4_REG 0X8168 // 第四个触摸点数据地址
#define GT_TP5_REG 0X8170 // 第五个触摸点数据地址

#define GT_TOUCH_MAX 5 // 对于gt911,最多同时获取5个触摸点的数据

typedef enum
{
  X_L = 0,
  X_H = 1,
  Y_L = 2,
  Y_H = 3,
  S_L = 4,
  S_H = 5
} Data_XYS_P; // 数据X、Y、触摸大小数据偏移量

typedef enum
{
  TOUCH__NO = 0x00, // 没有触摸
  TOUCH_ING = 0x80  // 被触摸
} TOUCH_STATE_enum; // 触摸状态

typedef struct
{
  uint16_t X_Point; // X坐标
  uint16_t Y_Point; // Y坐标
  uint16_t S_Point; // 触摸点大小
} XY_Coordinate;    // 触摸点坐标

/*触摸结构体*/
typedef struct
{
  uint8_t Touch_State;                  // 触摸状态
  uint8_t Touch_Number;                 // 触摸数量
  XY_Coordinate Touch_XY[GT_TOUCH_MAX]; // 触摸的x坐标,对于gt911最多5个点的坐标
} Touch_Struct;                         // 触摸信息结构体

/*外部变量区*/
extern Touch_Struct User_Touch;

/*外部函数区*/
void GTP_Init(void);
void GTXXXX_Scanf(void);
void GTP911_Test(void);


#ifdef __cplusplus
}

#endif

#endif /* INC_GT9XX_H_ */

【测试】
在main主程序中添加gt911的初始化程序,并在while下面添加测试函数:

int main(void)
{
    PLATFORM_Init();
    GTP_Init();
      lcd_init();
        lcd_clear(BLUE);
        lcd_show_string(30, 100, 200, 30, (uint8_t *)("hello world"), 24, 0);
        lcd_show_string(20, 140, 200, 30, (uint8_t *)("Mini-F5375-OB"), 24, 0);

        lv_init();
      lv_port_disp_init();
        lv_example_label_1();
    while (1)
    {
            GTP911_Test();
            lv_timer_handler();
            PLATFORM_DelayMS(1);
    }
}

【测试效果】
下载程序后,连接串口监视器,触摸屏时,打印日志如下:
image.png
【总结】
这次我应用了MM32F5375的硬件I2C进行数据读写,成功的驱动了GT911,官方的示例提供了非常多的示例,根据他的示例,结合数据手册,可以快速的熟悉I2C的使用。同时也展示了如何驱动GT911的触摸屏的应用。

推荐阅读
关注数
0
文章数
18
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息