ST1633I_沁恒微CH554_IC代码
头文件定义:
/* 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 */