264 lines
8.3 KiB
C
264 lines
8.3 KiB
C
#include "CST816.h"
|
||
|
||
#define TOUCH_OFFSET_Y 15
|
||
|
||
CST816_Info CST816_Instance;
|
||
|
||
iic_bus_t CST816_dev =
|
||
{
|
||
.IIC_SDA_PORT = GPIOB,
|
||
.IIC_SCL_PORT = GPIOB,
|
||
.IIC_SDA_PIN = GPIO_PIN_4,
|
||
.IIC_SCL_PIN = GPIO_PIN_6,
|
||
};
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_GPIO_Init
|
||
* 功能说明: CST816 GPIO口初始化
|
||
* 形 参:none
|
||
* 返 回 值: none
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_GPIO_Init(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure = {0};
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||
|
||
/* 初始化复位引脚 */
|
||
GPIO_InitStructure.Pin = TOUCH_RST_PIN;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStructure.Pull = GPIO_PULLUP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||
HAL_GPIO_Init(TOUCH_RST_PORT, &GPIO_InitStructure);
|
||
|
||
HAL_GPIO_WritePin(TOUCH_RST_PORT,TOUCH_RST_PIN,GPIO_PIN_SET);
|
||
|
||
/* 初始化中断引脚,不用中断的话屏蔽掉 */
|
||
|
||
/* 初始化I2C引脚 */
|
||
IICInit(&CST816_dev);
|
||
|
||
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
|
||
//IICStop(&CST816_dev);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Init
|
||
* 功能说明: CST816初始化
|
||
* 形 参:none
|
||
* 返 回 值: none
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Init(void)
|
||
{
|
||
CST816_GPIO_Init();
|
||
CST816_Config_AutoSleepTime(5);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_IIC_ReadREG
|
||
* 功能说明: 读取触摸屏单个寄存器的数据
|
||
* 形 参:reg:寄存器地址
|
||
* 返 回 值: 返回寄存器存储的数据
|
||
*********************************************************************************************************
|
||
*/
|
||
uint8_t CST816_IIC_ReadREG(uint8_t addr)
|
||
{
|
||
return IIC_Read_One_Byte(&CST816_dev,Device_Addr,addr);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_IIC_WriteREG
|
||
* 功能说明: 向触摸屏的寄存器写入数据
|
||
* 形 参:addr:寄存器地址
|
||
* dat: 写入的数据
|
||
* 返 回 值: 返回寄存器存储的数据
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_IIC_WriteREG(uint8_t addr, uint8_t dat)
|
||
{
|
||
IIC_Write_One_Byte(&CST816_dev,Device_Addr,addr,dat);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: TOUCH_RESET
|
||
* 功能说明: 触摸屏复位
|
||
* 形 参:无
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_RESET(void)
|
||
{
|
||
TOUCH_RST_0;
|
||
HAL_Delay(10);
|
||
TOUCH_RST_1;
|
||
HAL_Delay(100);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: TOUCH_READ_X
|
||
* 功能说明: 读取触摸屏在触摸时的坐标值
|
||
* 形 参:无
|
||
* 返 回 值: 无 (数据存储在CST816_Instance结构体中)
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Get_XY_AXIS(void)
|
||
{
|
||
uint8_t DAT[4];
|
||
IIC_Read_Multi_Byte(&CST816_dev,Device_Addr,XposH,4,DAT);
|
||
CST816_Instance.X_Pos=((DAT[0]&0x0F)<<8)|DAT[1];//(temp[0]&0X0F)<<4|
|
||
CST816_Instance.Y_Pos=((DAT[2]&0x0F)<<8)|DAT[3] + TOUCH_OFFSET_Y;//(temp[2]&0X0F)<<4|
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Get_FingerNum
|
||
* 功能说明: 读取触摸屏的手指触摸个数,0xFF为睡眠
|
||
* 形 参:无
|
||
* 返 回 值: 返回芯片ID
|
||
*********************************************************************************************************
|
||
*/
|
||
uint8_t CST816_Get_FingerNum(void)
|
||
{
|
||
return CST816_IIC_ReadREG(FingerNum);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Get_ChipID
|
||
* 功能说明: 读取触摸屏的芯片ID
|
||
* 形 参:无
|
||
* 返 回 值: 返回芯片ID
|
||
*********************************************************************************************************
|
||
*/
|
||
uint8_t CST816_Get_ChipID(void)
|
||
{
|
||
return CST816_IIC_ReadREG(ChipID);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_MotionMask
|
||
* 功能说明: 使能连续动作(连续左右滑动,连续上下滑动,双击)
|
||
* 形 参:mode:模式(5种)
|
||
* 返 回 值: 无
|
||
* 注 意:使能连续动作会增加响应时间
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_MotionMask(uint8_t mode)
|
||
{
|
||
CST816_IIC_WriteREG(MotionMask,mode);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_AutoSleepTime
|
||
* 功能说明: 规定time内无触摸,自动进入低功耗模式
|
||
* 形 参:time:时间(s)
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_AutoSleepTime(uint8_t time)
|
||
{
|
||
CST816_IIC_WriteREG(AutoSleepTime,time);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Sleep
|
||
* 功能说明: 进入睡眠,无触摸唤醒功能
|
||
* 形 参:无
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Sleep(void)
|
||
{
|
||
CST816_IIC_WriteREG(SleepMode,0x03);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Wakeup
|
||
* 功能说明: 唤醒
|
||
* 形 参:无
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Wakeup(void)
|
||
{
|
||
CST816_RESET();
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_MotionSlAngle
|
||
* 功能说明: 手势检测滑动分区角度控制。Angle=tan(c)*10 c为以x轴正方向为基准的角度。
|
||
* 形 参:x_right_y_up_angle:角度值
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_MotionSlAngle(uint8_t x_right_y_up_angle)
|
||
{
|
||
CST816_IIC_WriteREG(MotionSlAngle,x_right_y_up_angle);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_NorScanPer
|
||
* 功能说明: 正常快速检测周期配置函数。
|
||
* 此值会影响到LpAutoWakeTime和AutoSleepTime。
|
||
* 单位10ms,可选值:1~30。默认值为1。
|
||
* 形 参:Period:周期值
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_NorScanPer(uint8_t Period)
|
||
{
|
||
if(Period >= 30)
|
||
Period = 30;
|
||
CST816_IIC_WriteREG(NorScanPer,Period);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_IrqPluseWidth
|
||
* 功能说明: 中断低脉冲输出宽度配置函数
|
||
* 形 参:Period:周期值
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_IrqPluseWidth(uint8_t Width)
|
||
{
|
||
if(Width >= 200)
|
||
Width = 200;
|
||
CST816_IIC_WriteREG(IrqPluseWidth,Width);
|
||
}
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: CST816_Config_NorScanPer
|
||
* 功能说明: 低功耗扫描唤醒门限配置函数。越小越灵敏。默认值48
|
||
* 形 参:TH:门限值
|
||
* 返 回 值: 无
|
||
*********************************************************************************************************
|
||
*/
|
||
void CST816_Config_LpScanTH(uint8_t TH)
|
||
{
|
||
CST816_IIC_WriteREG(LpScanTH,TH);
|
||
}
|