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 0void 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