TK-7016这款屏幕其实是由TFT LCD+触摸屏组合起来的。底下是LCD面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的LCD屏幕。电容触摸屏也是需要一个驱动IC的,驱动IC一般会提供一个I2C接口给主控制器,主控制器可以通过I2C接口来读取驱动IC里面的触摸坐标数据。
寄存器地址 位 寄存器功能 描述
0X00 [6:4] 模式寄存器 设置FT5426的工作模式:
000:正常模式。
001:系统信息模式
100:测试模式。
0X02 [3:0] 触摸状态寄存器 记录有多少个触摸点,
有效值为1~5。
0X03 [7:6] 第一个触摸点X坐标高位数据 事件标志:
00:按下。
01:抬起
10:接触
11:保留
[3:0] X轴坐标值高4位。
0X04 [7:0] 第一个触摸点X坐标低位数据 X轴坐标值低8位
0X05 [7:4] 第一个触摸点Y坐标高位数据 触摸点的ID。
[3:0] Y轴坐标高4位
0X06 [7:0] 第一个触摸点Y坐标低位数据 Y轴坐标低8位
0X09 [7:6] 第二个触摸点X坐标高位数据 与寄存器0X03含义相同。
[3:0]
0X0A [7:0] 第二个触摸点X坐标低位数据 与寄存器0X04含义相同。
0X0B [7:4] 第二个触摸点Y坐标高位数据 与寄存器0X05含义相同。
[3:0]
0X0C [7:0] 第二个触摸点Y坐标低位数据 与寄存器0X06含义相同
0X0F [7:6] 第三个触摸点X坐标高位数据 与寄存器0X03含义相同。
[3:0]
0X10 [7:0] 第三个触摸点X坐标低位数据 与寄存器0X04含义相同。
0X11 [7:4] 第三个触摸点Y坐标高位数据 与寄存器0X05含义相同。
[3:0]
0X12 [7:0] 第三个触摸点Y坐标低位数据 与寄存器0X06含义相同
0X15 [7:6] 第四个触摸点X坐标高位数据 与寄存器0X03含义相同。
[3:0]
0X16 [7:0] 第四个触摸点X坐标低位数据 与寄存器0X04含义相同。
0X17 [7:4] 第四个触摸点Y坐标高位数据 与寄存器0X05含义相同。
[3:0]
0X18 [7:0] 第四个触摸点Y坐标低位数据 与寄存器0X06含义相同
0X1B [7:6] 第五个触摸点X坐标高位数据 与寄存器0X03含义相同。
[3:0]
0X1C [7:0] 第五个触摸点X坐标低位数据 与寄存器0X04含义相同。
0X1D [7:4] 第五个触摸点Y坐标高位数据 与寄存器0X05含义相同。
[3:0]
0X1E [7:0] 第五个触摸点Y坐标低位数据 与寄存器0X06含义相同
0XA1 [7:0] 版本寄存器 版本高字节
0XA2 [7:0] 版本低字节
0XA4 [7:0] 中断模式寄存器 用于设置中断模式:
0:轮询模式
1:触发模式
- /***************************************************************
- Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
- 文件名 : bsp_ft5xx6.c
- 作者 : 左忠凯
- 版本 : V1.0
- 描述 : 触摸屏驱动文件,触摸芯片为FT5xx6,
- 包括FT5426和FT5406。
- 其他 : 无
- 论坛 : www.openedv.com
- 日志 : 初版V1.0 2019/1/21 左忠凯创建
- ***************************************************************/
- 1 #include "bsp_ft5xx6.h"
- 2 #include "bsp_i2c.h"
- 3 #include "bsp_int.h"
- 4 #include "bsp_delay.h"
- 5 #include "stdio.h"
- 6
- 7 struct ft5426_dev_struc ft5426_dev;
- 8
- 9 /*
- 10 * @description : 初始化触摸屏,其实就是初始化FT5426
- 11 * @param : 无
- 12 * @return : 无
- 13 */
- 14 void ft5426_init(void)
- 15 {
- 16 unsigned char reg_value[2];
- 17
- 18 ft5426_dev.initfalg = FT5426_INIT_NOTFINISHED;
- 19
- 20 /* 1、初始化IIC2 IO
- 21 * I2C2_SCL -> UART5_TXD
- 22 * I2C2_SDA -> UART5_RXD
- 23 */
- 24 IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL, 1);
- 25 IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA, 1);
- 26 IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL, 0x70B0);
- 27 IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA, 0X70B0);
- 28
- 29 /* 2、初始化触摸屏中断IO和复位IO */
- 30 gpio_pin_config_t ctintpin_config;
- 31 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);
- 32 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);
- 33 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF080);
- 34 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0X10B0);
- 35
- 36 /* 中断IO初始化 */
- 37 ctintpin_config.direction = kGPIO_DigitalInput;
- 38 ctintpin_config.interruptMode = kGPIO_IntRisingOrFallingEdge;
- 39 gpio_init(GPIO1, 9, &ctintpin_config);
- 40
- 41 GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn); /* 使能GIC中对应的中断 */
- 42 system_register_irqhandler(GPIO1_Combined_0_15_IRQn,
- (system_irq_handler_t)gpio1_io9_irqhandler,
- NULL); /* 注册中断服务函数 */
- 43 gpio_enableint(GPIO1, 9); /* 使能GPIO1_IO09的中断功能 */
- 44
- 45 /* 复位IO初始化 */
- 46 ctintpin_config.direction=kGPIO_DigitalOutput;
- 47 ctintpin_config.interruptMode=kGPIO_NoIntmode;
- 48 ctintpin_config.outputLogic=1;
- 49 gpio_init(GPIO5, 9, &ctintpin_config);
- 50
- 51 /* 3、初始化I2C */
- 52 i2c_init(I2C2);
- 53
- 54 /* 4、初始化FT5426 */
- 55 gpio_pinwrite(GPIO5, 9, 0); /* 复位FT5426 */
- 56 delayms(20);
- 57 gpio_pinwrite(GPIO5, 9, 1); /* 停止复位FT5426 */
- 58 delayms(20);
- 59 ft5426_write_byte(FT5426_ADDR, FT5426_DEVICE_MODE, 0);
- 60 ft5426_write_byte(FT5426_ADDR, FT5426_IDG_MODE, 1);
- 61 ft5426_read_len(FT5426_ADDR, FT5426_IDGLIB_VERSION, 2,
- reg_value);
- 62 printf("Touch Frimware Version:%#X\r\n",
- ((unsigned short)reg_value[0] << 8) + reg_value[1]);
- 63 ft5426_dev.initfalg = FT5426_INIT_FINISHED; /* 标记初始化完成 */
- 64 ft5426_dev.intflag = 0;
- 65 }
- 66
- 67 /*
- 68 * @description : GPIO1_IO9最终的中断处理函数
- 69 * @param : 无
- 70 * @return : 无
- 71 */
- 72 void gpio1_io9_irqhandler(void)
- 73 {
- 74 if(ft5426_dev.initfalg == FT5426_INIT_FINISHED)
- 75 {
- 76 //ft5426_dev.intflag = 1;
- 77 ft5426_read_tpcoord();
- 78 }
- 79 gpio_clearintflags(GPIO1, 9); /* 清除中断标志位 */
- 80 }
- 81
- 82 /*
- 83 * @description : 向FT5426写入数据
- 84 * @param – addr : 设备地址
- 85 * @param - reg : 要写入的寄存器
- 86 * @param – data : 要写入的数据
- 87 * @return : 操作结果
- 88 */
- 89 unsigned char ft5426_write_byte(unsigned char addr,
- unsigned char reg,
- unsigned char data)
- 90 {
- 91 unsigned char status=0;
- 92 unsigned char writedata=data;
- 93 struct i2c_transfer masterXfer;
- 94
- 95 /* 配置I2C xfer结构体 */
- 96 masterXfer.slaveAddress = addr; /* 设备地址 */
- 97 masterXfer.direction = kI2C_Write; /* 写入数据 */
- 98 masterXfer.subaddress = reg; /* 要写入的寄存器地址 */
- 99 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
- 100 masterXfer.data = &writedata; /* 要写入的数据 */
- 101 masterXfer.dataSize = 1; /* 写入数据长度1个字节 */
- 102
- 103 if(i2c_master_transfer(I2C2, &masterXfer))
- 104 status=1;
- 105
- 106 return status;
- 107 }
- 108
- 109 /*
- 110 * @description : 从FT5426读取一个字节的数据
- 111 * @param – addr : 设备地址
- 112 * @param - reg : 要读取的寄存器
- 113 * @return : 读取到的数据。
- 114 */
- 115 unsigned char ft5426_read_byte(unsigned char addr,
- unsigned char reg)
- 116 {
- 117 unsigned char val=0;
- 118
- 119 struct i2c_transfer masterXfer;
- 120 masterXfer.slaveAddress = addr; /* 设备地址 */
- 121 masterXfer.direction = kI2C_Read; /* 读取数据 */
- 122 masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
- 123 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
- 124 masterXfer.data = &val; /* 接收数据缓冲区 */
- 125 masterXfer.dataSize = 1; /* 读取数据长度1个字节 */
- 126 i2c_master_transfer(I2C2, &masterXfer);
- 127 return val;
- 128 }
- 129
- 130 /*
- 131 * @description : 从FT5429读取多个字节的数据
- 132 * @param – addr : 设备地址
- 133 * @param - reg : 要读取的开始寄存器地址
- 134 * @param - len : 要读取的数据长度.
- 135 * @param - buf : 读取到的数据缓冲区
- 136 * @return : 无
- 137 */
- 138 void ft426_read_len(unsigned char addr,unsigned char reg,
- unsigned char len,unsigned char *buf)
- 139 {
- 140 struct i2c_transfer masterXfer;
- 141
- 142 masterXfer.slaveAddress = addr; /* 设备地址 */
- 143 masterXfer.direction = kI2C_Read; /* 读取数据 */
- 144 masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
- 145 masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
- 146 masterXfer.data = buf; /* 接收数据缓冲区 */
- 147 masterXfer.dataSize = len; /* 读取数据长度 */
- 148 i2c_master_transfer(I2C2, &masterXfer);
- 149 }
- 150
- 151 /*
- 152 * @description : 读取当前触摸点个数
- 153 * @param : 无
- 154 * @return : 无
- 155 */
- 156 void ft5426_read_tpnum(void)
- 157 {
- 158 ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
- FT5426_TD_STATUS);
- 159 }
- 160
- 161 /*
- 162 * @description : 读取当前所有触摸点的坐标
- 163 * @param : 无
- 164 * @return : 无
- 165 */
- 166 void ft5426_read_tpcoord(void)
- 167 {
- 168 unsigned char i = 0;
- 169 unsigned char type = 0;
- 170 //unsigned char id = 0;
- 171 unsigned char pointbuf[FT5426_XYCOORDREG_NUM];
- 172
- 173 ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
- FT5426_TD_STATUS);
- 174
- 175 /*
- 176 * 从寄存器FT5426_TOUCH1_XH开始,连续读取30个寄存器的值,
- 177 * 这30个寄存器保存着5个点的触摸值,每个点占用6个寄存器。
- 178 */
- 179 ft5426_read_len(FT5426_ADDR, FT5426_TOUCH1_XH,
- FT5426_XYCOORDREG_NUM, pointbuf);
- 180 for(i = 0; i < ft5426_dev.point_num ; i++)
- 181 {
- 182 unsigned char *buf = &pointbuf[i * 6];
-
- 183 ft5426_dev.x[i] = ((buf[2] << 8) | buf[3]) & 0x0fff;
- 184 ft5426_dev.y[i] = ((buf[0] << 8) | buf[1]) & 0x0fff;
- 185 type = buf[0] >> 6; /* 获取触摸类型 */
- 186 //id = (buf[2] >> 4) & 0x0f;
- 187 if(type == FT5426_TOUCH_EVENT_DOWN || type ==
- FT5426_TOUCH_EVENT_ON )/* 按下 */
- 188 {
- 189
- 190 } else { /* 释放 */
- 191
- 192 }
- 193 }
- 194 }