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);

}

}

下一页
上一页
    • 联系电话

    • 0755—83453881
    • 服务时间

    • 周一至周五 9:00-18:00
    • 高通GT-HMI交流群