屏幕是4.3的480x272,触摸芯片是gt9147,代码是修改的原子的例程,成功实现5点触控。贴出来和大家分享下。
详细代码在附件。
下面贴出9147的驱动源码。i2c通信的读取函数在i2c.c里面
- #include "gt9147.h"
- #include "bsp_uart.h"
- #include "bsp_delay.h"
- #include "string.h"
- #include "bsp_lcd.h"
- #include "bsp_i2c.h"
- #include "cc.h"
- #include "stdio.h"
- #include "bsp_gpio.h"
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32F407开发板
- //4.3寸电容触摸屏-GT9147 驱动代码
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //创建日期:2014/5/7
- //版本:V1.0
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- _m_tp_dev tp_dev=
- {
- GT9147_Init,
- GT9147_Scan,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- };
- //GT9147配置参数表
- //第一个字节为版本号(0X60),必须保证新的版本号大于等于GT9147内部
- //flash原有版本号,才会更新配置.
- const u8 GT9147_CFG_TBL[]=
- {
- 0x61,0xe0,0x01,0x10,0x01,0x05,0x0f,0x00,0x01,0x08,
- 0x28,0x05,0x50,0x32,0x03,0x05,0x00,0x00,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x28,0x0a,
- 0x17,0x15,0x31,0x0d,0x00,0x00,0x02,0x9b,0x03,0x25,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,
- 0x00,0x0f,0x94,0x94,0xc5,0x02,0x07,0x00,0x00,0x04,
- 0x8d,0x13,0x00,0x5c,0x1e,0x00,0x3c,0x30,0x00,0x29,
- 0x4c,0x00,0x1e,0x78,0x00,0x1e,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,
- 0x18,0x1a,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0x00,0x02,0x04,0x05,0x06,0x08,0x0a,0x0c,
- 0x0e,0x1d,0x1e,0x1f,0x20,0x22,0x24,0x28,0x29,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,
- };
- //发送GT9147配置参数
- //mode:0,参数不保存到flash
- // 1,参数保存到flash
- u8 GT9147_Send_Cfg(u8 mode)
- {
- u8 buf[2];
- u8 i=0;
- buf[0]=0;
- buf[1]=mode; //是否写入到GT9147 FLASH? 即是否掉电保存
- for(i=0;i<sizeof(GT9147_CFG_TBL);i++)buf[0]+=GT9147_CFG_TBL[i];//计算校验和
- buf[0]=(~buf[0])+1;
- if(GT9147_WR_Reg(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL)))//发送寄存器配置
- printf("write fail\r\n");
- GT9147_WR_Reg(GT_CHECK_REG,buf,2);//写入校验和,和配置更新标记
- return 0;
- }
- //初始化GT9147触摸屏
- //返回值:0,初始化成功;1,初始化失败
- u8 GT9147_Init(void)
- {
- u8 temp[5];
- /* 1、初始化IIC2 IO
- * I2C2_SCL -> UART5_TXD
- * I2C2_SDA -> UART5_RXD
- */
- IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL,1);
- IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA,1);
- /* 配置I2C2 IO属性
- *bit 16:0 HYS关闭
- *bit [15:14]: 1 默认47K上拉
- *bit [13]: 1 pull功能
- *bit [12]: 1 pull/keeper使能
- *bit [11]: 0 关闭开路输出
- *bit [7:6]: 10 速度100Mhz
- *bit [5:3]: 110 驱动能力为R0/6
- *bit [0]: 1 高转换率
- */
- IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL,0x70B0);
- IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA,0X70B0);
-
- /* 2、初始化触摸屏中断IO和复位IO */
- /* 3、初始化I2C */
- i2c_init(I2C2);
- IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);/* 复用为GPIO5_IO9 */
- IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0x18);
- // IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0); /* 复用为GPIO1_IO9 */
- // IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF088);//shang la
- // GPIO1->GDIR &= ~( 1 << 9); // 输入
- IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0); /* 复用为GPIO1_IO9 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0x3088);//xia la
- GPIO1->GDIR |= 1 << 9; //输出
- gpio_pinwrite(GPIO5, 9, 0); //复位
- delayms(15);
- gpio_pinwrite(GPIO1, 9, 1); //int gao
- delayus(200);
- gpio_pinwrite(GPIO5, 9, 1); //释放复位
- delayms(10);
- gpio_pinwrite(GPIO1, 9, 0); //int di
- delayms(60);
- IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0); /* 复用为GPIO1_IO9 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0x0088); //浮空 in
- GPIO1->GDIR &= ~( 1 << 9); // 输入
- delayms(100);
- GT9147_RD_Reg(GT_PID_REG,temp,4);//读取产品ID
- temp[4]=0;
- printf("CTP ID:%s\r\n",temp); //打印ID
- if(strcmp((char*)temp,"9147")==0)//ID==9147
- {
- temp[0]=0X02;
- GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147
- GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器
- if(temp[0]<0X60)//默认版本比较低,需要更新flash配置
- {
- u8 ter[256],ty;
- printf("Default Ver:%d\r\n",temp[0]);
- GT9147_Send_Cfg(1);//更新并保存配置
-
- }
- delayms(10);
- temp[0]=0X00;
- GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束复位
- return 0;
- }
- return 1;
- }
- const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
- //扫描触摸屏(采用查询方式)
- //mode:0,正常扫描.
- //返回值:当前触屏状态.
- //0,触屏无触摸;1,触屏有触摸
- u8 GT9147_Scan(u8 mode)
- {
- u8 buf[4];
- u8 i=0;
- u8 res=0;
- u8 temp;
- u8 tempsta;
- static u8 t=0;//控制查询间隔,从而降低CPU占用率
- t++;
- if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
- {
- GT9147_RD_Reg(GT_GSTID_REG,&mode,1); //读取触摸点的状态
- if(mode&0X80&&((mode&0XF)<6))
- {
- printf("clear flag\r\n");
- temp=0;
- GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志
- }
- if((mode&0XF)&&((mode&0XF)<6))
- {
- tp_dev.num = mode&0xf;
- temp=0XFF<<(mode&0XF); //将点的个数转换为1的位数,匹配tp_dev.sta定义
- tempsta=tp_dev.sta; //保存当前的tp_dev.sta值
- tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
- // tp_dev.x[4]=tp_dev.x[0]; //保存触点0的数据
- // tp_dev.y[4]=tp_dev.y[0];
- for(i=0;i<5;i++)
- {
- if(tp_dev.sta&(1<<i)) //触摸有效?
- {
- GT9147_RD_Reg(GT9147_TPX_TBL[i],buf,4); //读取XY坐标值
- if(tp_dev.touchtype&0X01)//横屏
- {
- tp_dev.y[i]=((u16)buf[1]<<8)+buf[0];
- tp_dev.x[i]=800-(((u16)buf[3]<<8)+buf[2]);
- }else
- {
- tp_dev.x[i]=((u16)buf[1]<<8)+buf[0];
- tp_dev.y[i]=((u16)buf[3]<<8)+buf[2];
- }
- //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]);
- }
- }
- res=1;
- if(tp_dev.x[0]>tftlcd_dev.width||tp_dev.y[0]>tftlcd_dev.height)//非法数据(坐标超出了)
- {
- if((mode&0XF)>1) //有其他点有数据,则复第二个触点的数据到第一个触点.
- {
- // tp_dev.x[0]=tp_dev.x[1];
- // tp_dev.y[0]=tp_dev.y[1];
- t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }else //非法数据,则忽略此次数据(还原原来的)
- {
- // tp_dev.x[0]=tp_dev.x[4];
- // tp_dev.y[0]=tp_dev.y[4];
- mode=0X80;
- tp_dev.sta=tempsta; //恢复tp_dev.sta
- }
- }else t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }
- }
- if((mode&0X8F)==0X80)//无触摸点按下
- {
- if(tp_dev.sta&TP_PRES_DOWN) //之前是被按下的
- {
- tp_dev.sta&=~(1<<7); //标记按键松开
- }else //之前就没有被按下
- {
- tp_dev.x[0]=0xffff;
- tp_dev.y[0]=0xffff;
- tp_dev.sta&=0XE0; //清除点有效标记
- }
- }
- if(t>240)t=10;//重新从10开始计数
- return res;
- }
复制代码
GT9147裸机代码.zip
(3.14 MB, 下载次数: 117)
|