FT6336触摸驱动

发布于:2025-04-21 ⋅ 阅读:(79) ⋅ 点赞:(0)

FT6336.c

#include "FT6336.h"  

FT6336U_Info FT6336U_Instance;

iic_bus_t FT6336U_dev =
{
	.IIC_SDA_PORT = GPIOB,
	.IIC_SCL_PORT = GPIOB,
	.IIC_SDA_PIN = GPIO_PIN_4,
	.IIC_SCL_PIN = GPIO_PIN_6,
};
/*
*********************************************************************************************************
*	函 数 名: FT6336U_GPIO_Init
*	功能说明: FT6336U GPIO口初始化
*	形    参:none
*	返 回 值: none
*********************************************************************************************************
*/
void FT6336U_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(&FT6336U_dev);
}
/*
*********************************************************************************************************
*	函 数 名: FT6336_IIC_WriteREG
*	功能说明: 向触摸屏的寄存器写入数据
*	形    参:addr:寄存器地址
*						dat:	写入的数据
*	返 回 值: 返回寄存器存储的数据
*********************************************************************************************************
*/
void FT6336U_IIC_WriteREG(uint8_t addr, uint8_t dat)
{
	IIC_Write_One_Byte(&FT6336U_dev,FT6336U_DEVICE_ADDR,addr,dat);
}
/*
*********************************************************************************************************
*	函 数 名: FT6336_Config_AutoSleepTime
*	功能说明: 规定time内无触摸,自动进入低功耗模式
*	形    参:time:时间(s)
*	返 回 值: 无
*********************************************************************************************************
*/
void FT6336U_Config_AutoSleepTime(uint8_t time)
{
	FT6336U_IIC_WriteREG(AutoSleepTime,time);
}

/*
*********************************************************************************************************
*	函 数 名: FT6336U_Init
*	功能说明: FT6336U初始化
*	形    参:none
*	返 回 值: none
*********************************************************************************************************
*/
void FT6336U_Init(void)
{
    FT6336U_GPIO_Init();
}
/*
*********************************************************************************************************
*	函 数 名: FT6336U_IIC_ReadREG
*	功能说明: 读取触摸屏单个寄存器的数据
*	形    参:reg:寄存器地址
*	返 回 值: 返回寄存器存储的数据
*********************************************************************************************************
*/
uint8_t FT6336U_IIC_ReadREG(uint8_t addr)
{
    return IIC_Read_One_Byte(&FT6336U_dev, FT6336U_DEVICE_ADDR, addr);
}
/*
*********************************************************************************************************
*	函 数 名: FT6336U_RESET
*	功能说明: 触摸屏复位
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void FT6336U_RESET(void)
{
    TOUCH_RST_0;
    HAL_Delay(10);
    TOUCH_RST_1;
    HAL_Delay(100);
}
/*
*********************************************************************************************************
*	函 数 名: FT6336U_Get_XY_AXIS
*	功能说明: 读取触摸屏在触摸时的坐标值
*	形    参:无
*	返 回 值: 无 (数据存储在FT6336U_Instance结构体中)
*********************************************************************************************************
*/
void FT6336U_Get_XY_AXIS(void)
{
    uint8_t DAT[4];
    IIC_Read_Multi_Byte(&FT6336U_dev, FT6336U_DEVICE_ADDR, 0x03, 4, DAT);
    FT6336U_Instance.X_Pos = 240 - (((DAT[0] & 0x0F) << 8) | DAT[1]);
    FT6336U_Instance.Y_Pos = 320 - (((DAT[2] & 0x0F) << 8) | DAT[3]);
}
/*
*********************************************************************************************************
*	函 数 名: FT6336U_Get_FingerNum
*	功能说明: 读取触摸屏的手指触摸个数,0xFF为睡眠
*	形    参:无
*	返 回 值: 返回芯片ID
*********************************************************************************************************
*/
uint8_t FT6336U_Get_FingerNum(void)
{
    return FT6336U_IIC_ReadREG(0x02);  // 假设手指触摸个数寄存器地址为0x02
}
/*
*********************************************************************************************************
*	函 数 名: FT6336U_Get_ChipID
*	功能说明: 读取触摸屏的芯片ID
*	形    参:无
*	返 回 值: 返回芯片ID
*********************************************************************************************************
*/
uint8_t FT6336U_Get_ChipID(void)
{
    return FT6336U_IIC_ReadREG(0xA8);  // FT6336U的芯片ID寄存器地址通常为0xA8
}



/*
*********************************************************************************************************
*	函 数 名: FT6336U_Sleep
*	功能说明: 进入睡眠,无触摸唤醒功能
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void FT6336U_Sleep(void)
{
    // 假设FT6336U进入睡眠模式的操作是写入特定寄存器
      FT6336U_IIC_WriteREG(0x86, 0x00);
}

/*
*********************************************************************************************************
*	函 数 名: FT6336U_Wakeup
*	功能说明: 唤醒
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void FT6336U_Wakeup(void)
{
    FT6336U_RESET();
}


FT6336.h

#ifndef _FT6336_H_
#define _FT6336_H_

#include "stm32f4xx.h"                  // Device header
#include "i2cmy.h"



/* 触摸屏坐标结构体 */
typedef struct
{
	unsigned int X_Pos;
	unsigned int Y_Pos;
} FT6336U_Info;

extern FT6336U_Info FT6336U_Instance;
//触摸屏复位引脚
#define TOUCH_RST_PORT GPIOA
#define TOUCH_RST_PIN GPIO_PIN_15
//触摸屏中断引脚
#define TOUCH_INT_PORT GPIOB
#define TOUCH_INT_PIN GPIO_PIN_1
/* functions define */
#define TOUCH_RST_0 HAL_GPIO_WritePin(TOUCH_RST_PORT, TOUCH_RST_PIN, GPIO_PIN_RESET)
#define TOUCH_RST_1 HAL_GPIO_WritePin(TOUCH_RST_PORT, TOUCH_RST_PIN, GPIO_PIN_SET)

#define AutoSleepTime 	0x87 //无触摸后自动进入休眠模式
#define FT6336U_DEVICE_ADDR 0x38  // FT6336U的默认I2C地址
#define TOUCH_OFFSET_Y 0

void FT6336U_GPIO_Init(void);
void FT6336U_IIC_WriteREG(uint8_t addr, uint8_t dat);
void FT6336U_Config_AutoSleepTime(uint8_t time);
void FT6336U_Init(void);
uint8_t FT6336U_IIC_ReadREG(uint8_t addr);
void FT6336U_RESET(void);
void FT6336U_Get_XY_AXIS(void);
uint8_t FT6336U_Get_FingerNum(void);
uint8_t FT6336U_Get_ChipID(void);
void FT6336U_Sleep(void);
void FT6336U_Wakeup(void);

#endif

i2cmy.c

#include "i2cmy.h"
#include "delay.h"

/**
  * @brief SDA线输入模式配置
  * @param None
  * @retval None
  */
void SDA_Input_Mode(iic_bus_t *bus)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = bus->IIC_SDA_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(bus->IIC_SDA_PORT, &GPIO_InitStructure);
}

/**
  * @brief SDA线输出模式配置
  * @param None
  * @retval None
  */
void SDA_Output_Mode(iic_bus_t *bus)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = bus->IIC_SDA_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(bus->IIC_SDA_PORT, &GPIO_InitStructure);
}

/**
  * @brief SDA线输出一个位
  * @param val 输出的数据
  * @retval None
  */
void SDA_Output(iic_bus_t *bus, uint16_t val)
{
    if ( val )
    {
        bus->IIC_SDA_PORT->BSRR |= bus->IIC_SDA_PIN;
    }
    else
    {
        bus->IIC_SDA_PORT->BSRR = (uint32_t)bus->IIC_SDA_PIN << 16U;
    }
}

/**
  * @brief SCL线输出一个位
  * @param val 输出的数据
  * @retval None
  */
void SCL_Output(iic_bus_t *bus, uint16_t val)
{
    if ( val )
    {
        bus->IIC_SCL_PORT->BSRR |= bus->IIC_SCL_PIN;
    }
    else
    {
         bus->IIC_SCL_PORT->BSRR = (uint32_t)bus->IIC_SCL_PIN << 16U;
    }
}

/**
  * @brief SDA输入一位
  * @param None
  * @retval GPIO读入一位
  */
uint8_t SDA_Input(iic_bus_t *bus)
{
	if(HAL_GPIO_ReadPin(bus->IIC_SDA_PORT, bus->IIC_SDA_PIN) == GPIO_PIN_SET){
		return 1;
	}else{
		return 0;
	}
}

/**
  * @brief IIC起始信号
  * @param None
  * @retval None
  */
void IICStart(iic_bus_t *bus)
{
    SDA_Output(bus,1);
    //delay1(DELAY_TIME);
		delay_us(2);
    SCL_Output(bus,1);
		delay_us(1);
    SDA_Output(bus,0);
		delay_us(1);
    SCL_Output(bus,0);
		delay_us(1);
}

/**
  * @brief IIC结束信号
  * @param None
  * @retval None
  */
void IICStop(iic_bus_t *bus)
{
    SCL_Output(bus,0);
		delay_us(2);
    SDA_Output(bus,0);
		delay_us(1);
    SCL_Output(bus,1);
		delay_us(1);
    SDA_Output(bus,1);
		delay_us(1);

}

/**
  * @brief IIC等待确认信号
  * @param None
  * @retval None
  */
unsigned char IICWaitAck(iic_bus_t *bus)
{
    unsigned short cErrTime = 5;
    SDA_Input_Mode(bus);
    SCL_Output(bus,1);
    while(SDA_Input(bus))
    {
        cErrTime--;
				delay_us(1);
        if (0 == cErrTime)
        {
            SDA_Output_Mode(bus);
            IICStop(bus);
            return ERROR;
        }
    }
    SDA_Output_Mode(bus);
    SCL_Output(bus,0);
		delay_us(2);
    return SUCCESS;
}

/**
  * @brief IIC发送确认信号
  * @param None
  * @retval None
  */
void IICSendAck(iic_bus_t *bus)
{
    SDA_Output(bus,0);
		delay_us(1);
    SCL_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,0);
		delay_us(1);
	
}

/**
  * @brief IIC发送非确认信号
  * @param None
  * @retval None
  */
void IICSendNotAck(iic_bus_t *bus)
{
    SDA_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,1);
		delay_us(1);
    SCL_Output(bus,0);
		delay_us(2);

}

/**
  * @brief IIC发送一个字节
  * @param cSendByte 需要发送的字节
  * @retval None
  */
void IICSendByte(iic_bus_t *bus,unsigned char cSendByte)
{
    unsigned char  i = 8;
    while (i--)
    {
        SCL_Output(bus,0);
        delay_us(2);
        SDA_Output(bus, cSendByte & 0x80);
				delay_us(1);
        cSendByte += cSendByte;
				delay_us(1);
        SCL_Output(bus,1);
				delay_us(1);
    }
    SCL_Output(bus,0);
		delay_us(2);
}

/**
  * @brief IIC接收一个字节
  * @param None
  * @retval 接收到的字节
  */
unsigned char IICReceiveByte(iic_bus_t *bus)
{
    unsigned char i = 8;
    unsigned char cR_Byte = 0;
    SDA_Input_Mode(bus);
    while (i--)
    {
        cR_Byte += cR_Byte;
        SCL_Output(bus,0);
				delay_us(2);
        SCL_Output(bus,1);
				delay_us(1);
        cR_Byte |=  SDA_Input(bus);
    }
    SCL_Output(bus,0);
    SDA_Output_Mode(bus);
    return cR_Byte;
}

uint8_t IIC_Write_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t data)
{				   	  	    																 
  IICStart(bus);  
	
	IICSendByte(bus,daddr<<1);	    
	if(IICWaitAck(bus))	//等待应答
	{
		IICStop(bus);		 
		return 1;		
	}
	IICSendByte(bus,reg);
	IICWaitAck(bus);	   	 										  		   
	IICSendByte(bus,data);     						   
	IICWaitAck(bus);  		    	   
  IICStop(bus);
	delay_us(1);
	return 0;
}

uint8_t IIC_Write_Multi_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[])
{			
	unsigned char i;	
  IICStart(bus);  
	
	IICSendByte(bus,daddr<<1);	    
	if(IICWaitAck(bus))
	{
		IICStop(bus);
		return 1;
	}
	IICSendByte(bus,reg);
	IICWaitAck(bus);	
	for(i=0;i<length;i++)
	{
		IICSendByte(bus,buff[i]);     						   
		IICWaitAck(bus); 
	}		    	   
  IICStop(bus);
	delay_us(1);
	return 0;
} 

unsigned char IIC_Read_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg)
{
	unsigned char dat;
	IICStart(bus);
	IICSendByte(bus,daddr<<1);
	IICWaitAck(bus);
	IICSendByte(bus,reg);
	IICWaitAck(bus);
	
	IICStart(bus);
	IICSendByte(bus,(daddr<<1)+1);
	IICWaitAck(bus);
	dat = IICReceiveByte(bus);
	IICSendNotAck(bus);
	IICStop(bus);
	return dat;
}


uint8_t IIC_Read_Multi_Byte(iic_bus_t *bus, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[])
{
	unsigned char i;
	IICStart(bus);
	IICSendByte(bus,daddr<<1);
	if(IICWaitAck(bus))
	{
		IICStop(bus);		 
		return 1;		
	}
	IICSendByte(bus,reg);
	IICWaitAck(bus);
	
	IICStart(bus);
	IICSendByte(bus,(daddr<<1)+1);
	IICWaitAck(bus);
	for(i=0;i<length;i++)
	{
		buff[i] = IICReceiveByte(bus);
		if(i<length-1)
		{IICSendAck(bus);}
	}
	IICSendNotAck(bus);
	IICStop(bus);
	return 0;
}


//
void IICInit(iic_bus_t *bus)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

		//bus->CLK_ENABLE();
		
    GPIO_InitStructure.Pin = bus->IIC_SDA_PIN ;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(bus->IIC_SDA_PORT, &GPIO_InitStructure);
		
		GPIO_InitStructure.Pin = bus->IIC_SCL_PIN ;
    HAL_GPIO_Init(bus->IIC_SCL_PORT, &GPIO_InitStructure);
}

i2cmy.h

#ifndef __IIC_HAL_H
#define __IIC_HAL_H

#include "stm32f4xx_hal.h"

typedef struct
{
	GPIO_TypeDef * IIC_SDA_PORT;
	GPIO_TypeDef * IIC_SCL_PORT;
	uint16_t IIC_SDA_PIN;
	uint16_t IIC_SCL_PIN;
	//void (*CLK_ENABLE)(void);
}iic_bus_t;

void IICStart(iic_bus_t *bus);
void IICStop(iic_bus_t *bus);
unsigned char IICWaitAck(iic_bus_t *bus);
void IICSendAck(iic_bus_t *bus);
void IICSendNotAck(iic_bus_t *bus);
void IICSendByte(iic_bus_t *bus, unsigned char cSendByte);
unsigned char IICReceiveByte(iic_bus_t *bus);
void IICInit(iic_bus_t *bus);

uint8_t IIC_Write_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t data);
uint8_t IIC_Write_Multi_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg,uint8_t length,uint8_t buff[]);
unsigned char IIC_Read_One_Byte(iic_bus_t *bus, uint8_t daddr,uint8_t reg);
uint8_t IIC_Read_Multi_Byte(iic_bus_t *bus, uint8_t daddr, uint8_t reg, uint8_t length, uint8_t buff[]);
#endif


网站公告

今日签到

点亮在社区的每一天
去签到