在线时间13 小时
UID3183111
注册时间2016-4-20
NXP金币0
TA的每日心情 | 奋斗 2022-10-24 09:14 |
---|
签到天数: 13 天 [LV.3]偶尔看看II
注册会员
- 积分
- 171
- 最后登录
- 2022-10-25
|
楼主 |
发表于 2022-5-5 23:15:15
|
显示全部楼层
本次更新一下触摸部分功能,完成了GT911的驱动,下面看下代码。
#include "fsl_common.h"
#include "fsl_lpi2c.h"
#include "fsl_gt911_rt.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "FreeRTOS.h"
#include "task.h"
GT911_Dev Dev_Now,Dev_Backup;
/*
*********************************************************************************************************
* 函 数 名: GT811_WriteReg
* 功能说明: 写1个或连续的多个寄存器
* 形 参: _usRegAddr : 寄存器地址
* _pRegBuf : 寄存器数据缓冲区
* _ucLen : 数据长度
* 返 回 值: 无
*********************************************************************************************************
*/
static int GT911_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
uint8_t i;
// i2c_Start(); /* 总线开始信号 */
// i2c_SendByte(g_GT811.i2c_addr); /* 发送设备地址+写信号 */
// i2c_WaitAck();
// i2c_SendByte(_usRegAddr >> 8); /* 地址高8位 */
// i2c_WaitAck();
// i2c_SendByte(_usRegAddr); /* 地址低8位 */
// i2c_WaitAck();
// for (i = 0; i < _ucLen; i++)
// {
// i2c_SendByte(_pRegBuf); /* 寄存器数据 */
// i2c_WaitAck();
// }
// i2c_Stop(); /* 总线停止信号 */
// i2c_Start(); /* 总线开始信号 */
// i2c_SendByte(GT_CMD_WR); /* 发送设备地址+写信号 */
// if (i2c_WaitAck() != 0)
// {
// goto cmd_fail;
// }
status_t reVal = kStatus_Fail;
uint8_t addr;
/* Send master blocking data to slave */
if (kStatus_Success != LPI2C_MasterStart(GT911_I2C, GT_CMD_WR, kLPI2C_Write)) //起始信号
{
return -1;
}
/* Check communicate with slave successful or not */
if (LPI2C_MasterGetStatusFlags(GT911_I2C) & kLPI2C_MasterNackDetectFlag) //等待应答
{
return kStatus_LPI2C_Nak;
}
addr = _usRegAddr>>8;
reVal = LPI2C_MasterSend(GT911_I2C, (uint8_t *)&addr, 1);
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
addr = _usRegAddr;
reVal = LPI2C_MasterSend(GT911_I2C, (uint8_t *)&addr, 1);
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
for (i = 0; i < _ucLen; i++)
{
reVal = LPI2C_MasterSend(GT911_I2C, &_pRegBuf, 1); //发送
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
}
reVal = LPI2C_MasterStop(GT911_I2C);
if (reVal != kStatus_Success)
{
return -1;
}
return 1;
}
static int GT911_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
int16_t i;
// i2c_Start(); /* 总线开始信号 */
// i2c_SendByte(GT_CMD_WR); /* 发送设备地址+写信号 */
// if (i2c_WaitAck() != 0)
// {
// goto cmd_fail;
// }
status_t reVal = kStatus_Fail;
uint8_t addr;
/* Send master blocking data to slave */
if (kStatus_Success != LPI2C_MasterStart(GT911_I2C, GT_CMD_WR, kLPI2C_Write)) //起始信号
{
return -1;
}
/* Check communicate with slave successful or not */
if (LPI2C_MasterGetStatusFlags(GT911_I2C) & kLPI2C_MasterNackDetectFlag) //等待应答
{
return kStatus_LPI2C_Nak;
}
//
// i2c_SendByte(_usRegAddr >> 8); /* 地址高8位 */
// if (i2c_WaitAck() != 0)
// {
// goto cmd_fail;
// }
addr = _usRegAddr>>8;
reVal = LPI2C_MasterSend(GT911_I2C, (uint8_t *)&addr, 1);
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
// i2c_SendByte(_usRegAddr); /* 地址低8位 */
// if (i2c_WaitAck() != 0)
// {
// goto cmd_fail;
// }
addr = _usRegAddr;
reVal = LPI2C_MasterSend(GT911_I2C, (uint8_t *)&addr, 1);
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
// i2c_Start();
// i2c_SendByte(g_GT811.i2c_addr + 0x01); /* 发送设备地址+读信号 */
// if (i2c_WaitAck() != 0)
// {
// goto cmd_fail;
// }
if (kStatus_Success != LPI2C_MasterStart(GT911_I2C, GT_CMD_WR, kLPI2C_Read)) { //起始信号
return -1;
}
/* Check communicate with slave successful or not */
if (LPI2C_MasterGetStatusFlags(GT911_I2C) & kLPI2C_MasterNackDetectFlag) //等待应答
{
return kStatus_LPI2C_Nak;
}
// for (i = 0; i < _ucLen - 1; i++)
// {
// _pRegBuf = i2c_ReadByte(); /* 读寄存器数据 */
// i2c_Ack();
// }
for (i = 0; i < _ucLen; i++)
{
reVal = LPI2C_MasterReceive(GT911_I2C, &_pRegBuf, 1); //接收
if (reVal != kStatus_Success)
{
if (reVal == kStatus_LPI2C_Nak)
{
LPI2C_MasterStop(GT911_I2C);
}
return -1;
}
}
//
// /* 最后一个数据 */
// _pRegBuf = i2c_ReadByte(); /* 读寄存器数据 */
// i2c_NAck();
// i2c_Stop(); /* 总线停止信号 */
reVal = LPI2C_MasterStop(GT911_I2C);
if (reVal != kStatus_Success)
{
return -1;
}
return 1;
//cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
// /* 发送I2C总线停止信号 */
// reVal = LPI2C_MasterStop(GT911_I2C);
// if (reVal != kStatus_Success)
// {
// return -1;
// }
//
// return 0;
}
/*
*********************************************************************************************************
* 函 数 名: GT911_ReadID
* 功能说明: 获得GT911的芯片ID
* 形 参: 无
* 返 回 值: 16位版本
*********************************************************************************************************
*/
uint32_t GT911_ReadID(void)
{
uint8_t buf[5];
GT911_ReadReg(GT911_PRODUCT_ID_REG, buf, 3);
GT911_ReadReg(GT911_CONFIG_REG, (uint8_t *)&buf[4], 1);
PRINTF("TouchPad_ID:%2x,%2x,%2x\r\nTouchPad_Config_Version:%2x\r\n",buf[0],buf[1],buf[2],buf[4]);
return ((uint32_t)buf[3] << 24) | ((uint32_t)buf[2] << 16) | ((uint32_t)buf[1] <<8) | buf[0];
// uint8_t buf[4];
// GT911_ReadReg(0x8140, buf, 4);
//
}
/*
*********************************************************************************************************
* 函 数 名: GT911_ReadVersion
* 功能说明: 获得GT911的芯片版本
* 形 参: 无
* 返 回 值: 16位版本
*********************************************************************************************************
*/
uint16_t GT911_ReadVersion(void)
{
uint8_t buf[2];
GT911_ReadReg(GT911_FIRMWARE_VERSION_REG, buf, 2);
return ((uint16_t)buf[1] << 8) + buf[0];
}
void gpio_set_dir(GPIO_Type *gpio, uint32_t pin, uint8_t dir)
{
gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
gpio_config.direction = dir;
GPIO_PinInit(gpio, pin, &gpio_config);
}
#define DEV_RST_PIN GPIO5,0
#define DEV_INT_PIN GPIO5,1
#define GPIO_PIN_SET 1
#define GPIO_PIN_RESET 0
#define DEV_Set_GPIOMode(_pin, _mode) gpio_set_dir(_pin, _mode==0?kGPIO_DigitalOutput:kGPIO_DigitalInput)
#define DEV_Digital_Write(_pin, _value) GPIO_PinWrite(_pin, _value)
#define DEV_Digital_Read(_pin) GPIO_PinRead(_pin)
#define DEV_Delay_us(x) SDK_DelayAtLeastUs(x, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY)
#define DEV_Delay_ms(x) SDK_DelayAtLeastUs(1000*x, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY)
#define HAL_GPIO_WritePin(_pin,_value) GPIO_PinWrite(_pin, _value)
status_t GT911_Init()
{
uint32_t id;
status_t status;
uint16_t ver;
gpio_pin_config_t sw_config = {
kGPIO_DigitalInput,
0,
kGPIO_IntFallingEdge,
};
// GPIO_PortClear(GPIO5, 1U << 1);
// vTaskDelay(100);
// GPIO_PortSet(GPIO5, 1U << 1);
DEV_Set_GPIOMode(DEV_RST_PIN, 0);
DEV_Set_GPIOMode(DEV_INT_PIN, 0);
HAL_GPIO_WritePin(DEV_RST_PIN, GPIO_PIN_RESET);
DEV_Delay_ms(100);
HAL_GPIO_WritePin(DEV_INT_PIN, GPIO_PIN_RESET);
DEV_Delay_ms(100);
HAL_GPIO_WritePin(DEV_RST_PIN, GPIO_PIN_SET);
DEV_Delay_ms(100);
//
// HAL_GPIO_WritePin(DEV_INT_PIN, GPIO_PIN_SET);
// DEV_Delay_ms(10);
// HAL_GPIO_WritePin(DEV_INT_PIN, GPIO_PIN_SET);
// GPIO_InitStruct.Pin = INT_Pin;
// GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// HAL_GPIO_Init(INT_GPIO_Port, &GPIO_InitStruct);
Dev_Now.Touch = 0;
EnableIRQ(GPIO5_Combined_0_15_IRQn);
GPIO_PinInit(DEV_INT_PIN, &sw_config);
GPIO_PortEnableInterrupts(GPIO5, 1U << 1);
// DEV_Delay_ms(100);
//
id = GT911_ReadID();
// PRINTF("id:0x%X",id);
ver = GT911_ReadVersion();
PRINTF("GT911 ID :%08X, Version : %04X\r\n", id, ver);
if (id == 0x00313139)
{
PRINTF("检测到7.0寸电容触摸屏GT911(0x28) 800x480\r\n");
return kStatus_Success;
}
else
{
return !kStatus_Success;
}
}
//void GPIO5_Combined_0_15_IRQHandler(void) {
// GPIO_PortClearInterruptFlags(GPIO5,1<<1);
//// Dev_Now.Touch = 1;
// PRINTF("触摸中断\r\n");
// SDK_ISR_EXIT_BARRIER;
// }
uint8_t lcd_updata=0;
void GPIO5_Combined_0_15_IRQHandler(void)
{
GPIO_PortClearInterruptFlags(GPIO5, 1U << 1);
if(lcd_updata == 1) return ;
Dev_Now.Touch = 1;
// PRINTF("触摸中断\r\n");
// GT911_Scan();
SDK_ISR_EXIT_BARRIER;
}
void GT911_get_xy(int16_t* x, int16_t* y) {
uint8_t buf[41];
uint8_t Clearbuf = 0;
uint8_t i;
if (Dev_Now.Touch == 0) {
*x = 0;
*y = 0;
return;
}
// Dev_Now.Touch = 0;
// 看有多少个点
GT911_ReadReg(GT911_READ_XY_REG, buf, 1);
Dev_Now.TouchpointFlag = buf[0];
Dev_Now.TouchCount = buf[0] & 0x0f;
if (Dev_Now.TouchCount > 5 || Dev_Now.TouchCount == 0) {
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *) & Clearbuf, 1);
DEV_Delay_ms(10);
return;
}
// 这里只读第一个寄存器
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
DEV_Delay_ms(10);
GT911_ReadReg(GT911_READ_XY_REG + 1, &buf[1], Dev_Now.TouchCount * 8);
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *) & Clearbuf, 1);
DEV_Delay_ms(10);
Dev_Now.Touchkeytrackid[0] = buf[1];
*x = ((uint16_t)buf[3] << 8) + buf[2];
*y = ((uint16_t)buf[5] << 8) + buf[4];
// 处理完后再置为 0
// 如果一开始就置为 0,中断随时发生,会被再次置为 1
Dev_Now.Touch = 0;
}
uint8_t touchpad_flag=0;
#define UBYTE uint8_t
#define UWORD uint16_t
UWORD x[CT_MAX_TOUCH] = {0}, y[CT_MAX_TOUCH] = {0}, z=0;
/******************************************************************************
function: Read the firmware version of the GT911
******************************************************************************/
void GT911_Scan(void)
{
uint8_t buf[41];
uint8_t Clearbuf = 0;
uint8_t i;
//Determine if the interruption is generated
if (Dev_Now.Touch == 1)
{
GT911_ReadReg(GT911_READ_XY_REG, buf, 1);
if ((buf[0]&0x80) == 0x00)
{
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
DEV_Delay_ms(10);
}
else
{
Dev_Now.TouchpointFlag = buf[0];
Dev_Now.TouchCount = buf[0]&0x0f;
if (Dev_Now.TouchCount > 5 || Dev_Now.TouchCount == 0)
{
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
return ;
}
// if(temp < 5){//Prevent misjudgment
// temp = 1 + temp;
// if(temp == 4)
// Paint_Clear(WHITE);
// return;
// }
touchpad_flag = 1;
GT911_ReadReg(GT911_READ_XY_REG+1, &buf[1], Dev_Now.TouchCount*8);
GT911_WriteReg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
Dev_Now.Touchkeytrackid[0] = buf[1];
Dev_Now.X[0] = ((uint16_t)buf[3] << 8) + buf[2];
Dev_Now.Y[0] = ((uint16_t)buf[5] << 8) + buf[4];
Dev_Now.S[0] = ((uint16_t)buf[7] << 8) + buf[6];
Dev_Now.Touchkeytrackid[1] = buf[9];
Dev_Now.X[1] = ((uint16_t)buf[11] << 8) + buf[10];
Dev_Now.Y[1] = ((uint16_t)buf[13] << 8) + buf[12];
Dev_Now.S[1] = ((uint16_t)buf[15] << 8) + buf[14];
Dev_Now.Touchkeytrackid[2] = buf[17];
Dev_Now.X[2] = ((uint16_t)buf[19] << 8) + buf[18];
Dev_Now.Y[2] = ((uint16_t)buf[21] << 8) + buf[20];
Dev_Now.S[2] = ((uint16_t)buf[23] << 8) + buf[22];
Dev_Now.Touchkeytrackid[3] = buf[25];
Dev_Now.X[3] = ((uint16_t)buf[27] << 8) + buf[26];
Dev_Now.Y[3] = ((uint16_t)buf[29] << 8) + buf[28];
Dev_Now.S[3] = ((uint16_t)buf[31] << 8) + buf[30];
Dev_Now.Touchkeytrackid[4] = buf[33];
Dev_Now.X[4] = ((uint16_t)buf[35] << 8) + buf[34];
Dev_Now.Y[4] = ((uint16_t)buf[37] << 8) + buf[36];
Dev_Now.S[4] = ((uint16_t)buf[39] << 8) + buf[38];
// PRINTF("Dev_Now.X[0]:%d Dev_Now.Y[0]:%d Dev_Now.S[0]:%d\r\n",Dev_Now.X[0],Dev_Now.Y[0],Dev_Now.S[0]);
// PRINTF("Dev_Now.X[1]:%d Dev_Now.Y[1]:%d Dev_Now.S[1]:%d\r\n",Dev_Now.X[1],Dev_Now.Y[1],Dev_Now.S[1]);
//Get coordinates and display coordinates
//Clear the last redundant display coordinates
// if(z > Dev_Now.TouchCount){
// for(i = z; i != Dev_Now.TouchCount; i--){
// Paint_DrawLine(0 , y[i-1]+3, 800, y[i-1]+3, WHITE, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawLine(x[i-1]+3, 0, x[i-1]+3, 480, WHITE, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawCircle( x[i-1]+3 , y[i-1]+3 , 8, WHITE, DRAW_FILL_FULL, DOT_PIXEL_1X1);
// }
// }
// for (i=0;i<Dev_Now.TouchCount;i++)
// {
// Dev_Backup.X = Dev_Now.X;
// Dev_Backup.Y = Dev_Now.Y;
// Dev_Backup.TouchCount = Dev_Now.TouchCount;
// printf("x = %d y= %d \r\n",Dev_Now.X, Dev_Now.Y);
// //Clear the last displayed coordinates
// if(x != Dev_Now.X || y != Dev_Now.Y){
// Paint_DrawLine(0 , y+3, 800, y+3, WHITE, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawLine(x+3, 0, x+3, 480, WHITE, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawCircle( x+3 , y+3 , 8, WHITE, DRAW_FILL_FULL, DOT_PIXEL_1X1);
// }
// //Display coordinates
// Paint_DrawLine(Dev_Now.X+3, 0, Dev_Now.X+3, 480, Color, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawLine(0 , Dev_Now.Y+3, 800, Dev_Now.Y+3, Color, LINE_STYLE_SOLID, DOT_PIXEL_1X1);
// Paint_DrawCircle(Dev_Now.X+3 , Dev_Now.Y+3 , 8, Color, DRAW_FILL_FULL, DOT_PIXEL_1X1);
// x = Dev_Now.X;
// y = Dev_Now.Y;
// }
// z = Dev_Now.TouchCount;
}
Dev_Now.Touch = 0;
}
}这是触摸代码。- /*
- * Copyright 2022 NXP
- * SPDX-License-Identifier: MIT
- */
- #include "events_init.h"
- #include <stdio.h>
- #include "lvgl/lvgl.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- void events_init(lv_ui *ui)
- {
- }
- static void screen_sw_1_event_handler(lv_event_t *e)
- {
- lv_event_code_t code = lv_event_get_code(e);
- switch (code)
- {
- case LV_EVENT_VALUE_CHANGED:
- {
- PRINTF("按下");
- USER_LED_TOGGLE();
- lv_obj_set_style_bg_color(guider_ui.screen_led_1, lv_color_make(0xfc, 0xff, 0xff), LV_PART_MAIN);
- }
- break;
- default:
- break;
- }
- }
- static void screen_btn_1_event_handler(lv_event_t *e)
- {
- lv_event_code_t code = lv_event_get_code(e);
- switch (code)
- {
- case LV_EVENT_PRESSED:
- {
- lv_obj_set_style_text_font(guider_ui.screen_label_3, &lv_font_simsun_24, 0);
- lv_label_set_text(guider_ui.screen_label_3, "日天牛批");
- }
- break;
- default:
- break;
- }
- }
- void events_init_screen(lv_ui *ui)
- {
- lv_obj_add_event_cb(ui->screen_sw_1, screen_sw_1_event_handler, LV_EVENT_ALL, NULL);
- lv_obj_add_event_cb(ui->screen_btn_1, screen_btn_1_event_handler, LV_EVENT_ALL, NULL);
- }
复制代码 这是事件代码。效果如下:
|
|