STM32CubeIDE 触摸屏I2C GT9147

硬件:

STM32F407ZG + GT9147

其中: GT9147使用模拟I2C通讯SCL和SDA。

还有RST复位引脚。

INT中断引脚:为有效减轻主CPU负担,有触摸时GT9147才会通知主CPU读取坐标信息。

 

 

 

触摸屏类似矩阵键盘通过x和y确定点击位置。

STM32CubeIDE 触摸屏I2C GT9147_第1张图片

 

移植厂商触摸芯片GT9147驱动。

 

我们只需关心下面几个寄存器的值。

 

芯片状态寄存器,很关键。

STM32CubeIDE 触摸屏I2C GT9147_第2张图片

 

由于芯片支持最多5点触摸,故还需要读取下面每个触摸点的坐标数据。

STM32CubeIDE 触摸屏I2C GT9147_第3张图片

 

 

触摸扫描函数代码:

typedef struct{
	uint16_t touchnumber;
	uint16_t x[TOUCH_NUMBER];
	uint16_t y[TOUCH_NUMBER];
}Coordinates_TypeDef;

const uint16_t GT9147_TPX_TBL[5] =
{ GT_TP1_REG, GT_TP2_REG, GT_TP3_REG, GT_TP4_REG, GT_TP5_REG };
Coordinates_TypeDef Coordinates = {0};

uint8_t GT9147_ScanTouch(void)
{
	struct TouchStatus{
		uint8_t NumberOfTouch : 4;
		uint8_t HaveKey : 1;
		uint8_t ProximityValid : 1;
		uint8_t LargeDetect : 1;
		uint8_t BufferStatus : 1;
	};

	uint8_t i = 0;
	uint8_t temp[4] = {0};
	struct TouchStatus touch = {0};

	GT9147_RD_Reg(GT_GSTID_REG, (uint8_t*)&touch, 1);
	GT9147_WR_Reg(GT_GSTID_REG, temp, 1);

	memset(&Coordinates, 0, sizeof(Coordinates_TypeDef));
	if(touch.BufferStatus == 0) return 0;
	if(touch.NumberOfTouch > 5 || touch.NumberOfTouch == 0)	return 0;

	Coordinates.touchnumber = touch.NumberOfTouch;

	for(i = 0; i < touch.NumberOfTouch; i++)
	{
		GT9147_RD_Reg(GT9147_TPX_TBL[i], temp, 4);
		memcpy(&Coordinates.x[i], temp, 2);
		memcpy(&Coordinates.y[i], temp + 2, 2);
		//printf("i = %d, x = %d, y = %d\r\n", i, Coordinates.x[i], Coordinates.y[i]);
	}

	return 1;
}

 

 

 

测试代码:https://download.csdn.net/download/sudaroot/12594669

 

全篇完。

本人博客仅仅代表我个人见解方便记录成长笔记。

若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。

感谢~!

 

 

 

 

 

你可能感兴趣的:(STM32)