10.1 引脚介绍
电容模块IC是用FT6336U,这个模块是用IIC通信,还有一个中断引脚,如有触摸按下中断引脚会有电平变化。图4.1是FT6336U与主控连接图。
图4.1
10.2 寄存器介绍
图4.2是介绍本次用到的寄存器功能。
图4.2
10.3 电容触摸驱动程序
#define FT6336U_ADDR 0x15 // 设备地址 7bit
#define FT6336U_Chip_ID 0xAA // chip ID
#define FT6336U_Pos_XH 0x03 // X 高4bit
#define FT6336U_Pos_XL 0x04 // X 低8bit
#define FT6336U_Pos_YH 0x05 // Y 高4bit
#define FT6336U_Pos_YL 0x06 // Y 低8bit
#define FT6336U_X_OFFSET (0)
#define FT6336U_Y_OFFSET (0)
typedef struct
{
uint16_t x;
uint16_t y;
uint8_t status;
} tp_point;
typedef struct
{
uint16_t chipID;
tp_point point;
bool (*read_point)(void);
bool (*update)(void);
} tp_dev_t;
static tp_dev_t* tp_dev_ft6336u = NULL;
extern tp_dev_t tp_dev;
/* static functions -----------------------------------------------------*/
/**
* @brief write data to ft6336u register
* @param reg register address
* @param buf need write data
* @param len need write len
* @return true write OK
* @return false write err
*/
static bool ft6336u_write_reg(uint16_t reg, uint8_t *buf , uint32_t len)
{
uint32_t i ;
// start
IIC_Start();
// send addr
IIC_Send_Byte( FT6336U_ADDR << 1 );
if(IIC_Wait_Ack()){
goto ret_fail;
}
// send reg
IIC_Send_Byte( reg & 0xFF);
if(IIC_Wait_Ack()){
goto ret_fail;
}
// write data
for(i = 0 ; i < len ; i++){
IIC_Send_Byte( buf[i] );
if(IIC_Wait_Ack()){
goto ret_fail;
}
}
// stop
IIC_Stop();
return true;
ret_fail:
return false;
}
/**
* @brief read data from cst836u register
* @param reg register address
* @param buf read data buff
* @param len need read len
* @return true read OK
* @return false read err
*/
static bool ft6336u_read_reg(uint16_t reg, uint8_t *buf , uint32_t len)
{
uint32_t i = 0;
// start
IIC_Start();
// send addr
IIC_Send_Byte( FT6336U_ADDR << 1 );
if(IIC_Wait_Ack()){
goto ret_fail;
}
// send reg
IIC_Send_Byte( reg & 0xFF);
if(IIC_Wait_Ack()){
goto ret_fail;
}
IIC_Stop();
//start again
IIC_Start();
// read
IIC_Send_Byte((FT6336U_ADDR << 1) | 0x01);
if(IIC_Wait_Ack()){
goto ret_fail;
}
// read data
for(i = 0 ; i < len-1 ; i++){
buf[i] = IIC_Read_Byte(1);
// IIC_Wait_Ack();
}
buf[i] = IIC_Read_Byte(0);
// IIC_Wait_Ack();
// stop
IIC_Stop();
return true;
ret_fail:
return false;
}
/**
* @brief get one point data from cst836u
* @return true read ok
* @return false read err
*/
static bool ft6336u_read_point(void)
{
uint8_t temp[4];
uint16_t x = 0xFFFF, y = 0xFFFF ;
if(NULL == tp_dev_ft6336u){
return false;
}
ft6336u_read_reg( FT6336U_Pos_XH, &temp[0] , 4);
x=(uint16_t)((temp[0]&0x0F)<<8)|temp[1];
y=(uint16_t)((temp[2]&0x0F)<<8)|temp[3];
tp_dev_ft6336u->point.status = temp[0] >> 6 ;
tp_dev_ft6336u->point.x = x + FT6336U_X_OFFSET;
tp_dev_ft6336u->point.y = y + FT6336U_Y_OFFSET;
#if FT6336U_LOGD_EN
printf("touch: x = %d y = %d status = %d\n" , tp_dev_ft6336u->point.x , tp_dev_ft6336u->point.y , tp_dev_ft6336u->point.status);
#endif
return true;
}
/**
* @brief read ft6336u chipID
*/
static bool ft6336u_read_chipID(void)
{
uint8_t chip_id[2] = {0};
if(NULL == tp_dev_ft6336u){
return false;
}
ft6336u_read_reg( FT6336U_Chip_ID, &chip_id[0] , 2);
tp_dev_ft6336u->chipID = chip_id[1] << 8 | chip_id[0];
#if FT6336U_LOGD_EN
printf("touch id : 0x%X\n" , tp_dev_ft6336u->chipID);
#endif
return true;
}
/**
* @brief init ft6336u TP
* @param dev
*/
void ft6336u_init(tp_dev_t *dev)
{
if(NULL == dev){
return ;
}
dev->read_point = ft6336u_read_point;
tp_dev_ft6336u = dev;
ft6336u_read_chipID();
}
/**
* @brief init touch pin and init ft6336u tp ic
*/
void touch_init(void)
{
gpio_init_type gpio_init_struct;
exint_init_type exint_init_struct;
crm_periph_clock_enable(TOUCH_RST_GPIO_CRM_CLK, TRUE);
// irq
crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(TOUCH_IRQ_GPIO_CRM_CLK, TRUE);
scfg_exint_line_config(TOUCH_IRQ_GPIO, TOUCH_IRQ_PIN);
exint_default_para_init(&exint_init_struct);
exint_init_struct.line_enable = TRUE;
exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
exint_init_struct.line_select = TOUCH_IRQ_EXINT_LINE;
exint_init_struct.line_polarity = EXINT_TRIGGER_FALLING_EDGE;
exint_init(&exint_init_struct);
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(TOUCH_IRQ_EXINT_IRQn, 1, 0);
/* configure the rst gpio */
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_pins = TOUCH_RST_PIN ;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(TOUCH_RST_GPIO, &gpio_init_struct);
// iic io
IIC_Init();
// rst set 1
TOUCH_RST_SET(1);
delay_ms(5);
TOUCH_RST_SET(0);
delay_ms(5);
TOUCH_RST_SET(1);
delay_ms(100);
//tp ic init
ft6336u_init(&tp_dev);
}
//中断处理函数读取坐标值
void TOUCH_IRQ_EXINT_IRQHandler(void)
{
if(exint_flag_get(TOUCH_IRQ_EXINT_LINE) != RESET)
{
if(NULL != tp_dev.read_point){
tp_dev.read_point();
}
exint_flag_clear(TOUCH_IRQ_EXINT_LINE);
}
}
-
- 高通字库芯片开发资料
- GT-HMI Designer用户手册
- GT-HMI Engine用户手册
- GTC-480480TFT40XP模块使用手册
- GTC-480272TFT43XP模块使用手册
- GTC-800480TFT50G模块使用手册
- GTC-800480TFT70GP模块使用手册
- GTC-1024600TFT101GP模块使用手册
- GT-GUI LCD 0.96寸液晶模组数据手册
- GT-GUI LCD 1.9寸液晶模组数据手册
- GT-GUI LCD 2.8寸液晶模组数据手册
- GT-GUI LCD 7.0寸液晶模组数据手册
- GUI-LCD开发板使用手册
- GT5GL128B标准GUI芯片规格书
- GT5GL64芯片产品规格书
高通字库交流群
GT-HMI交流群