OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 32393|回复: 36

分享一个触摸屏控制芯片FT6206在STM32上的调试记录

[复制链接]

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2015-6-30 21:05:59 | 显示全部楼层 |阅读模式
       最近因为项目需要,需要在STM32平台上(裸机)驱动电容触摸屏,触摸屏控制IC为FT6206,触摸屏供应商只提供了Linux的驱动代码,看得一头雾水,只好自己写。

      网上搜索相关资料,好不容易才搜索到一份敦泰的调屏资料,上面写是0x70,抱着试一下的心态,试了一下,没想到还真的是这个地址,心中窃喜,接下来就简 单,读坐标点数据就行了。但碰到一个问题是,资料上写着是支持手势的,但我怎么按屏幕,从手势寄存器中读出来的都是0x00,表示没有手势 ,但坐标点数据读出来都是正确的,心中那个郁闷啊,不过我的项目用不上手势,就不管它了,如果有人知道是为什么,还请多多指点。

    还有一个地方需要注意的,就是上电后需要给芯片一个唤醒信号,该信号主机可以通过触摸屏的INT或者RST引脚提供。

    好了,直接上代码:

这个是.h文件
[mw_shl_code=c,true]#ifndef __TOUCH_H #define __TOUCH_H #ifdef MY_TOUCH_GLOBALS #define MY_TOUCH_EXT #else #define MY_TOUCH_EXT extern #endif /**************************引脚配置********************************/ #define CT_SDA_PIN GPIO_Pin_15 #define CT_SCL_PIN GPIO_Pin_14 #define CT_RST_PIN GPIO_Pin_13 #define CT_INT_PIN GPIO_Pin_12 #define RCC_CT_I2C_PORT RCC_APB2Periph_GPIOF #define RCC_CT_CONTROL_PORT RCC_APB2Periph_GPIOF #define CT_CONTROL_PORT GPIOF #define CT_I2C_PORT GPIOF #define TOUCH_GPIO_PortSource GPIO_PortSourceGPIOF #define TOUCH_GPIO_PinSource GPIO_PinSource12 #define TOUCH_EXTI_Line EXTI_Line12 #define TOUCH_EXTI_IRQn EXTI15_10_IRQn /***************************相关宏定义********************************/ #define TOUCH_NO_POINT (~0) /************************错误代码*****************************/ #define CT_COM_OK (0) #define CT_ACK_FAIL (1) #define FT6X06_ID (0x6206) #define CT_IC (FT6X06_ID) //使用的控制IC #define CT_ADDR (0x70) //器件地址 #define CT_WRITE_MASK (0x00) #define CT_READ_MASK (0x01) #define CT_CACK_TIMEOUT (3000) //等待ACK超时时间 //reg map #define DEVICE_MODE (0x00) //This register is the device mode register, configure it to determine the current mode of the chip #define GEST_ID (0x01) //This register describes the gesture of a valid touch #define TD_STATUS (0x02) //How many points detected #define P1_XH (0x03) //This register describes MSB of the X coordinate of the nth touch point and the corresponding event flag #define P1_XL (0x04) //This register describes LSB of the X coordinate of the nth touch point #define P1_YH (0x05) //This register describes MSB of the Y coordinate of the nth touch point and corresponding touch ID #define P1_YL (0x06) //This register describes LSB of the Y coordinate of the nth touch point #define P2_XH (0x09) #define P2_XL (0x0A) #define P2_YH (0x0B) #define P2_YL (0x0C) #define ID_G_THGROUP (0x80) //灵敏度 #define ID_G_PERIODACTIVE (0x88) //扫描频率,This register describes the period of active status, it should not less than 12,最大14 #define ID_G_AUTO_CLB_MODE (0xA0) //This register describes auto calibration mode #define G_MODE (0xA4) #define ID_G_STATE (0xA7) //This register is used to configure the run mode of TPM. #define ID_G_FTID (0xA8) //芯片ID #define ID_G_ERR (0xA9) //This register describes the error code when the TPM is running /*********************相关结构体*************************/ #if (CT_IC == FT6X06_ID) #define MAX_TOUCH_POINT (2) //最大触摸点个数 #endif #ifndef MAX_TOUCH_POINT #define MAX_TOUCH_POINT (2) #endif //触摸点事件 #define EVENT_PRESS_DOWN (0) #define EVENT_LIFT_UP (1) #define EVENT_CONTACT (2) #define EVENT_NONE (3) //手势 #define GUSTURE_MOVE_UP (0x10) #define GUSTURE_MOVE_RIGHT (0x14) #define GUSTURE_MOVE_DOWN (0x18) #define GUSTURE_MOVE_LEFT (0x1C) #define GUSTURE_MOVE_ZOOM_IN (0x48) #define GUSTURE_MOVE_ZOOM_OUT (0x49) #define GUSTURE_NONE (0x00) #define CT_READ_START (GEST_ID) //每次检测到触摸屏中断信号时从哪个寄存器开始读取数据 #define CT_READ_LENGTH (12) //每次检测到触摸屏中断信号时读取多少个数据 #define CT_READ_NO_GEST (0) //手势在读出数据的位置 #define CT_READ_NO_TD_STATUS (CT_READ_NO_GEST+1) //有效点数 #define CT_READ_NO_P1 (CT_READ_NO_TD_STATUS+1) #define CT_READ_NO_P2 (CT_READ_NO_P1+6) #define CT_DEF_VALID_POINT_ERROR (10) typedef struct { uint8_t M_EventFlag; //触摸点事件 uint16_t M_Xpos; uint16_t M_Ypos; uint16_t M_PreXpos; //上一次的点位置 uint16_t M_PreYpos; }ST_CTPoint; typedef struct { uint8_t M_nPoint; //当前有效,触摸点个数,对于FT6X06最多两个 uint8_t M_Gesture; //手势 ST_CTPoint * M_pStCTPoint[MAX_TOUCH_POINT]; }ST_CTTouchStatus; typedef struct { uint16_t M_ValidStartXpos; //X有效起始位置 uint16_t M_ValidEndXpos; //X有效结束位置 uint16_t M_ValidStartYpos; //Y有效起始位置 uint16_t M_ValidEndYpos; //Y有效结束位置 uint8_t M_ValidErrRange; //容许偏差 }ST_ValidPoint; MY_TOUCH_EXT ST_CTPoint StCTPoint1; MY_TOUCH_EXT ST_CTPoint StCTPoint2; MY_TOUCH_EXT ST_CTTouchStatus StCTTouchStatus; MY_TOUCH_EXT uint8_t FlagCTINT; //触摸中断标志 MY_TOUCH_EXT uint8_t FlagPointToDeal; //是否有点有效标志 /* **函数名:CTI2C_GPIO_Config **传入参数:无 **返回值:无 **功能:初始化CTI2C引脚 */ void CTI2C_GPIO_Config(void); uint8_t CT_Write_Nbyte(const uint8_t sla_add,const uint8_t add,uint16_t n,const uint8_t *s); uint8_t CT_Read_Nbyte(const uint8_t sla_add,const uint8_t add,uint16_t n,uint8_t *s); void CT_Reset(void); void CT_Init_Val(void); uint8_t CT_GetTouch_Status(uint8_t *RetPointToDealFlag); #endif [/mw_shl_code]
这个是.c文件
[mw_shl_code=c,true]#define MY_TOUCH_GLOBALS #include ".././includes.h" #define SDA_High GPIO_WriteBit(CT_I2C_PORT,CT_SDA_PIN,Bit_SET) #define SDA_Low GPIO_WriteBit(CT_I2C_PORT,CT_SDA_PIN,Bit_RESET) #define SDA_INPUT {CT_I2C_PORT->CRH&=0X0FFFFFFF;CT_I2C_PORT->CRH|= 8ul<<28;}//第15脚,(15-8)*4 = 28 #define SDA_OUTPUT {CT_I2C_PORT->CRH&=0X0FFFFFFF;CT_I2C_PORT->CRH|= 3ul<<28;}//第15脚,(15-8)*4 = 28 #define SCL_High GPIO_WriteBit(CT_I2C_PORT,CT_SCL_PIN,Bit_SET) #define SCL_Low GPIO_WriteBit(CT_I2C_PORT,CT_SCL_PIN,Bit_RESET) #define GetSDABit GPIO_ReadInputDataBit(CT_I2C_PORT,CT_SDA_PIN) #define CT_DELAY_US(val) Delay_us(val) /* **函数名:CTI2C_GPIO_Config **传入参数:无 **返回值:无 **功能:初始化CTI2C引脚 */ void CTI2C_GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /*开启GPIO的外设时钟*/ RCC_APB2PeriphClockCmd(RCC_CT_I2C_PORT | RCC_CT_CONTROL_PORT, ENABLE); /*选择要控制的引脚*/ GPIO_InitStructure.GPIO_Pin = CT_SDA_PIN | CT_SCL_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为10MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; /*调用库函数,初始化GPIO*/ GPIO_Init(CT_I2C_PORT,&GPIO_InitStructure); /*选择要控制的引脚*/ GPIO_InitStructure.GPIO_Pin = CT_RST_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为10MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; /*调用库函数,初始化GPIO*/ GPIO_Init(CT_CONTROL_PORT,&GPIO_InitStructure); /*选择要控制的引脚*/ GPIO_InitStructure.GPIO_Pin = CT_INT_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /*设置引脚速率为10MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; /*调用库函数,初始化GPIO*/ GPIO_Init(CT_CONTROL_PORT,&GPIO_InitStructure); /*********************初始化外部中断**********************/ /*开启引脚复用AFIO的外设时钟,因为用到了AFIO外部中断配置寄存器*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); /* Selects as EXTI Line */ GPIO_EXTILineConfig(TOUCH_GPIO_PortSource, TOUCH_GPIO_PinSource); /*选择外部中断线*/ EXTI_InitStructure.EXTI_Line = TOUCH_EXTI_Line; /*设置EXTI线路为中断请求*/ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /*下降沿触发*/ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /*使能选中线路*/ EXTI_InitStructure.EXTI_LineCmd = ENABLE; /*外部中断初始化*/ EXTI_Init(&EXTI_InitStructure); /******************************************************/ } /**************************/ static void CTI2C_start(void)//CTI2C启动函数 { SDA_OUTPUT; SCL_High; SDA_High; CT_DELAY_US(300); SDA_Low; CT_DELAY_US(300); SCL_Low; } /**************************/ static void CTI2C_stop(void)// CTI2C停止函数 { SDA_OUTPUT; SDA_Low; SCL_High; CT_DELAY_US(300); SDA_High; CT_DELAY_US(300); SDA_Low; SCL_Low; } /**************************/ static void CTI2C_write_byte(const uint8_t s)//CTI2C写1byte函数,S为需要写的内容 { uint8_t temps; uint8_t dat,i; temps=s; dat=0x80; SDA_OUTPUT; for(i=0;i<8;i++) { if(dat&temps)//对应位为一就发一 { SDA_High; CT_DELAY_US(100);//延时一下,保证数据建立时间大于50ns //SCL的频率,高速为400KHz,标准为100KHz SCL_High; CT_DELAY_US(300); SCL_Low; CT_DELAY_US(300); } else { SDA_Low; CT_DELAY_US(100);//延时一下,保证数据建立时间大于50ns SCL_High; CT_DELAY_US(300); SCL_Low; CT_DELAY_US(300); } dat=dat>>1;//注意Keil中将有符号数的右移操作作算术右移处理,我需要的是逻辑右移,因此dat要先定义为无符号数,否则会出错 } SDA_High;//主控制器写完后要预先释放对SDA总线的控制 CT_DELAY_US(100);//留一点时间接收应答信号 } /**************************/ static void CTI2C_read_byte(uint8_t *s)//CTI2C读1byte函数,数据放在形参中,成功返回1,失败返回0 { uint8_t temps=0,i; uint8_t text=0x80; uint8_t sdain; SDA_INPUT; SDA_High;//设SDA为输入方式 for(i=0;i<8;i++) { SCL_High;//使SDA上的数据有效 CT_DELAY_US(100);//延时一下,保证SDA已经稳定 sdain = GetSDABit;//取得SDA上的数据 if(1==sdain) { temps |=(text>>i);//先接收高位 } SCL_Low;//读完后允许SDA上的数据刷新,并延时一下让被读器件有时间更新要输出的数据 CT_DELAY_US(300); } *s=temps; CT_DELAY_US(300);//留一点时间发送应答信号 } /**************************/ static uint8_t CTI2C_check_ack(void)//CTI2C应答位检查函数,正常应答返回0,否则返回1 { uint8_t sdain; SDA_INPUT; SDA_High;//置SDA为输入 SCL_High;//使SDA上的数据有效 CT_DELAY_US(100);//延时一下,保证SDA已经稳定 sdain = GetSDABit;//取得SDA上的数据 SCL_Low; if(1==sdain) return 1; else return 0; } /**************************/ static void CTI2C_send_ack(void)//CTI2C发送应答信号函数 { SDA_OUTPUT; SDA_Low; CT_DELAY_US(100);//延时一下,保证SDA已经稳定 SCL_High; CT_DELAY_US(300); SCL_Low; SDA_High; } /**************************/ static void CTI2C_send_nack(void)//CTI2C发送非应答信号函数 { SDA_OUTPUT; SDA_High; CT_DELAY_US(100);//延时一下,保证SDA已经稳定 SCL_High; CT_DELAY_US(300); SCL_Low; SDA_Low; } /**************************/ /****************************************************************************** * FUNCTION: CT_Write_Nbyte ( ) * DESCRIPTION: 写触摸屏寄存器 * Input the description of function: * Input Parameters: 器件地址,待写寄存器地址,待写数据数量,存储待写入数据的地址 * Output Parameters: 无 * Returns Value: * * Author: FuDongQiang @ 2015/05/22 * * modification history * ... ******************************************************************************/ uint8_t CT_Write_Nbyte(const uint8_t sla_add,const uint8_t add,uint16_t n,const uint8_t *s)//CTI2C写nbyte函数,写数据由形参数组传入,成功返回1,失败返回0 { uint8_t temps,ack=1; uint16_t tempn; uint16_t cack_time=0; CTI2C_start();//启动CTI2C总线 CTI2C_write_byte(sla_add | CT_WRITE_MASK);//发送寻址字节 do { cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } while(CTI2C_check_ack()); CTI2C_write_byte(add);//发送要写入的起始地址 cack_time=0; do { cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } while(CTI2C_check_ack()); for(tempn=0;tempn<n;tempn++) { ack=1;//应答位 cack_time=0; temps=*(s+tempn); while(ack) { CTI2C_write_byte(temps); ack=CTI2C_check_ack();//检查应答信号,非应答则重发该字节 cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } } CTI2C_stop();// CTI2C停止 return CT_COM_OK; } /****************************************************************************** * FUNCTION: CT_Read_Nbyte ( ) * DESCRIPTION: 从触摸屏中读出数据 * Input the description of function: * Input Parameters: 器件地址,待读寄存器地址,待读数据数量,存储待读出数据的地址 * Output Parameters: 读取的数据 * Returns Value: * * Author: FuDongQiang @ 2015/05/22 * * modification history * ... ******************************************************************************/ uint8_t CT_Read_Nbyte(const uint8_t sla_add,const uint8_t add,uint16_t n,uint8_t *s)//CTI2C读nbyte函数,所读数据放在形参数组中(由程序员设置合适的数组大小),成功返回1,失败返回0 { uint8_t temps; uint16_t tempn; uint16_t cack_time=0; CTI2C_start();//启动CTI2C总线 CTI2C_write_byte(sla_add | CT_WRITE_MASK);//发送寻址字节,伪写 do { cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } while(CTI2C_check_ack()); CTI2C_write_byte(add);//发送要读入的起始地址 cack_time=0; do { cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } while(CTI2C_check_ack()); CTI2C_start();//再次启动CTI2C总线 CTI2C_write_byte(sla_add | CT_READ_MASK);//再次发送寻址字节,读 cack_time=0; do { cack_time++; if(cack_time>CT_CACK_TIMEOUT)//在规定时间cack_timeout内收不到应答信号,返回出错信号 return CT_ACK_FAIL; } while(CTI2C_check_ack()); for(tempn=0;tempn<n;tempn++) { CTI2C_read_byte(&temps); *(s+tempn)=temps; if(tempn+1<n)//如果已经读完所有数据了,就不要发应答信号,直接发非应答位和停止位 CTI2C_send_ack();//CTI2C发送应答信号.准备下一字节的接收 } CTI2C_send_nack();//接收完毕,发送非应答位和停止位 CTI2C_stop(); return CT_COM_OK; } //复位触摸芯片 void CT_Reset(void) { //The reset signal from host to CTPM, active low, and the low pulse width should be more than or equal to 1ms GPIO_SetBits(CT_CONTROL_PORT,CT_RST_PIN); Delay_ms(1); GPIO_ResetBits(CT_CONTROL_PORT,CT_RST_PIN); Delay_ms(5); GPIO_SetBits(CT_CONTROL_PORT,CT_RST_PIN); Delay_ms(1); } /****************************************************************************** * FUNCTION: CT_Init_Val ( ) * DESCRIPTION: 初始化触摸芯片相关变量 * Input the description of function: * Input Parameters: * Output Parameters: * Returns Value: * * Author: FuDongQiang @ 2015/05/22 * * modification history * ... ******************************************************************************/ void CT_Init_Val(void) { FlagCTINT = RESET; FlagPointToDeal = RESET; StCTPoint1.M_EventFlag = EVENT_NONE; StCTPoint2.M_EventFlag = EVENT_NONE; StCTTouchStatus.M_Gesture = GUSTURE_NONE; StCTTouchStatus.M_nPoint = 0; StCTTouchStatus.M_pStCTPoint[0] = &StCTPoint1; StCTTouchStatus.M_pStCTPoint[1] = &StCTPoint2; } /****************************************************************************** * FUNCTION: CT_GetTouch_Status ( ) * DESCRIPTION: 获取当前触摸状态,保存在ST_CTTouchStatus中 * Input the description of function: * Input Parameters: * Output Parameters: 是否有需要处理的触摸状态 * Returns Value: * * Author: FuDongQiang @ 2015/05/22 * * modification history * ... ******************************************************************************/ uint8_t CT_GetTouch_Status(uint8_t *RetPointToDealFlag) { uint8_t StrTempData[CT_READ_LENGTH],Error = ERROR_OK; uint16_t Temp; Error = CT_Read_Nbyte(CT_ADDR,CT_READ_START,CT_READ_LENGTH,StrTempData); if(Error == CT_COM_OK) { Error = ERROR_OK; StCTTouchStatus.M_Gesture = StrTempData[CT_READ_NO_GEST]; //手势 StCTTouchStatus.M_nPoint = StrTempData[CT_READ_NO_TD_STATUS]; //有多少个点有效 if(StCTTouchStatus.M_nPoint > 0 && StCTTouchStatus.M_nPoint <= MAX_TOUCH_POINT) { *RetPointToDealFlag = SET; //Event Flag StCTTouchStatus.M_pStCTPoint[0]->M_EventFlag = StrTempData[CT_READ_NO_P1]>>6; StCTTouchStatus.M_pStCTPoint[1]->M_EventFlag = StrTempData[CT_READ_NO_P1]>>6; //X1 Position Temp = StrTempData[CT_READ_NO_P1]&0x0F; Temp = Temp<<8; Temp += StrTempData[CT_READ_NO_P1+1]; StCTTouchStatus.M_pStCTPoint[0]->M_PreXpos = StCTTouchStatus.M_pStCTPoint[0]->M_Xpos; StCTTouchStatus.M_pStCTPoint[0]->M_Xpos = Temp; //Y1 Position Temp = StrTempData[CT_READ_NO_P1+2]&0x0F; Temp = Temp<<8; Temp += StrTempData[CT_READ_NO_P1+3]; StCTTouchStatus.M_pStCTPoint[0]->M_PreYpos = StCTTouchStatus.M_pStCTPoint[0]->M_Ypos; StCTTouchStatus.M_pStCTPoint[0]->M_Ypos = Temp; //X2 Position Temp = StrTempData[CT_READ_NO_P2]&0x0F; Temp = Temp<<8; Temp += StrTempData[CT_READ_NO_P2+1]; StCTTouchStatus.M_pStCTPoint[1]->M_PreXpos = StCTTouchStatus.M_pStCTPoint[1]->M_Xpos; StCTTouchStatus.M_pStCTPoint[1]->M_Xpos = Temp; //Y2 Position Temp = StrTempData[CT_READ_NO_P2+2]&0x0F; Temp = Temp<<8; Temp += StrTempData[CT_READ_NO_P2+3]; StCTTouchStatus.M_pStCTPoint[1]->M_PreYpos = StCTTouchStatus.M_pStCTPoint[1]->M_Ypos; StCTTouchStatus.M_pStCTPoint[1]->M_Ypos = Temp; } //没有按键按下 else { // StCTTouchStatus.M_pStCTPoint[0]->M_PreXpos = StCTTouchStatus.M_pStCTPoint[0]->M_Xpos; // StCTTouchStatus.M_pStCTPoint[0]->M_Xpos = TOUCH_NO_POINT; // StCTTouchStatus.M_pStCTPoint[0]->M_PreYpos = StCTTouchStatus.M_pStCTPoint[0]->M_Ypos; // StCTTouchStatus.M_pStCTPoint[0]->M_Ypos = TOUCH_NO_POINT; // StCTTouchStatus.M_pStCTPoint[1]->M_PreXpos = StCTTouchStatus.M_pStCTPoint[1]->M_Xpos; // StCTTouchStatus.M_pStCTPoint[1]->M_Xpos = TOUCH_NO_POINT; // StCTTouchStatus.M_pStCTPoint[1]->M_PreYpos = StCTTouchStatus.M_pStCTPoint[1]->M_Ypos; // StCTTouchStatus.M_pStCTPoint[1]->M_Ypos = TOUCH_NO_POINT; Error = ERROR_UNKNOW; } } return Error; } /****************************************************************************** * FUNCTION: CT_Check_Point_Valid ( ) * DESCRIPTION: 检测当前触摸区域是否有效 * Input the description of function: * Input Parameters: 待对比当前有效触摸区域 * Output Parameters: * Returns Value: * * Author: FuDongQiang @ 2015/05/22 * * modification history * ... ******************************************************************************/ uint8_t CT_Check_Point_Valid(ST_ValidPoint *pStValidPoint) { uint8_t Stauts = ERROR_TOUCH_POINT_INVALID,n; uint16_t ValidStart, ValidEnd; for(n = 0; n < StCTTouchStatus.M_nPoint; n++) { //检测X,Y坐标是否都在有效区域内 if(pStValidPoint->M_ValidStartXpos > pStValidPoint->M_ValidErrRange) { ValidStart = pStValidPoint->M_ValidStartXpos - pStValidPoint->M_ValidErrRange; } else { ValidStart = pStValidPoint->M_ValidStartXpos; } ValidEnd = pStValidPoint->M_ValidEndXpos + pStValidPoint->M_ValidErrRange; if((StCTTouchStatus.M_pStCTPoint[n]->M_Xpos >= ValidStart) && (StCTTouchStatus.M_pStCTPoint[n]->M_Xpos <= ValidEnd)) { if(pStValidPoint->M_ValidStartYpos > pStValidPoint->M_ValidErrRange) { ValidStart = pStValidPoint->M_ValidStartYpos - pStValidPoint->M_ValidErrRange; } else { ValidStart = pStValidPoint->M_ValidStartYpos; } ValidEnd = pStValidPoint->M_ValidEndYpos + pStValidPoint->M_ValidErrRange; if((StCTTouchStatus.M_pStCTPoint[n]->M_Ypos >= ValidStart) && (StCTTouchStatus.M_pStCTPoint[n]->M_Ypos <= ValidEnd)) { Stauts = ERROR_TOUCH_POINT_VALID; } } } return Stauts; } void EXTI15_10_IRQHandler(void) { FlagCTINT = SET; /* 清楚中断标志位*/ EXTI_ClearITPendingBit(TOUCH_EXTI_Line); } [/mw_shl_code]
附件为FT6X06的寄存器手册:



FT6x06_AN_public_ver0.1.3.pdf

441.05 KB, 下载次数: 2602

我是菜鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-30 23:18:44 | 显示全部楼层
不错,谢谢分享。
我们的7寸屏用的FT5206,和你这个差不多。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2015-7-1 18:10:47 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
初来报到,发个贴,以后还请原子哥多多指教~~不知道原子哥用FT5206能不能读出手势呢,我从FT6206读出的手势都是0x00
我是菜鸟
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-1 22:52:38 | 显示全部楼层
回复【3楼】负西弱:
---------------------------------
我也没用手势
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2015-7-3 13:21:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢原子哥的回复~~看来还是要用蠢办法自己软件判断简单的手势了
我是菜鸟
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-7-3 19:15:11 | 显示全部楼层
顶楼主,楼主,有没有FT6236的资料呢,供应商提供了个MTK平台的驱动程序,看了半天还没找到从机地址,郁闷死!!
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2015-7-3 19:29:13 | 显示全部楼层
回复【6楼】chenyh85:
---------------------------------
已上传资料,供应商提供给我的也是linux的驱动代码,从机地址我也是从网上搜索的,一开始以为是0x38,后来看到有人说要左移一位,所以是0x70,我就是用0x70的
我是菜鸟
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-7-4 09:29:03 | 显示全部楼层
楼主好人啊。我下个月就去敦泰科技上班了。先熟悉下电容触摸屏的驱动。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-7-5 18:22:53 | 显示全部楼层
回复【7楼】负西弱:
--------------------------------- 这是6x06的啊,和6x36通用吗
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-7-5 18:23:48 | 显示全部楼层
回复【8楼】fanghuiopenedv:
--------------------------------- 那以后有问题就请教你了^O^
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2015-7-5 18:56:06 | 显示全部楼层
回复【9楼】chenyh85:
---------------------------------
看错了~~找供应商要吧
我是菜鸟
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-7-5 22:30:53 | 显示全部楼层
回复【11楼】负西弱:
--------------------------------- 要了就是一份很简单的规格书,上面连从地址都没有
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2015-10-8 13:51:52 | 显示全部楼层
有人在吗?楼主分享的程序,为什么我读出来除了手势是0x00之外,其他是0xFF,,,?有哪位大神有调试通过的代码放出来参考参考吗?很急,一个人搞,好难找出问题所在,感激不尽!
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2015-10-8 13:52:36 | 显示全部楼层
回复【5楼】负西弱:
---------------------------------
楼主,在吗?调试FT触摸板的问题想咨询你
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2015-6-23
在线时间
29 小时
发表于 2015-10-8 14:27:24 | 显示全部楼层
手势支持需要在触摸屏的源代码中打开,这个是敦泰的IC,这个你要找敦泰的FAE,或者你自己拿到一分FT6206的代码,自己修改手势那一块。
回复 支持 反对

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2015-10-8 21:28:07 | 显示全部楼层
回复【13楼】小罗洛克:
---------------------------------
这个就是我调试通过的,如果不行,一个原因是它的IC本身没有烧录正确的程序(我被供应商这样坑过一次),另外的原因估计时序问题
我是菜鸟
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2015-10-9 08:46:02 | 显示全部楼层
回复【16楼】负西弱:
---------------------------------
楼主,你的上面.c文件里面那个 uint8_t CT_Check_Point_Valid(ST_ValidPoint *pStValidPoint)
函数,怎么应用?不太理解,求指教!没能理解他的用途
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-10-16
在线时间
0 小时
发表于 2015-10-16 18:45:43 | 显示全部楼层
也想DIY一个带触摸屏的东西,请问大家触摸屏有什么推荐没有,可以直接接在开发板上的。
多谢
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2014-6-4
在线时间
91 小时
发表于 2015-10-19 10:14:24 | 显示全部楼层
正需要MARK下!
一路狂奔!
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-10-20
在线时间
0 小时
发表于 2015-10-20 09:43:05 | 显示全部楼层
楼主你好,请问FT6306的主程序和初始化程序该怎么写,屏幕是调好了,触摸屏程序不会=。=
菜鸟中的菜鸟
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-10-20
在线时间
0 小时
发表于 2015-10-20 09:43:42 | 显示全部楼层
我是小白......
菜鸟中的菜鸟
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2014-6-4
在线时间
91 小时
发表于 2015-10-24 10:35:06 | 显示全部楼层
楼主在吗,我看了你这个程序IIC延时太大,而且这个中断貌似也没的啥用,不触摸屏当作按键扫描就可以了。有时间讨论下。我也做了这个,成功驱动了,时间仓促。
一路狂奔!
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-8-2
在线时间
7 小时
发表于 2015-11-10 15:45:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥有FT回复【2楼】正点原子:
---------------------------------
原子哥,请问你们FT5206的例程在哪?我在你们的资料里面只看到过gt811的
回复 支持 反对

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2015-11-10 20:34:32 | 显示全部楼层
谢谢楼主分享,鼓掌
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-11-15
在线时间
0 小时
发表于 2015-11-15 16:47:20 | 显示全部楼层
太赞了,最近一直在调这个屏,一直没调通好纠结。楼主能否再分享下主函数中对IIC的操作,我的邮箱hexiangge@foxmail.com,多谢了!
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-7-9
在线时间
4 小时
发表于 2016-2-16 17:18:07 | 显示全部楼层
了解一下
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-5-26
在线时间
3 小时
发表于 2016-5-26 21:43:14 | 显示全部楼层
不错,谢谢分享,也分享一个不错的触摸屏产品链接
https://shop115980747.taobao.com
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2016-3-22
在线时间
41 小时
发表于 2016-12-13 12:01:52 | 显示全部楼层
可以资料很给力感谢!
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-12-1
在线时间
8 小时
发表于 2017-1-5 11:20:44 | 显示全部楼层
谢谢楼主,正在搞触摸屏,型号不同,但是可以借鉴一下
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-5-18
在线时间
3 小时
发表于 2017-7-11 16:08:25 | 显示全部楼层
嗯,好东西,收藏下
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-5-18
在线时间
3 小时
发表于 2017-7-11 16:08:41 | 显示全部楼层
谢谢楼主分享!
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2017-7-26
在线时间
29 小时
发表于 2017-8-1 16:56:26 | 显示全部楼层
谢谢楼主,正在搞触摸屏,型号不同,但是可以借鉴一下
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2017-7-11
在线时间
28 小时
发表于 2017-8-1 18:41:32 | 显示全部楼层
666666
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-8-1
在线时间
2 小时
发表于 2017-8-2 17:17:22 | 显示全部楼层
同志们,我不仅手势地址0x01读出来全是0,连坐标点数地址0x02读出来的数据也是0,但是第一个坐标有数据,可是测试发现坐标范围为120x255,不应该是64x128吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-11-16
在线时间
2 小时
发表于 2017-8-17 16:19:31 | 显示全部楼层
你好 我用的也是这个触摸屏 只不过我现在想把触摸屏的四个引脚改成PC6-PC9,我改了宏定义 和外部中断配置,但是触摸屏还是没有反应,不知道是哪配置错了
/**************************òy&#189;&#197;&#197;&#228;&#214;&#195;********************************/
//#define CT_SDA_PIN              GPIO_Pin_15
//#define CT_SCL_PIN              GPIO_Pin_14
//#define CT_RST_PIN              GPIO_Pin_13      
//#define CT_INT_PIN              GPIO_Pin_12

#define CT_SDA_PIN              GPIO_Pin_6
#define CT_SCL_PIN              GPIO_Pin_7      //pc6-pc9
#define CT_RST_PIN              GPIO_Pin_8
#define CT_INT_PIN              GPIO_Pin_9


#define RCC_CT_I2C_PORT         RCC_APB2Periph_GPIOC
#define RCC_CT_CONTROL_PORT     RCC_APB2Periph_GPIOC
#define CT_CONTROL_PORT         GPIOC
#define CT_I2C_PORT             GPIOC

//#define RCC_CT_I2C_PORT         RCC_APB2Periph_GPIOF
//#define RCC_CT_CONTROL_PORT     RCC_APB2Periph_GPIOF
//#define CT_CONTROL_PORT         GPIOF
//#define CT_I2C_PORT             GPIOF

#define TOUCH_GPIO_PortSource   GPIO_PortSourceGPIOC
//#define TOUCH_GPIO_PortSource   GPIO_PortSourceGPIOF
#define TOUCH_GPIO_PinSource    GPIO_PinSource9
#define TOUCH_EXTI_Line         EXTI_Line9
#define TOUCH_EXTI_IRQn         EXTI9_5_IRQn


//#define TOUCH_GPIO_PinSource    GPIO_PinSource12
//#define TOUCH_EXTI_Line         EXTI_Line12
//#define TOUCH_EXTI_IRQn         EXTI15_10_IRQn


在touch.c文件中改了下面几句
#define     SDA_High                    GPIO_WriteBit(CT_I2C_PORT,CT_SDA_PIN,Bit_SET)
#define     SDA_Low                     GPIO_WriteBit(CT_I2C_PORT,CT_SDA_PIN,Bit_RESET)
//#define     SDA_INPUT                  {CT_I2C_PORT->CRH&=0X0FFFFFFF;CT_I2C_PORT->CRH|= 8ul<<28;}//μú15&#189;&#197;£&#172;(15-8)*4 = 28
//#define     SDA_OUTPUT                 {CT_I2C_PORT->CRH&=0X0FFFFFFF;CT_I2C_PORT->CRH|= 3ul<<28;}//μú15&#189;&#197;£&#172;(15-8)*4 = 28
#define     SCL_High                    GPIO_WriteBit(CT_I2C_PORT,CT_SCL_PIN,Bit_SET)
#define     SCL_Low                     GPIO_WriteBit(CT_I2C_PORT,CT_SCL_PIN,Bit_RESET)
#define     GetSDABit                   GPIO_ReadInputDataBit(CT_I2C_PORT,CT_SDA_PIN)


#define     SDA_INPUT                 {CT_I2C_PORT->CRL&=0X0FFFFFFF;CT_I2C_PORT->CRL|= 8ul<<24;}//pc6
#define     SDA_OUTPUT              {CT_I2C_PORT->CRL&=0X0FFFFFFF;CT_I2C_PORT->CRL|= 3ul<<24;}// pc6



回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-10-18
在线时间
4 小时
发表于 2018-11-1 15:32:54 | 显示全部楼层
触摸屏读取触摸数据的函数内,有一些变量没有定义,不知道代表什么意思?比如ERROR_OK等
回复 支持 反对

使用道具 举报

0

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2018-9-27
在线时间
15 小时
发表于 2018-11-2 10:28:25 | 显示全部楼层
谢谢楼主分享 好人一生平安
域名劫持
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 09:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表