ILI2130触控IC驱动

概述

ili2130触控网上有关的介绍很少,官网也没有有用的东西,所以记录一其驱动(MCU驱动)。此外ILI2520, ILI2521, ILI2322, ILI2323, ILI2316, ILI2326, ILI2130, ILI2131, ILI2132这几款触控IC使用的是同一个用户指导手册,他们的驱动方式一样,所以驱动原理也是大差不差。

引脚介绍

它可以使用IIC和USB通讯,我们选用的是IIC通信的,成品对外引脚有6根,分别是SDA,SCL,INT,RST,VCC,GND;其中SDA与SCL是IIC通讯引脚,INT是中断引脚,当TP芯片检测到触摸信号时,会拉低该引脚;单片机可检测该引脚的电平变化来判断是否读取TP的信息;RST是TP的复位引脚,VCC和GND分别为电源和地。

IIC通信

它使用的IIC通信,7位地址是0x41,读地址是0x83,写地址是0x82,一般出厂的IC里面已经写好了寄存器配置,不需要我们再去重新配置,所以这里主要是读取IC寄存器就行了,读取IC寄存器主要是如上的协议,注意一次最长读取31个字节大小,超过31个要重新发送一次读取信号。 

驱动程序 

首先是最底层的IIC读写,底层的IIC自己实现,我这里只写出读写实现,我使用的是模拟IIC

//向ILI2130写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
uint8_t ILI2130_WR_Reg(uint8_t reg,uint8_t *buf,uint8_t len)
{uint8_t i;uint8_t ret=0;CT_IIC_Start();	CT_IIC_Send_Byte(ILI_CMD_WR);   	//发送写命令 	 CT_IIC_Wait_Ack();CT_IIC_Send_Byte(reg);   	//发送高8位地址CT_IIC_Wait_Ack(); 	 										  		   for(i=0;i<len;i++){	   CT_IIC_Send_Byte(buf[i]);  	//发数据ret=CT_IIC_Wait_Ack();if(ret)break;  }CT_IIC_Stop();					//产生一个停止条件	    return ret; 
}//从ILI2130读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度			  
void ILI2130_RD_Reg(uint8_t reg,uint8_t *buf,uint8_t len)
{uint8_t i; CT_IIC_Start();	CT_IIC_Send_Byte(ILI_CMD_WR);   //发送写命令 	 CT_IIC_Wait_Ack();CT_IIC_Send_Byte(reg);   	//发送高8位地址CT_IIC_Wait_Ack(); 	 										  		   CT_IIC_Start();  	 	   CT_IIC_Send_Byte(ILI_CMD_RD);   //发送读命令		   CT_IIC_Wait_Ack();	   for(i=0;i<len;i++){	   buf[i]=CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据	  } CT_IIC_Stop();//产生一个停止条件    
} //从ILI2130继续读出一次数据,读取的字节数大于31字节后使用
//buf:数据缓缓存区
//len:读数据长度			  
void ILI2130_RD_Reg_Continue(uint8_t *buf,uint8_t len)
{uint8_t i; CT_IIC_Start();  	 	   CT_IIC_Send_Byte(ILI_CMD_RD);   //发送读命令		   CT_IIC_Wait_Ack();	   for(i=0;i<len;i++){	   buf[i]=CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据	  } CT_IIC_Stop();//产生一个停止条件    
} 

然后是ILI2130触摸芯片的初始化

void ILI2130_INT_Init(void)
{rcu_periph_clock_enable(ILI_INT_CLOCK);rcu_periph_clock_enable(RCU_SYSCFG);gpio_mode_set(ILI_INT_PORT,  GPIO_MODE_INPUT,  GPIO_PUPD_NONE,  ILI_INT_PIN);//模式设置gpio_output_options_set(ILI_INT_PORT,  GPIO_OTYPE_PP,  GPIO_OSPEED_50MHZ,  ILI_INT_PIN);	//输出设置#if 1	//打开中断的话,如果检测到按下则INT引脚会在每个检测周期都输出一个脉冲信号syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN8);exti_init(EXTI_8 , EXTI_INTERRUPT ,  EXTI_TRIG_FALLING);nvic_irq_enable(EXTI5_9_IRQn , 2, 0 );exti_interrupt_enable( EXTI_8);	#endif}//初始化ILI2130触摸屏
//返回值:0,初始化成功;1,初始化失败 
uint8_t ILI2130_Init(void)
{uint8_t temp[15] = {0}; //	rcu_periph_clock_enable(ILI_INT_CLOCK);
//	rcu_periph_clock_enable(ILI_RST_CLOCK);//	gpio_mode_set(ILI_INT_CLOCK,  GPIO_MODE_OUTPUT,  GPIO_PUPD_PULLUP,  ILI_INT_PIN);//模式设置
//	gpio_output_options_set(ILI_INT_CLOCK,  GPIO_OTYPE_PP,  GPIO_OSPEED_50MHZ,  ILI_INT_PIN);	//输出设置
//	gpio_bit_set(ILI_INT_PORT,  ILI_INT_PIN);	//默认输出低电平gpio_mode_set(ILI_RST_CLOCK,  GPIO_MODE_OUTPUT,  GPIO_PUPD_PULLUP,  ILI_RST_PIN);//模式设置gpio_output_options_set(ILI_RST_CLOCK,  GPIO_OTYPE_OD,  GPIO_OSPEED_50MHZ,  ILI_RST_PIN);	//输出设置gpio_bit_reset(ILI_RST_PORT,  ILI_RST_PIN);	//默认输出低电平CT_IIC_Init();      	//初始化电容屏的I2C总线  CT_IIC_Stop();ILI_RST(0);				//复位delay_ms(50);ILI_RST(1);				//释放复位		    ILI_RST(200); CT_IIC_Stop();ILI2130_INT_Init();ILI2130_RD_Reg(Get_Panel_Information_Reg,temp,15);//读取产品IDili2130_tp_dev.xfac = 480/(float)ILI2130_MAX_REPORT_VALUE_X;	//将触摸面板的坐标位置映射到屏幕坐标ili2130_tp_dev.yfac = 854/(float)ILI2130_MAX_REPORT_VALUE_y;printf("***%f,%f***\r\n",ili2130_tp_dev.xfac,ili2130_tp_dev.yfac);//	printf("ILI Info:\r\n");	//打印ID
//	for(int i=0;i<15;i++)
//	{
//		printf("%x ",temp[i]);
//	}
//	printf("\r\n<--------->\r\n");	//打印IDreturn 0;
}

 最后就是读取坐标位置


//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
uint8_t ILI2130_Scan(uint8_t mode)
{uint8_t sharebuf[31] = {0};uint16_t temp = 0,i=0;int x,y;ILI2130_RD_Reg(ILTK_GET_TH,sharebuf,31);//	printf("ILI touch:\r\n");	//打印ID
//	for(int i=0;i<31;i++)
//	{
//		printf("%x ",sharebuf[i]);
//	}
//	printf("\r\n<+++++++++++>\r\n");	//打印IDfor(i=0;i<6;i++){x = (sharebuf[5*i+3] << 8) | sharebuf[5*i+2] ;y = (sharebuf[5*i+5] << 8) | sharebuf[5*i+4] ;//触摸按下if(sharebuf[5*i+1]>>4){temp |= (1<<i);ili2130_tp_dev.sta = temp |TP_PRES_DOWN|TP_CATH_PRES;ili2130_tp_dev.x[i] = (int)(x * ili2130_tp_dev.xfac);ili2130_tp_dev.y[i] = (int)(y * ili2130_tp_dev.yfac);printf("<%d>(%d,%d), ",i, ili2130_tp_dev.x[i],ili2130_tp_dev.y[i]);}else{if(i==0){if(ili2130_tp_dev.sta & TP_PRES_DOWN){ili2130_tp_dev.x[0]=0xffff;ili2130_tp_dev.y[0]=0xffff;ili2130_tp_dev.sta&=0X00;	//清除点有效标记	}}		break;}}printf("\r\n");
}void EXTI5_9_IRQHandler(void)
{if(SET == exti_interrupt_flag_get( EXTI_8)){exti_interrupt_flag_clear(EXTI_8);exti_interrupt_disable(EXTI_8);printf("999\r\n");ILI2130_Scan(1);exti_interrupt_enable( EXTI_8);	}
}

注意事项

坐标位置映射

(非常重要)ILI2130读取0x10寄存器读取出来的值是相对与触控面板的坐标的并不是屏幕的,这点和我们使用GT9111直接读出屏幕XY坐标位置不一样,所以需要将触控面板的坐标映射到屏幕上,我们需要使用到ILI2130的XY最大返回值即分辨率,所以在我的初始化ILI2130函数内是有

    ili2130_tp_dev.xfac = 480/(float)ILI2130_MAX_REPORT_VALUE_X;    //将触摸面板的坐标位置映射到屏幕坐标
    ili2130_tp_dev.yfac = 854/(float)ILI2130_MAX_REPORT_VALUE_y;

这段程序映射的在 0x40寄存器有ILI2130的信息,如下

 从0x20处读取的0-1个字节是X最大分辨率,2-3为Y的最大分辨率;第4-5个字节为TOUCH配置的X方向通道数,第5-6个字节为TOUCH配置的Y方向的通道数,第7个字节为TOUCH配置的最大支持的手指触摸的个数,等等…
当有触摸时,触摸点的坐标可从0X10处读取,注意这个0x10寄存器位置是在手册并没有看到,而是在别人的文章里看到的基于单片机的ILI2132驱动调试-CSDN博客;触摸点坐标格式如下图:

如果使用IIC读取的话,读取0x10的第一个字节是0x48表示IIC,byte1是需要读取的手指坐标的状态,bit6表示是否有触摸,为1表示有触摸发生,0表示无效;bit0-bit5为该有效触摸点的ID,若为多点触控时,没跟手指触摸时对应的ID是不同的;byte2-byte3是触摸点的X坐标,byte4-5是触摸点的Y坐标;
屏实际对应的坐标通过下列公式计算:
X=((屏x轴分辨率)/ maximum X coordinate)(X Position )
Y=((屏y轴分辨率)/ maximumY coordinate)(Y Position )

这个手册上面写的是有10个触控点,但是实际需要看你所使用的芯片最大支持几个触控点,我所使用的ILI2130最大只有6个点。

读取坐标位置

/*
读取的0x20寄存器(15个字节):
C8 00 |90 01 |15 00 |0C 00 |0a |00 |01 |01        |00   |01 |08
200   |400   |21    |12    |10 |0  |   |modle  |格式 |   |

读取的0x10寄存器(51个字节):
48 |[40 b8 0 7c 1 ][0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 90 1 15 0] [c 0 a 0 1] [1 0 1 8 0] [0 0 0 0 0] 
IIC [0按下 184,380]

48 |[40 e 0 12 0 ][ 0 0 0 0 0][ 0 0 0 0 0][ 0 0 0 0 0][ 0 0 0 0 0 ][0 0 0 0 0 ][0 90 1 15 0 ][c 0 a 0 1 ][1 0 1 8 0 ][0 0 0 0 0]
    [0按下 14,18 ]

48 |[40 9 0 15 0][ 41 27 0 41 0][ 42 4b 0 78 0][ 43 51 0 dc 0][ 44 80 0 f9 0 ][45 94 0 46 1 ][0 90 1 15 0 ][c 0 a 0 1 ][1 0 1 8 0 ][0 0 0 0 0 ]
    [0> 9,21]     [1> 39,65]        [2> 75,120]        [3> 81,220]      [4> 128,249]    [5> 148,326]   
*/

测试没问题

驱动程序:https://download.csdn.net/download/qq_44675660/88756269

参考:基于单片机的ILI2132驱动调试-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吃瓜教程Task1:概览西瓜书+南瓜书第1、2章

由于本人之前已经学习过西瓜书&#xff0c;本次学习主要是对以往知识的查漏补缺&#xff0c;因此本博客记录了在学习西瓜书中容易混淆的点以及学习过程中的难点。更多学习内容可以参考下面的链接&#xff1a; 南瓜书的地址&#xff1a;https://github.com/datawhalechina/pumpk…

zabbix实验

目录 一、zabbix 自动发现与自动注册 1、zabbix 自动发现 ①关闭防火墙和安全机制 ②在服务端和客户端上配置 hosts 解析 ③在 Web 页面配置自动发现 2、zabbix 自动注册 ①环境准备 ②在服务端和客户端上配置 hosts 解析 ③修改 zabbix-agent2 配置文件 ④在 Web 页…

从静态到动态:视频美颜SDK在短视频平台的应用全面解析

为了在短视频平台上实现更出色的美颜效果&#xff0c;开发者们通常会借助视频美颜SDK。本文将深入探讨视频美颜SDK在短视频平台上的应用&#xff0c;从技术原理、性能优化到用户体验等方面进行全面解析。 一、技术原理与算法演进 视频美颜SDK的核心在于其算法&#xff0c;而…

企业网络扫描程序中需要的功能

网络扫描程序已成为每个 IT 管理员抵御安全漏洞的第一道防线不可或缺的一部分。使用正确的网络扫描程序工具进行有效的网络侦察和诊断&#xff0c;使管理员能够查明可能升级为安全风险和网络事故的网络问题。典型的网络扫描程序可以与 IP 扫描程序配合使用&#xff0c;按顺序扫…

Failed to start OpenSSH server daemon-SSH启动失败

一、SSH服务启动失败 或者报错误&#xff1a; journalctl -xe sshd.service 二、查看SSHD的服务状态 3、重新安装openssh [rootzbx ~]# yum -y remove openssh 卸载原来的 [rootzbx ~]# yum -y install openssh openssh-clients openssh-server 重新安装 [rootzbx ~]# system…

用冒泡排序谈默认参数应用

前面在调用函数提到为了将信息打印到ofil中&#xff0c;前面提到的办法是 ofstream ofil("text_out1"); void bubble_sort(vector<int> vec){ } 在file scope中定义ofil&#xff0c;这是一个不受欢迎的举动。这样比较难在其他环境重用 一般的程序编写法则是&…

学习Redux:React状态管理的简明指南

学习Redux&#xff1a;React状态管理的简明指南 一、Redux介绍 Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管理应用的状态 为什么要使用Redux&…

linux基础学习(4):rpm包与相关命令

1.linux内的软件包分类 linux只有2种软件包&#xff1a;源码包 与 二进制包 &#xff08;1&#xff09;源码包 源码包就是开源的源程序包&#xff0c;使用者可以直接看到其程序&#xff0c;也可以进行修改 &#xff08;2&#xff09;二进制包 由于源码包安装难度大&#x…

【k8s】Kubernetes技术和相关命令简介

一、 Kubernetes简介 Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。kubernetes&#xff0c;简称K8s&#xff0…

C# 读取ini文件示例

一般使用一个相关win32 api的封装类&#xff1b;我用的如下&#xff1b; using System; using System.Runtime.InteropServices; using System.Text;namespace DotNet.Utilities {/// <summary>/// INI文件读写类。/// </summary>public class INIFile{public str…

【总结】Linux命令中文帮助手册

1. 为什么要总结Linux命令中文帮助手册 Linux 官方并不提供中文的 help、man 帮助手册。网络上已有的前人翻译过的中文手册版本比较老&#xff0c;且翻译存在误差。从记忆角度来看&#xff0c;Linux 很多命令都不一定记得住详细的用法&#xff0c;易遗忘&#xff0c;缺少经验总…

Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)

Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里使用OpenCV实现相机图像的显示联合OpenCV实现相机图像的显示测试演示图 工业相机通过使用OpenCV实现…

Databend x HuggingFace,海量数据,随心分析

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09; 澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer https://github.com/PsiACE HuggingFace 是目前全球最流行的 AI 社区&#xff0c;推动数据科学家和企业在模型、数据…

Numpy的学习 第一课 了解以及使用

1.输入模式 1.编辑模式 绿色2.命令模式 蓝色 2.运行 直接输入jupyter notebook 3.文档注释 查看函数帮助文档命令 help(函数) 单问号与多问号 单问号显示文档 多问号显示文档代码 3.shifttab 显示参数 4.运行外部文件 %run 路径,可绝对可相对 这里运行了就相当于方法了,或者…

VRPSolverEasy:支持VRP问题快速建模的精确算法Python包

文章目录 前言一步步安装免费版主要模块介绍1. depot point2. customer point3. links4. vehicle type VRPTW 算例数据说明模型建立输出求解状态及结果 前言 VRPSolverEasy 是用于车辆路径问题&#xff08;VRP&#xff09;的最先进的分支切割和定价算法求解器1&#xff0c;它的…

某国产沙盒游戏的启动器逆向

游戏近期改变了登录方式&#xff0c;于是把之前的研究成果分享一下研究仅供学习交流&#xff0c;如有侵权请联系删除 抓包 启动启动器&#xff0c;输入账号密码&#xff0c;点击登录&#xff0c;抓包得到一些信息 接口 1 https://wskacchm.mini1.cn:14100/login/auth_secur…

命令行参数环境变量和进程空间地址

文章目录 命令行参数环境变量进程地址空间 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 命令行参数 什么是命令行参数&#xff1f; 我…

存储任意类型

code /* * c17 std::any */#include <cstdint> #include <cstring> #include <cstdlib> #include <iostream> #include <thread> #include <chrono>namespace lxz {// T不为指针时 template<typename T> struct Data {Data(): data…

QT第六天

要求&#xff1a;使用QT绘图&#xff0c;完成仪表盘绘制&#xff0c;如下图。 素材 运行效果&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPen>QT_BEGIN_NAMESPACE name…

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …