首页 > 其他分享 >配置GT9157触摸屏,获取触摸位置

配置GT9157触摸屏,获取触摸位置

时间:2023-10-15 17:22:04浏览次数:40  
标签:触摸 GT9157 Init GTP 触摸屏 InitStructure GPIO I2C EXTI

触摸IC为GT9157

1.配置触摸屏引脚

VDD SCL SDA RST INT GND
电源 I2C 时钟 I2C数据 屏幕复位 屏幕触摸信号
static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;  
  /*I2C Periph clock enable*/
  RCC_APB1PeriphClockCmd(GTP_I2C_CLK, ENABLE);
  /*GTP_I2C_SCL_GPIO_CLK and GTP_I2C_SDA_GPIO_CLK Periph clock enable */
  RCC_AHB1PeriphClockCmd(GTP_I2C_SCL_GPIO_CLK | GTP_I2C_SDA_GPIO_CLK|GTP_RST_GPIO_CLK|GTP_INT_GPIO_CLK, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//配置中断

    /*配置SCL引脚 */   
    GPIO_InitStructure.GPIO_Pin = GTP_I2C_SCL_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GTP_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);

    /*配置SDA引脚 */
    GPIO_InitStructure.GPIO_Pin = GTP_I2C_SDA_PIN;
    GPIO_Init(GTP_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);


  /*RST */   
  GPIO_InitStructure.GPIO_Pin = GTP_RST_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  GPIO_Init(GTP_RST_GPIO_PORT, &GPIO_InitStructure);
  
  /*INT */   
  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;       //设置为下拉,方便初始化
  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);

}
void BSP_EXTI_INT(void)
{
    /*Configure the I/O in input mode using GPIO_Init()*/
    /*Select the input source pin for the EXTI line using SYSCFG_EXTILineConfig()
    SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx
    registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    SYSCFG_EXTILineConfig(GTP_INT_EXTI_PORTSOURCE,GTP_INT_EXTI_PINSOURCE);
    /*Select the mode(interrupt, event) and configure the trigger 
       selection (Rising, falling or both) using EXTI_Init()*/
    EXTI_InitTypeDef EXTI_Init_Struct;
    EXTI_Init_Struct.EXTI_Line = EXTI_Line13;
    EXTI_Init_Struct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_Init_Struct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init_Struct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_Init_Struct);
    /*Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init()*/
    NVIC_InitTypeDef NVIC_Init_Struct;
    NVIC_Init_Struct.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_Init_Struct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_Init_Struct.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init_Struct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_Init_Struct);
}
void I2C_ResetChip(void)
{
	  GPIO_InitTypeDef GPIO_InitStructure;
	  /*!< Configure INT */
	  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;       //设置为下拉,方便初始化
	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
	  /*初始化GT9157,rst为高电平,int为低电平,则gt9157的设备地址被配置为0xBA*/
	  /*复位为低电平,为初始化做准备*/
	  GPIO_ResetBits (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
	  Delay(0x0FFFFF);
	  /*拉高一段时间,进行初始化*/
	  GPIO_SetBits (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN);
	  Delay(0x0FFFFF);
	  /*重新把INT引脚设置为浮空输入模式*/
	  /*!< Configure INT */
	  GPIO_InitStructure.GPIO_Pin = GTP_INT_GPIO_PIN;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
	  GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
      BSP_EXTI_INT();
}
void I2C_Touch_Init(void)
{
  I2C_GPIO_Config(); 
  I2C_ResetChip();
}

2.编写软件I2C读写函数

/*IIC软件时序*/
static void i2c_Delay(void)
{
    int i;
	for (i = 0; i < 10*5; i++);
}
void i2c_Start(void)
{
	I2C_SDA_1();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
}
void i2c_Stop(void)
{
	I2C_SDA_0();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SDA_1();
}
void i2c_SendByte(uint8_t _ucByte)
{
	uint8_t i;
	for (i = 0; i < 8; i++)
	{		
		if (_ucByte & 0x80)
		{
			I2C_SDA_1();
		}
		else
		{
			I2C_SDA_0();
		}
		i2c_Delay();
		I2C_SCL_1();
		i2c_Delay();
		I2C_SCL_0();
		if (i == 7)
		{
			 I2C_SDA_1(); 
		}
		_ucByte <<= 1;
		i2c_Delay();
	}
}
uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;
	value = 0;
	for (i = 0; i < 8; i++)
	{
		value <<= 1;
		I2C_SCL_1();
		i2c_Delay();
		if (I2C_SDA_READ())
		{
			value++;
		}
		I2C_SCL_0();
		i2c_Delay();
	}
	return value;
}
uint8_t i2c_WaitAck(void)
{
	uint8_t re;

	I2C_SDA_1();
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
	if (I2C_SDA_READ())
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	I2C_SCL_0();
	i2c_Delay();
	return re;
}
void i2c_Ack(void)
{
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
	I2C_SDA_1();
}
void i2c_NAck(void)
{
	I2C_SDA_1();
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
}
/*IIC读写函数*/
#define I2C_DIR_WR	0		/* 写*/
#define I2C_DIR_RD	1		/* 读*/
uint32_t I2C_ReadBytes(uint8_t ClientAddr,uint8_t* pBuffer, uint16_t NumByteToRead)
{

    i2c_Start();

    i2c_SendByte(ClientAddr | I2C_DIR_RD);

    if (i2c_WaitAck() != 0)
    {
    }

    while(NumByteToRead) 
    {
            if(NumByteToRead == 1)
        {
        i2c_NAck();

        i2c_Stop();
        }

        *pBuffer = i2c_ReadByte();

        pBuffer++; 

        NumByteToRead--;

        i2c_Ack();
    }

    i2c_Stop();
    return 0;	/* 执行成功 */
}

uint32_t I2C_WriteBytes(uint8_t ClientAddr,uint8_t* pBuffer,  uint8_t NumByteToWrite)
{
    i2c_Stop();
    i2c_Start();
    i2c_SendByte(ClientAddr | I2C_DIR_WR);
    if (i2c_WaitAck() == 0)
    {
    }
    while(NumByteToWrite--)
    {
        i2c_SendByte(*pBuffer);
        if (i2c_WaitAck() != 0)
        {
        }
        pBuffer++;
    }
    i2c_Stop();
    return 0;
}

3.移植gt9xx.c

将编写好的软件IIC读写函数 加入到gt9xx.c中的I2C_Transfer( struct i2c_msg *msgs,int num)函数中

static int I2C_Transfer( struct i2c_msg *msgs,int num)
{
	int im = 0;
	int ret = 0;
	GTP_DEBUG_FUNC();
	for (im = 0; ret == 0 && im != num; im++)
	{
		if ((msgs[im].flags&I2C_M_RD))											//根据flag判断是读数据还是写数据
		{
			ret = I2C_ReadBytes(msgs[im].addr, msgs[im].buf, msgs[im].len);		//IIC读取数据
		} else
		{
			ret = I2C_WriteBytes(msgs[im].addr,  msgs[im].buf, msgs[im].len);	//IIC写入数据
		}
	}
	if(ret)
		return ret;
	return im;   		                                                        //正常完成的传输结构个数
}

 Goodix_TS_Work_Func(void) 函数是主要处理函数,获取触摸坐标

4.配置INT中断处理函数,在中断处调用Goodix_TS_Work_Func()

void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line13)==SET)
    {
        EXTI_ClearITPendingBit(EXTI_Line13);
        Goodix_TS_Work_Func();
    }
}

5 .触摸屏幕四个角,串口打印出坐标

 

标签:触摸,GT9157,Init,GTP,触摸屏,InitStructure,GPIO,I2C,EXTI
From: https://www.cnblogs.com/Yannnnnn/p/17765848.html

相关文章

  • 【触想智能】工业级触摸显示器的分类与应用分享
    工业级触摸显示器是具有触摸功能的工业显示器,常见的触摸方式有电容触摸和电阻触摸。它是应用在工业上的设备,和普通的显示器有着很大的区别。工业级触摸显示器由液晶触摸屏、功能主板、外壳三部分组成,结构用料一般都采用铝合金材质,散热、抗电磁干扰、耐高低温、防尘防水......
  • SI3262—高度集成的低功耗SOC13.56MHz读卡器芯片 自带触摸
    Si3262是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的外设。内核采用RISC-V......
  • 采集分析仪设计资料:437-带触摸显示的10路5Msps@18bit采集分析仪
    带触摸显示的10路5Msps@18bit采集分析仪 一、产品概述   本产品提供了多种传感器接入接口,支持多种类型传感器实时采集、处理、显示等功能。主处理器采用XC7Z100-FFG900芯片,具有444K逻辑单元和双核ARMCortex-A9MPCore处理器。PL部分得可编程逻辑可以实......
  • Si314 低功耗 14 通道电容触摸传感器,软硬件兼容替代GTX314L
    Si314是一款具有自动灵敏度校准功能的14通道电容传感器,其工作电压范围为1.8~5.5V。Si314设置休眠模式来节省功耗,此时,功耗电流为[email protected]。Si314各个感应通道可实现独立使能、校准、灵敏度调节,可以确保可靠性,且具有自适应滤波功能,以应对各种噪音和环境变化。I2C串行接......
  • Rockchip RK3399 - USB触摸屏接口驱动
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3----------------------------------......
  • Rockchip RK3399 - USB触摸屏接口驱动
    一、触摸屏接口分类触摸屏主要包括电阻触摸屏和电容触摸屏,这个我们在《linux驱动移植-LCD触摸屏设备驱动》中已经详细介绍了,这里不再重复介绍。在《linux驱动移植-LCD触摸屏设备驱动》这篇文章中我们介绍了SoCS3C2440触摸屏驱动的实现,对于S3C2440来说,其只支持四线电阻触摸屏。......
  • Si3262| 三合一低功耗MCU+NFC+防水的触摸按键SOC芯片
    Si3262是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的外设。内......
  • 437-带触摸显示的10路5Msps@18bit采集分析仪
    带触摸显示的10路5Msps@18bit采集分析仪  一、产品概述   本产品提供了多种传感器接入接口,支持多种类型传感器实时采集、处理、显示等功能。主处理器采用XC7Z100-FFG900芯片,具有444K逻辑单元和双核ARMCortex-A9MPCore处理器。PL部分得可编程逻辑可以......
  • SI3262 低功耗 SOC +13.56mhz刷卡+触摸三合一芯片,适用于智能锁方案
    Si3262是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的外设。内核......
  • 【触想智能】工业触摸显示器使用需要注意的事项分享
    工业触摸显示器顾名思义就是带有触摸功能的工业显示器。工业触摸显示器主要是应用在工业环境上的显示器,他们对环境的要求比较高,一般需要具备宽温宽压、防尘防水、抗电磁干扰等功能。目前工业触摸显示器已经被广泛应用在智能制造生产线、安防、城市交通、商业、金融、医疗、教......