ST1633I_沁恒微CH554_IC代码

ST1633I_沁恒微CH554_IC代码

电容屏源码兼容版(190422).zip

头文件定义:

/* REG INFO */
/********************************** (C) COPYRIGHT *******************************
* File Name          : ST1633I.H
* Author             : GJ
* Version            : V2.0
* Date               : 2018-7-10 
* Description        : define of TP IC ST1633I
*******************************************************************************/
#ifndef __STX1633I_H__
#define __STX1633I_H__

#include "DEBUG.H"
#include "FLASH_IC.H"
#include "IIC.H"
#include "DEVICE.H"
#include "CONFIG.H"


/* ST1633I设备地址选择 */
//I2C读写命令
#define ST_CMD_WR 		0XAA     	//写命令
#define ST_CMD_RD 		0XAB		//读命令

//ST1633I 部分寄存器定义 
typedef enum{
	FIRMWARE_VERSION,
	STATUS_REG,
	DEVICE_CONTROL_REG,
	TIMEOUT_TO_IDLE_REG,
	XY_RESOLUTION_HIGH,
	X_RESOLUTION_LOW,
	Y_RESOLUTION_LOW,
	Sense_Counter_HIGH,
	Sense_Counter_LOW,
	FIRMWARE_REVISION_3 = 0x0C,
	FIRMWARE_REVISION_2,
	FIRMWARE_REVISION_1,
	FIRMWARE_REVISION_0,
	FINGERS,
	KEYS_REG,
	XY0_COORD_H,
	X0_COORD_L,
	Y0_COORD_L,
	MAX_NUM_TOUCHES = 0x3F,
	MISC_Info = 0xF0,
	MISC_CONTROL,
	SMART_WAKE_UP_REG,
	PAGE_REG = 0xFF,
}RegisterOffset;


#define X_RES_H_SHFT 4
#define X_RES_H_BMSK 0xf
#define Y_RES_H_SHFT 0
#define Y_RES_H_BMSK 0xf
#define FINGERS_SHFT 0
#define FINGERS_BMSK 0xf
#define X_COORD_VALID_SHFT 7
#define X_COORD_VALID_BMSK 0x1
#define X_COORD_H_SHFT 4
#define X_COORD_H_BMSK 0x7
#define Y_COORD_H_SHFT 0
#define Y_COORD_H_BMSK 0x7
#define SITRONIX_MAX_SUPPORTED_POINT 10

typedef enum{
	XY_COORD_H,
	X_COORD_L,
	Y_COORD_L,
	PIXEL_DATA_LENGTH_B,
	PIXEL_DATA_LENGTH_A,
}PIXEL_DATA_FORMAT;

#define ST_TP0_REG 		0x12      	//第一个触摸点数据地址
#define ST_TP1_REG 		0x16        		//第二个触摸点数据地址
#define ST_TP2_REG 		0x1A        		//第三个触摸点数据地址
#define ST_TP3_REG 		0x1E        		//第四个触摸点数据地址
#define ST_TP4_REG 		0x22    		//第五个触摸点数据地址  
#define ST_TP5_REG 		0x26    		//第六个触摸点数据地址  
#define ST_TP6_REG 		0x2A    		//第七个触摸点数据地址  
#define ST_TP7_REG 		0x2E    		//第八个触摸点数据地址  
#define ST_TP8_REG 		0x32    		//第九个触摸点数据地址  
#define ST_TP9_REG  	0x36    		//第十个触摸点数据地址  
		
/* 外部定义声明 */
extern POINTER TP[ 10 ];
extern CTP_INFO CTP_Info;
extern UINT8 ShareBuf[];

/* Function Define */
extern UINT8  ST1633I_Send_Cfg              ( void );
extern void 	ST1633I_Init			        ( void );
extern UINT8 	ST1633I_Touch_Check			( void );
extern UINT8 	ST1633I_Scan					( void );

#endif

/* END OF FILE */

c文件定义:

/********************************** (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<len;i++)
	{
    IIC_Send_Byte(buf[i]);  	//发数据
		ret=IIC_Wait_Ack();
		if(ret)break;  
	}
	IIC_Stop();					//产生一个停止条件	  
	return ret; 
}

/*******************************************************************************
* Function Name  : ST1633I_RD_Reg
* Description    : 从ST1633I读出一次数据
* Input          : reg:起始寄存器地址
                   buf:数据缓缓存区
                   len:读数据长度			  
* Output         : None
* Return         : None
*******************************************************************************/
static void ST1633I_RD_Reg(UINT8 reg,UINT8 *buf,UINT8 len)
{
	UINT8 i; 
 	IIC_Start();
 	IIC_Send_Byte(ST_CMD_WR);   					/* 发送写命令 */
	IIC_Wait_Ack(); 
 	IIC_Send_Byte(reg);   						    /* 发送8位地址 */
	IIC_Wait_Ack(); 
	IIC_Stop();										/* 产生一个停止条件 */

 	IIC_Start();
	IIC_Send_Byte(ST_CMD_RD);   					/* 发送读命令 */
	IIC_Wait_Ack(); 
	for(i=0;i<len;i++) 
	{
    	buf[i]=IIC_Read_Byte(i==(len-1)?0:1); 		/* 发数据 */
	}
    IIC_Stop();										/* 产生一个停止条件 */
} 

void ST_GetStatusInfo(void){
	ST1633I_RD_Reg(STATUS_REG,&ShareBuf[0],1);  
	printf("Status Code:");
	switch(ShareBuf[0]&0x0F){
		case 0x00:	printf("Normal\r\n");break;
		case 0x01:	printf("Init\r\n");break;
		case 0x02:	printf("ERROR\r\n");break;
		case 0x03:	printf("Auto Tuning\r\n");break;
		case 0x04:	printf("Idle\r\n");break;
		case 0x05:	printf("Power Down\r\n");break;
		case 0x06:	printf("Boot ROM\r\n");break;
		case 0x07:	printf("Waiting to execute Sub-AP\r\n");break;
		case 0x08:	printf("Pre-SmartWakeup\r\n");break;
		case 0x09:	printf("SmartWakeup\r\n");break;
		default:printf("Reserverd!\r\n");
	}

	printf("Error Code:");
	switch((ShareBuf[0]&0xF0)>>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++ )
    {
        // 从控制器中读取触摸点的具体数据
        ST1633I_RD_Reg( ST1633I_TPX_TBL[i], ShareBuf, 3 );//读三个字节
				point_id=GetTouchPointID(ST1633I_TPX_TBL[i]);
		
		  	valid= ShareBuf[0] >> X_COORD_VALID_SHFT;
			
				printf("Address:%x:valid:%x;pointid:%d\r\n",ST1633I_TPX_TBL[i],valid,point_id);
				printf("i:%d,0:%2x;1:%2x;2:%2x;\r\n",i,(UINT16)ShareBuf[0],(UINT16)ShareBuf[1],(UINT16)ShareBuf[2]);

        // 检查触摸点是否有效,避免处理无效数据
        if( valid )
        {
					   // 更新触摸点的状态和位置信息
            id |= (1<<point_id);
            TP[ point_id ].Tip_Switch = 1;
            TP[ point_id ].Contact_Identifier = point_id;

						if( CTP_Info.x_y_swap == 1 )
            {
                TP[point_id].Y_pos = (((UINT16)( ShareBuf[0] & (X_COORD_H_BMSK << X_COORD_H_SHFT)) << 4) |ShareBuf[1]) * CTP_Info.X_Resolution;
                TP[point_id].X_pos = (((UINT16)( ShareBuf[0] & Y_COORD_H_BMSK) << 8)|ShareBuf[2]) * CTP_Info.Y_Resolution;
            }
            else
            {
                TP[point_id].X_pos = (((UINT16)( ShareBuf[0] & (X_COORD_H_BMSK << X_COORD_H_SHFT)) << 4) |ShareBuf[1]) * CTP_Info.X_Resolution;
                TP[point_id].Y_pos = (((UINT16)( ShareBuf[0] & Y_COORD_H_BMSK) << 8)|ShareBuf[2]) * CTP_Info.Y_Resolution;                      
            }
						printf("(x:%d,y:%d)\r\n",(UINT16)TP[point_id].X_pos,(UINT16)TP[point_id].Y_pos);
					
						// 设置分辨率倍率
						TP[point_id].Resolution_Multi = 0x0030;
					
								// 根据x_mirror标志,对X坐标进行镜像处理
						if ( CTP_Info.x_mirror == 1 )
						{
							TP[point_id].X_pos = 4096 - TP[point_id].X_pos;
						}
					
						// 根据y_mirror标志,对Y坐标进行镜像处理
						if ( CTP_Info.y_mirror == 1 )
						{
							TP[point_id].Y_pos = 4096 - TP[point_id].Y_pos;
						}	

        }      
    }
    // 清除所有未被检测到的触摸点的状态
    // 根据id相应位为0,清零TP[].Tip_Switch
    for(i=0;i!=MAX_POINT;i++)
    {
        if((id & (1<<i)) == 0)
        {
            TP[i].Tip_Switch = 0;          
        }
    }
    // 更新触摸状态标志,用于外部查询
    CTP_Info.Press_Flag = id;                                //按下标志位域  

    return 1;
}

#endif

/* END OF FILE */

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值