ST1633I-沁恒微CH554-IC代码
立即下载
资源介绍:
ST1633I-沁恒微CH554-IC代码
/********************************** (C) COPYRIGHT *******************************
* File Name : ST1633I.C
* Author : GJ
* Version : V2.00
* Date : 2018-7-10
* Description : 电容触摸IC触摸IC驱动
*******************************************************************************/
#include "STX1633I.H"
const UINT16 ST1633I_TPX_TBL[10]= /* 兼容所有系列,10个手指都支持 */
{
ST_TP0_REG,
ST_TP1_REG,
ST_TP2_REG,
ST_TP3_REG,
ST_TP4_REG,
ST_TP5_REG,
ST_TP6_REG,
ST_TP7_REG,
ST_TP8_REG,
ST_TP9_REG,
};
/*******************************************************************************
* Function Name : ST1633I_WR_Reg
* Description : 向ST1633I写入一次数据
* Input : reg:起始寄存器地址
buf:数据缓缓存区
len:写数据长度
* Output : None
* Return : 0,成功;1,失败.
*******************************************************************************/
static UINT8 ST1633I_WR_Reg(UINT8 reg,UINT8 *buf,UINT8 len)
{
UINT8 i;
UINT8 ret=0;
IIC_Start();
IIC_Send_Byte(ST_CMD_WR); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(reg); //发送高8位地址
IIC_Wait_Ack();
for(i=0;i>4){
case 0x00: printf("No error\r\n");break;
case 0x01: printf("Invalid Address\r\n");break;
case 0x02: printf("Invalid Value\r\n");break;
case 0x03: printf("Invalid Platform\r\n");break;
case 0x04: printf("Dev Not Found\r\n");break;
case 0x05: printf("Stack Overflow\r\n");break;
case 0x06: printf("Invalid Firmware Parameter Table\r\n");break;
case 0x07: printf("Invalid Secondary Touch Firmware\r\n");break;
default:printf("Reserverd!\r\n");
}
}
/*******************************************************************************
* Function Name : ST_GetPanelInfo
* Description : 使用命令码从控制器读取X、Y分辨率。
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ST_GetPanelInfo(void)
{
// 读取XY分辨率高字节寄存器
ST1633I_RD_Reg(XY_RESOLUTION_HIGH, ShareBuf, 3);
// 组合X轴分辨率,高3位在分辨率高字节的第4到6位,低8位在x_low
CTP_Info.x_max_pos =(((UINT16)(ShareBuf[0] & (X_RES_H_BMSK << X_RES_H_SHFT)) << 4) | ShareBuf[1]);
// 组合Y轴分辨率,高2位在分辨率高字节的第0到2位(即0x07),低8位在y_low
CTP_Info.y_max_pos = (((UINT16)(ShareBuf[0] & Y_RES_H_BMSK) << 8) | ShareBuf[2]);
// printf("XY_RESOLUTION_HIGH:%2x\n",(UINT16)ShareBuf[0]);
// printf("X_RESOLUTION_LOW:%2x\n",(UINT16)ShareBuf[1]);
// printf("Y_RESOLUTION_LOW:%2x\n",(UINT16)ShareBuf[2]);
printf("cpt x:%d y:%d\n",CTP_Info.x_max_pos,CTP_Info.y_max_pos);
ST1633I_RD_Reg(FIRMWARE_VERSION,ShareBuf,1);
printf("ver:%d\n",ShareBuf[0]);
ST1633I_RD_Reg(FIRMWARE_REVISION_3, ShareBuf, 4);
printf("fw revision = %d %d %d %d\n", (UINT16)ShareBuf[0],(UINT16)ShareBuf[1],(UINT16)ShareBuf[2], (UINT16)ShareBuf[3]);
}
/*******************************************************************************
* Function Name : ST1633I_Init
* Description : 触摸板初始化,获取ID,确认是否工作,TP的初始化接口,IC上电后会自动初始化,一般不需要特殊实现
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ST1633I_Init(void)
{
MAX_POINT = 6;
I2c_Init();
#if DE_PRINTF
printf("ST init\n");
#endif
// 配置触摸屏控制器的中断和复位引脚
CTP_INT(1);
CTP_RST(0);
// 等待一段时间后释放复位
mDelaymS(50);
CTP_RST(1);
mDelaymS(200); // 必须要延时100多ms
ST_GetStatusInfo();
ST1633I_RD_Reg(STATUS_REG,&ShareBuf[0],1); //如果没有任何状态异常,就说明没有问题,成功初始化
while((ShareBuf[0]&0xF0)!=0){
ST1633I_RD_Reg(STATUS_REG,&ShareBuf[0],1);
printf("初始化...ing\r\n");
}
printf("Error Code:%d\r\n",(ShareBuf[0]&0xF0));
printf("ST init OK!\r\n");
ST_GetPanelInfo();
Get_Config_Info();
CTP_Info.X_Resolution = 4096 / (float)CTP_Info.x_max_pos;
CTP_Info.Y_Resolution = 4096 / (float)CTP_Info.y_max_pos;
#if DE_PRINTF
printf("cpt x:%d y:%d\n",CTP_Info.x_max_pos,CTP_Info.y_max_pos);
printf("ratio: %f %f\n",CTP_Info.X_Resolution,CTP_Info.Y_Resolution);
#endif
}
// 根据寄存器地址获取触摸点ID的函数
UINT16 GetTouchPointID(UINT8 regAddress) {
switch (regAddress) {
case ST_TP0_REG: return 0;
case ST_TP1_REG: return 1;
case ST_TP2_REG: return 2;
case ST_TP3_REG: return 3;
case ST_TP4_REG: return 4;
case ST_TP5_REG: return 5;
case ST_TP6_REG: return 6;
case ST_TP7_REG: return 7;
case ST_TP8_REG: return 8;
case ST_TP9_REG: return 9;
default: return 255; // 如果地址不匹配任何已知寄存器,返回一个无效的ID
}
}
/*******************************************************************************
* Function Name : ST1633I_Touch_Check
* Description : 按键检测与上传
* Input : None
* Output : None
* Return : None
*******************************************************************************/
UINT8 ST1633I_Touch_Check( void )
{
if( CTP_Info.IRQ_Flag == 1 )
{
if( ST1633I_Scan() == 1 )
{
Absolute_Up_Pack( &TP, CTP_Info.Press_Flag );
}
CTP_Info.IRQ_Flag = 0;
EX0 = 1;
}
return 0;
}
/*******************************************************************************
* Function Name : ST1633I_Scan
* Description : 扫描触摸屏(采用查询方式)
* Input : None
* Output : None
* Return : 0,触屏无触摸;1,触屏有触摸
*******************************************************************************/
UINT8 ST1633I_Scan( void )
{
// 初始化用于存储触摸点数量的变量
UINT16 id ; //当前这次ID位域
UINT16 i;
UINT8 point_num;
UINT16 point_id;
UINT16 valid;
// 读取触摸屏控制器中注册表的值,获取当前触摸点的数量
ST1633I_RD_Reg(MAX_NUM_TOUCHES,&point_num,1);
id = 0;
printf("point_num:%d\r\n",(UINT16)point_num);
printf("MAX_POINT:%d\r\n",(UINT16)MAX_POINT);
// 根据触摸点的数量进行处理,确保不超过最大支持的触摸点数量
if(point_num > MAX_POINT) point_num = MAX_POINT;
// 遍历每个触摸点,读取并处理其信息
for( i = 0; i != point_num; i++ )
{
// 从控制器中读取触摸点的具体�