OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7852|回复: 11

imx6ull+gt9147裸机代码分享

[复制链接]

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
发表于 2020-1-4 17:30:33 | 显示全部楼层 |阅读模式
屏幕是4.3的480x272,触摸芯片是gt9147,代码是修改的原子的例程,成功实现5点触控。贴出来和大家分享下。
详细代码在附件。
下面贴出9147的驱动源码。i2c通信的读取函数在i2c.c里面
  1. #include "gt9147.h"
  2. #include "bsp_uart.h"
  3. #include "bsp_delay.h"
  4. #include "string.h"
  5. #include "bsp_lcd.h"
  6. #include "bsp_i2c.h"
  7. #include "cc.h"
  8. #include "stdio.h"
  9. #include "bsp_gpio.h"
  10. //////////////////////////////////////////////////////////////////////////////////         
  11. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  12. //ALIENTEK STM32F407开发板
  13. //4.3寸电容触摸屏-GT9147 驱动代码          
  14. //正点原子@ALIENTEK
  15. //技术论坛:www.openedv.com
  16. //创建日期:2014/5/7
  17. //版本:V1.0
  18. //版权所有,盗版必究。
  19. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  20. //All rights reserved                                                                          
  21. //////////////////////////////////////////////////////////////////////////////////
  22. _m_tp_dev tp_dev=
  23. {
  24.         GT9147_Init,
  25.         GT9147_Scan,
  26.         0,
  27.         0,
  28.         0,
  29.         0,
  30.         0,
  31.         0,
  32.         0,                                  
  33.         0,
  34.         0,                                  
  35. };       
  36. //GT9147配置参数表
  37. //第一个字节为版本号(0X60),必须保证新的版本号大于等于GT9147内部
  38. //flash原有版本号,才会更新配置.
  39. const u8 GT9147_CFG_TBL[]=
  40. {
  41.         0x61,0xe0,0x01,0x10,0x01,0x05,0x0f,0x00,0x01,0x08,
  42.         0x28,0x05,0x50,0x32,0x03,0x05,0x00,0x00,0xff,0xff,
  43.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x28,0x0a,
  44.         0x17,0x15,0x31,0x0d,0x00,0x00,0x02,0x9b,0x03,0x25,
  45.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,
  46.         0x00,0x0f,0x94,0x94,0xc5,0x02,0x07,0x00,0x00,0x04,
  47.         0x8d,0x13,0x00,0x5c,0x1e,0x00,0x3c,0x30,0x00,0x29,
  48.         0x4c,0x00,0x1e,0x78,0x00,0x1e,0x00,0x00,0x00,0x00,
  49.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  50.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  51.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52.         0x00,0x00,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,
  53.         0x18,0x1a,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,
  54.         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  55.         0xff,0xff,0x00,0x02,0x04,0x05,0x06,0x08,0x0a,0x0c,
  56.         0x0e,0x1d,0x1e,0x1f,0x20,0x22,0x24,0x28,0x29,0xff,
  57.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
  58.         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  59.         0xff,0xff,0xff,0xff,
  60. };  
  61. //发送GT9147配置参数
  62. //mode:0,参数不保存到flash
  63. //     1,参数保存到flash
  64. u8 GT9147_Send_Cfg(u8 mode)
  65. {
  66.         u8 buf[2];
  67.         u8 i=0;
  68.         buf[0]=0;
  69.         buf[1]=mode;        //是否写入到GT9147 FLASH?  即是否掉电保存
  70.         for(i=0;i<sizeof(GT9147_CFG_TBL);i++)buf[0]+=GT9147_CFG_TBL[i];//计算校验和
  71.     buf[0]=(~buf[0])+1;
  72.         if(GT9147_WR_Reg(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL)))//发送寄存器配置
  73.         printf("write fail\r\n");
  74.         GT9147_WR_Reg(GT_CHECK_REG,buf,2);//写入校验和,和配置更新标记
  75.         return 0;
  76. }

  77. //初始化GT9147触摸屏
  78. //返回值:0,初始化成功;1,初始化失败
  79. u8 GT9147_Init(void)
  80. {
  81.         u8 temp[5];        
  82. /* 1、初始化IIC2 IO
  83.      * I2C2_SCL -> UART5_TXD
  84.      * I2C2_SDA -> UART5_RXD
  85.      */
  86.         IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL,1);
  87.         IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA,1);

  88.         /* 配置I2C2 IO属性       
  89.          *bit 16:0 HYS关闭
  90.          *bit [15:14]: 1 默认47K上拉
  91.          *bit [13]: 1 pull功能
  92.          *bit [12]: 1 pull/keeper使能
  93.          *bit [11]: 0 关闭开路输出
  94.          *bit [7:6]: 10 速度100Mhz
  95.          *bit [5:3]: 110 驱动能力为R0/6
  96.          *bit [0]: 1 高转换率
  97.          */
  98.         IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL,0x70B0);
  99.         IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA,0X70B0);
  100.        
  101.         /* 2、初始化触摸屏中断IO和复位IO */
  102.         /* 3、初始化I2C */
  103.         i2c_init(I2C2);       

  104.         IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);/* 复用为GPIO5_IO9 */
  105.         IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0x18);

  106.         // IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);                /* 复用为GPIO1_IO9 */
  107.         // IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF088);//shang la
  108.         // GPIO1->GDIR &= ~( 1 << 9); // 输入

  109.         IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);                /* 复用为GPIO1_IO9 */
  110.         IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0x3088);//xia la
  111.         GPIO1->GDIR |= 1 << 9;  //输出

  112.         gpio_pinwrite(GPIO5, 9, 0);                        //复位
  113.         delayms(15);
  114.         gpio_pinwrite(GPIO1, 9, 1);          //int  gao
  115.         delayus(200);
  116.         gpio_pinwrite(GPIO5, 9, 1);                        //释放复位                    
  117.         delayms(10);
  118.         gpio_pinwrite(GPIO1, 9, 0);          //int  di
  119.         delayms(60);
  120.         IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);                /* 复用为GPIO1_IO9 */
  121.         IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0x0088); //浮空 in
  122.         GPIO1->GDIR &= ~( 1 << 9); // 输入



  123.         delayms(100);  
  124.         GT9147_RD_Reg(GT_PID_REG,temp,4);//读取产品ID
  125.         temp[4]=0;
  126.         printf("CTP ID:%s\r\n",temp);        //打印ID
  127.         if(strcmp((char*)temp,"9147")==0)//ID==9147
  128.         {
  129.                 temp[0]=0X02;                       
  130.                 GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147
  131.                 GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器
  132.                 if(temp[0]<0X60)//默认版本比较低,需要更新flash配置
  133.                 {
  134.                         u8 ter[256],ty;
  135.                         printf("Default Ver:%d\r\n",temp[0]);
  136.                         GT9147_Send_Cfg(1);//更新并保存配置
  137.        
  138.                 }
  139.                 delayms(10);
  140.                 temp[0]=0X00;         
  141.                 GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束复位   
  142.                 return 0;
  143.         }
  144.         return 1;
  145. }
  146. const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
  147. //扫描触摸屏(采用查询方式)
  148. //mode:0,正常扫描.
  149. //返回值:当前触屏状态.
  150. //0,触屏无触摸;1,触屏有触摸
  151. u8 GT9147_Scan(u8 mode)
  152. {
  153.         u8 buf[4];
  154.         u8 i=0;
  155.         u8 res=0;
  156.         u8 temp;
  157.         u8 tempsta;
  158.         static u8 t=0;//控制查询间隔,从而降低CPU占用率   
  159.         t++;
  160.         if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
  161.         {
  162.                 GT9147_RD_Reg(GT_GSTID_REG,&mode,1);        //读取触摸点的状态  
  163.                 if(mode&0X80&&((mode&0XF)<6))
  164.                 {
  165.                         printf("clear flag\r\n");
  166.                         temp=0;
  167.                         GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志                
  168.                 }               
  169.                 if((mode&0XF)&&((mode&0XF)<6))
  170.                 {
  171.                         tp_dev.num = mode&0xf;
  172.                         temp=0XFF<<(mode&0XF);                //将点的个数转换为1的位数,匹配tp_dev.sta定义
  173.                         tempsta=tp_dev.sta;                        //保存当前的tp_dev.sta值
  174.                         tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
  175.                         // tp_dev.x[4]=tp_dev.x[0];        //保存触点0的数据
  176.                         // tp_dev.y[4]=tp_dev.y[0];
  177.                         for(i=0;i<5;i++)
  178.                         {
  179.                                 if(tp_dev.sta&(1<<i))        //触摸有效?
  180.                                 {
  181.                                         GT9147_RD_Reg(GT9147_TPX_TBL[i],buf,4);        //读取XY坐标值
  182.                                         if(tp_dev.touchtype&0X01)//横屏
  183.                                         {
  184.                                                 tp_dev.y[i]=((u16)buf[1]<<8)+buf[0];
  185.                                                 tp_dev.x[i]=800-(((u16)buf[3]<<8)+buf[2]);
  186.                                         }else
  187.                                         {
  188.                                                 tp_dev.x[i]=((u16)buf[1]<<8)+buf[0];
  189.                                                 tp_dev.y[i]=((u16)buf[3]<<8)+buf[2];
  190.                                         }  
  191.                                         //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]);
  192.                                 }                       
  193.                         }
  194.                         res=1;
  195.                         if(tp_dev.x[0]>tftlcd_dev.width||tp_dev.y[0]>tftlcd_dev.height)//非法数据(坐标超出了)
  196.                         {
  197.                                 if((mode&0XF)>1)                //有其他点有数据,则复第二个触点的数据到第一个触点.
  198.                                 {
  199.                                         // tp_dev.x[0]=tp_dev.x[1];
  200.                                         // tp_dev.y[0]=tp_dev.y[1];
  201.                                         t=0;                                //触发一次,则会最少连续监测10次,从而提高命中率
  202.                                 }else                                        //非法数据,则忽略此次数据(还原原来的)  
  203.                                 {
  204.                                         // tp_dev.x[0]=tp_dev.x[4];
  205.                                         // tp_dev.y[0]=tp_dev.y[4];
  206.                                         mode=0X80;               
  207.                                         tp_dev.sta=tempsta;        //恢复tp_dev.sta
  208.                                 }
  209.                         }else t=0;                                        //触发一次,则会最少连续监测10次,从而提高命中率
  210.                 }
  211.         }
  212.         if((mode&0X8F)==0X80)//无触摸点按下
  213.         {
  214.                 if(tp_dev.sta&TP_PRES_DOWN)        //之前是被按下的
  215.                 {
  216.                         tp_dev.sta&=~(1<<7);        //标记按键松开
  217.                 }else                                                //之前就没有被按下
  218.                 {
  219.                         tp_dev.x[0]=0xffff;
  220.                         tp_dev.y[0]=0xffff;
  221.                         tp_dev.sta&=0XE0;        //清除点有效标记       
  222.                 }         
  223.         }        
  224.         if(t>240)t=10;//重新从10开始计数
  225.         return res;
  226. }
复制代码



GT9147裸机代码.zip (3.14 MB, 下载次数: 117)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-12-20
在线时间
18 小时
发表于 2020-1-4 17:56:42 | 显示全部楼层
本帖最后由 我和嫦娥上下铺 于 2020-1-8 19:10 编辑

我真的是醉了,我下午刚刚搞定了这个,你就发了,好巧http://www.openedv.com/forum.php?mod=viewthread&tid=304916&page=1&extra=#pid1040042
回复 支持 反对

使用道具 举报

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
 楼主| 发表于 2020-1-4 18:16:50 | 显示全部楼层
我和嫦娥上下铺 发表于 2020-1-4 17:56
我真的是醉了,我下午刚刚搞定了这个,你就发了,好巧

你也在搞这个啊,我是买了个盗版的屏幕,芯片和原子的对不上,初始化那块的那些管脚设置搞了好久才成功。我没看到你发的东西啊,我看看你咋弄的
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2019-7-1
在线时间
31 小时
发表于 2020-1-18 19:41:23 | 显示全部楼层
楼主您好,我现在也在弄这个触摸屏,也参考了一下您的代码,但是我现在遇到一个问题,我能读出9147的ID,应该可以说明与芯片正常通信了吧,但是读取0x8047,就是配置文件的版本号时,总是0,您遇到过这种问题吗?我也尝试读过0x8048寄存器的值,也是0
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2020-2-2 22:05:44 | 显示全部楼层
楼主,你用的是4.3寸的MCU还是RGB屏吗
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2020-2-9
在线时间
7 小时
发表于 2020-2-9 19:52:54 | 显示全部楼层
楼主 ,4.3寸800*480的RGB液晶可以用你的这套程序吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-8-22
在线时间
13 小时
发表于 2020-2-17 01:01:33 | 显示全部楼层
初始化完成之后往寄存器0x8040写6进入充电模式就可以解决无响应问题了
回复 支持 反对

使用道具 举报

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
 楼主| 发表于 2020-6-16 16:23:13 | 显示全部楼层
1547674987 发表于 2020-2-2 22:05
楼主,你用的是4.3寸的MCU还是RGB屏吗

是rgb屏幕
回复 支持 反对

使用道具 举报

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
 楼主| 发表于 2020-6-16 16:23:55 | 显示全部楼层
奶油蛋糕 发表于 2020-2-9 19:52
楼主 ,4.3寸800*480的RGB液晶可以用你的这套程序吗?

你试试吧,好长时间了  我都有点忘了
回复 支持 反对

使用道具 举报

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
 楼主| 发表于 2020-6-16 16:25:07 | 显示全部楼层
zhuweinan 发表于 2020-1-18 19:41
楼主您好,我现在也在弄这个触摸屏,也参考了一下您的代码,但是我现在遇到一个问题,我能读出9147的ID,应 ...

可能有硬件的原因导致一样代码跑出不一样的效果,我当时候就是用上面的代码跑通的,具体的细节我现在也忘记了
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-1-21
在线时间
6 小时
发表于 2021-12-15 14:01:26 | 显示全部楼层
zhuweinan 发表于 2020-1-18 19:41
楼主您好,我现在也在弄这个触摸屏,也参考了一下您的代码,但是我现在遇到一个问题,我能读出9147的ID,应 ...

我也遇到了这个问题,读取产品ID可以读取出来,但是读取0x8047固件版本号就是0,一直到0x8100都是0,重新做初始化,又不来中断。您要是解决了麻烦跟我说一下。我解决了也跟你说一下。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2022-9-28
在线时间
1 小时
发表于 2022-9-29 15:46:26 | 显示全部楼层
if(strcmp((char*)temp,"9147")==0)//ID==9147
为啥我读到的是。CTP ID:1158
一直搞不定这个屏幕。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 08:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表