查看: 3215|回复: 0

[原创] 【野火i.MX RT1052】8.i.Maxrt1052之5寸电容屏的5点触摸测试

[复制链接]
  • TA的每日心情
    擦汗
    2019-6-26 20:59
  • 签到天数: 235 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2018-6-15 22:12:33 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 小马哥-1650185 于 2018-6-16 13:08 编辑

    野火5寸电容屏采用了i2c电容屏驱动函数gt9157芯片,支持5点触控。
    QQ图片20180615235134.jpg

    GT9157的iic接口
    QQ截图20180616125552.jpg

    触摸芯片引脚定义
    1. #define TOUCH_PAD_SCL_IOMUXC                          IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL
    2. #define TOUCH_PAD_SDA_IOMUXC                          IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA

    3. #define TOUCH_PAD_RST_GPIO                             GPIO1
    4. #define TOUCH_PAD_RST_GPIO_PIN             (2U)
    5. #define TOUCH_PAD_RST_IOMUXC                          IOMUXC_GPIO_AD_B0_02_GPIO1_IO02

    6. #define TOUCH_PAD_INT_GPIO                             GPIO1
    7. #define TOUCH_PAD_INT_GPIO_PIN             (11U)
    8. #define TOUCH_PAD_INT_IOMUXC                          IOMUXC_GPIO_AD_B0_11_GPIO1_IO11

    9. #define TOUCH_PAD_INT_IRQ                             GPIO1_Combined_0_15_IRQn
    10. #define TOUCH_PAD_IRQHANDLER        GPIO1_Combined_0_15_IRQHandler
    复制代码


    iic 初始化

    QQ截图20180616125835.jpg

    触摸引脚及芯片初始化

    1. void I2C_Touch_Init(void)
    2. {
    3.   /* 初始化各引脚IOMUXC相关 */
    4.   I2C_GTP_IOMUXC_MUX_Config();
    5.   I2C_GTP_IOMUXC_PAD_Config();

    6.   /* 初始化I2C外设工作模式 */
    7.   GTP_I2C_ModeInit();
    8.   
    9.   /* 复位触摸芯片,配置地址 */
    10.   GTP_ResetChip();

    11. //  I2C_GTP_IRQEnable();
    12. }
    复制代码



    5寸屏GT9157驱动配置
    1. const uint8_t CTP_CFG_GT9157[] ={
    2.         0x00,0x20,0x03,0xE0,0x01,0x05,0x3C,0x00,0x01,0x08,
    3.         0x28,0x0C,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
    4.         0x00,0x00,0x00,0x17,0x19,0x1E,0x14,0x8B,0x2B,0x0D,
    5.         0x33,0x35,0x0C,0x08,0x00,0x00,0x00,0x9A,0x03,0x11,
    6.         0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,
    7.         0x00,0x20,0x58,0x94,0xC5,0x02,0x00,0x00,0x00,0x04,
    8.         0xB0,0x23,0x00,0x93,0x2B,0x00,0x7B,0x35,0x00,0x69,
    9.         0x41,0x00,0x5B,0x4F,0x00,0x5B,0x00,0x00,0x00,0x00,
    10.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    11.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    12.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    13.         0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,
    14.         0x12,0x14,0x16,0x18,0x1A,0xFF,0x00,0x00,0x00,0x00,
    15.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    16.         0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0F,
    17.         0x10,0x12,0x13,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,
    18.         0x21,0x22,0x24,0x26,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
    19.         0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    20.         0xFF,0xFF,0xFF,0xFF,0x48,0x01
    21. };
    复制代码


    gtp初始化

    1. int32_t GTP_Init_Panel(void)
    2. {
    3.     int32_t ret = -1;

    4.     int32_t i = 0;
    5.     uint8_t check_sum = 0;
    6.     int32_t retry = 0;

    7.     const uint8_t* cfg_info;
    8.     uint8_t cfg_info_len  ;

    9.     uint8_t cfg_num =0x80FE-0x8047+1 ;                //需要配置的寄存器个数

    10.     GTP_DEBUG_FUNC();


    11.     I2C_Touch_Init();

    12.     ret = GTP_I2C_Test();

    13.     if (ret < 0)
    14.     {
    15.         GTP_ERROR("I2C communication ERROR!");
    16.                                 return ret;
    17.     }
    18.                
    19.                 //获取触摸IC的型号
    20.     GTP_Read_Version();
    21.                
    22.                 //根据IC的型号指向不同的配置
    23.                 if(touchIC == GT9157)
    24.                 {
    25.                         cfg_info =  CTP_CFG_GT9157; //指向寄存器配置
    26.                         cfg_info_len = CFG_GROUP_LEN(CTP_CFG_GT9157);//计算配置表的大小
    27.                 }
    28.                 else
    29.                 {
    30.                         cfg_info =  CTP_CFG_GT911;//指向寄存器配置
    31.                         cfg_info_len = CFG_GROUP_LEN(CTP_CFG_GT911) ;//计算配置表的大小
    32.                 }                        

    33.     memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
    34.     memcpy(&config[GTP_ADDR_LENGTH], cfg_info, cfg_info_len);
    35.                
    36.     //计算要写入checksum寄存器的值
    37.     check_sum = 0;
    38.     for (i = GTP_ADDR_LENGTH; i < cfg_num+GTP_ADDR_LENGTH; i++)
    39.     {
    40.         check_sum += config[i];
    41.     }
    42.     config[ cfg_num+GTP_ADDR_LENGTH] = (~check_sum) + 1;         //checksum
    43.     config[ cfg_num+GTP_ADDR_LENGTH+1] =  1;                                                 //refresh 配置更新标志

    44.     //写入配置信息
    45.     for (retry = 0; retry < 5; retry++)
    46.     {
    47.         ret = GTP_I2C_Write(GTP_ADDRESS, config , cfg_num + GTP_ADDR_LENGTH+2);
    48.         if (ret > 0)
    49.         {
    50.             break;
    51.         }
    52.     }
    53.     Delay(0xffffff);                                //延迟等待芯片更新
    54.                

    55.                
    56. #if 0        //读出写入的数据,检查是否正常写入
    57.     //检验读出的数据与写入的是否相同
    58.         {
    59.                 uint16_t i;
    60.                 uint8_t buf[200];
    61.                  buf[0] = config[0];
    62.                  buf[1] =config[1];    //寄存器地址

    63.                 GTP_DEBUG_FUNC();

    64.                 ret = GTP_I2C_Read(GTP_ADDRESS, buf, sizeof(buf));

    65.                 //版本号写入0x00后,会进行复位,复位为0x41
    66.                  config[GTP_ADDR_LENGTH] = 0x41;

    67.                 for(i=0;i<cfg_num+GTP_ADDR_LENGTH;i++)
    68.                 {

    69.                         if(config[i] != buf[i])
    70.                         {
    71.                                 GTP_ERROR("Config fail ! i = %d ",i);
    72.                                 return -1;
    73.                         }
    74.                 }
    75.                 if(i==cfg_num+GTP_ADDR_LENGTH)
    76.                             GTP_DEBUG("Config success ! i = %d ",i);
    77.         }
    78. #endif
    79.         
    80.                
    81.          /*使能中断,这样才能检测触摸数据*/
    82.                 GTP_IRQEnable();
    83.         
    84.     GTP_Get_Info();

    85.     return 0;
    86. }
    复制代码



    Palette_Init 画板初始化

    1. void Palette_Init(void)
    2. {
    3.   
    4.   uint8_t i;

    5.   /* 整屏清为白色 */
    6.   LCD_Clear(CL_WHITE);        /* 清屏,显示全黑 */

    7.   
    8.   /* 初始化按钮 */
    9.   Touch_Button_Init();
    10.   
    11.   /* 描绘按钮 */
    12.   for(i=0;i<BUTTON_NUM;i++)
    13.   {
    14.     button[i].draw_btn(&button[i]);
    15.   }
    16.   
    17.         
    18.   /* 初始化画笔 */
    19.   brush.color = CL_BLACK;
    20.   brush.shape = LINE_SINGLE_PIXCEL;
    21.         
    22.         LCD_SetTextColor(brush.color);


    23. }
    复制代码




    在画板区域描绘触摸轨迹
    1. void Draw_Trail(int16_t pre_x,int16_t pre_y,int16_t x,int16_t y,Brush_Style* brush)
    2. {
    3.   /*设置画板区域为活动窗口,bsp_lcd.c驱动还没有这样的函数,用于限制绘画窗口*/
    4. //  RA8875_SetActiveWindow(PALETTE_START_X,PALETTE_START_Y,PALETTE_END_X,PALETTE_END_Y);
    5.   
    6.        
    7.   /*触摸位置在画板区域*/
    8.   if(x>PALETTE_START_X && pre_x>PALETTE_START_X )
    9.   {
    10.     switch(brush->shape)  /*根据画刷参数描绘不同的轨迹*/
    11.     {
    12.       /* 描绘1像素宽度的轨迹线 */
    13.       case LINE_SINGLE_PIXCEL:                 
    14.             if(pre_x< 0 || pre_y < 0) //新的笔迹
    15.             {      
    16.               PutPixel(x,y);              
    17.             }
    18.             else //继续上一次的笔迹
    19.             {      
    20.               LCD_DrawUniLine(pre_x,pre_y,x,y);
    21.             }
    22.         
    23.         break;
    24.             
    25.       case LINE_2_PIXCEL:
    26.         
    27.                                 if(x-1<PALETTE_START_X||pre_x-1<PALETTE_START_X)        //画板左边界
    28.                                         break;

    29.         /* 描绘2像素宽度的轨迹线 */
    30.         LCD_DrawUniLineCircle(pre_x,pre_y,x,y,1);
    31.         
    32.         break;
    33.       
    34.       case LINE_4_PIXCEL:
    35.                                
    36.                                 if(x-2<PALETTE_START_X||pre_x-2<PALETTE_START_X)        //画板左边界
    37.                                         break;
    38.         
    39.             LCD_DrawUniLineCircle(pre_x,pre_y,x,y,2);

    40.         break;
    41.       
    42.       case LINE_6_PIXCEL:
    43.         
    44.                                 if(x-3<PALETTE_START_X||pre_x-3<PALETTE_START_X)        //画板左边界
    45.                                         break;
    46.       
    47.         LCD_DrawUniLineCircle(pre_x,pre_y,x,y,3);
    48.         
    49.         break;
    50.       
    51.       case LINE_8_PIXCEL:
    52.                                
    53.                                 if(x-4<PALETTE_START_X||pre_x-4<PALETTE_START_X)        //画板左边界
    54.                                         break;
    55.         
    56.             LCD_DrawUniLineCircle(pre_x,pre_y,x,y,4);

    57.         break;
    58.       
    59.      case LINE_16_PIXCEL:
    60.                          
    61.                                  if(x-8<PALETTE_START_X||pre_x-8<PALETTE_START_X)        //画板左边界
    62.                                         break;
    63.         
    64.             LCD_DrawUniLineCircle(pre_x,pre_y,x,y,8);

    65.         break;
    66.             
    67.       case LINE_20_PIXCEL:
    68.                                
    69.                                 if(x-10<PALETTE_START_X ||pre_x-10<PALETTE_START_X)        //画板左边界
    70.                                         break;
    71.         
    72.             LCD_DrawUniLineCircle(pre_x,pre_y,x,y,10);

    73.         break;
    74.       
    75.       /*描绘带珠子的单像素线*/
    76.       case LINE_WITH_CIRCLE:  

    77.                                  if(x-3<PALETTE_START_X||pre_x-3<PALETTE_START_X)        //画板左边界
    78.                                         break;                       
    79.            
    80.             if(pre_x< 0 || pre_y< 0)//新的笔迹
    81.             {      
    82.               PutPixel(x,y);
    83.             }
    84.             else //继续上一次的笔迹
    85.             {      
    86.               LCD_DrawUniLine(pre_x,pre_y,x,y);
    87.               LCD_DrawFullCircle(x,y,3);
    88.             }
    89.         
    90.         break;
    91.            
    92.       /*橡皮功能*/            
    93.       case RUBBER:
    94.                                
    95.                                 if(x-20<PALETTE_START_X ||                                                //画板左边界
    96.                                           x+20>LCD_PIXEL_WIDTH || x-20<0 || //液晶左右边界
    97.                                                 y+20>LCD_PIXEL_HEIGHT || y-20<0)         //液晶上下边界                               
    98.                                         break;       
    99.                        
    100. //        if(x>PALETTE_START_X+20)
    101.         {
    102.                                                 LCD_SetColors(CL_WHITE,CL_WHITE);
    103.             
    104.                                                 LCD_DrawFullRect( x-40/2,
    105.                                 y-40/2,
    106.                                 40,
    107.                                 40);   
    108.       
    109.         }
    110.       break;

    111.     }
    112.   }
    113.   
    114.   /*退出局限画板的绘图窗口,bsp_lcd.c驱动还没有这样的函数,用于限制绘画窗口*/
    115. //  RA8875_SetActiveWindow(0,0,LCD_PIXEL_WIDTH,LCD_PIXEL_HEIGHT);


    116. }
    复制代码



    效果:
    1529125674467mz111.gif

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 08:52 , Processed in 0.116190 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.