OpenEdv-开源电子网

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

分享电容触摸屏FT6236驱动程序

[复制链接]

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-8-25 19:15:41 | 显示全部楼层 |阅读模式
来论坛索取了很多资料,一直没分享过,今天分享一个测试好了的程序。借鉴了原子哥的FT5206和论坛其他大虾的程序,分享给有需要的人吧。

FT6236_test.rar

1.63 MB, 下载次数: 5798

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

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2012-10-25
在线时间
15 小时
发表于 2020-10-19 23:21:39 | 显示全部楼层
后荫榆枫 发表于 2016-10-1 13:27
**** 作者被禁止或删除 内容自动屏蔽 ****

我也碰到这个问题了,读02寄存器正常读到00或有触摸01,但是故障的时候就读到0xff,然后一直读到的都是0xff 触摸就死机了,这是哪里出了问题了
回复 支持 1 反对 0

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2017-8-10 11:13:59 | 显示全部楼层
//从FT6236读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度                          
void FT6236_RD_Reg(u16 reg,u8 *buf,u8 len)
{
        u8 i;
         FT6236_Start();        
         FT6236_WrOneByte(FT_CMD_WR);           //发送写命令         
        FT6236_CheckAck();                                                                                                               
         FT6236_WrOneByte(reg&0XFF);           //发送低8位地址
        FT6236_CheckAck();  
         FT6236_Start();                     
        FT6236_WrOneByte(FT_CMD_RD);           //发送读命令                  
        FT6236_CheckAck();         
        for(i=0;i<len;i++)
        {           
                *buf++ = FT6236_RdOneByte();                //读入1B数据到接收数据缓冲区中
                FT6236_McuACK();                                        //发送应答位         
        }
        FT6236_McuNACK();                                                //n个字节读完,发送非应答位
    FT6236_Stop();                                        //产生一个停止条件         
}
这个读函数存在一个深坑,读到最后一个字节后,理论上应该直接发NoAck,但是这个程序却先发了一个Ack,再发送NoAck,这样会出现问题的。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-8-25 22:07:19 | 显示全部楼层
不错,谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-12-10
在线时间
2 小时
发表于 2015-12-10 12:49:47 | 显示全部楼层
兄弟,相关的数据手册有吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2016-2-20
在线时间
1 小时
发表于 2016-2-25 19:59:59 | 显示全部楼层
初始化,INT脚一直是1.8V  无反应
回复 支持 反对

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-2-25 21:06:38 | 显示全部楼层
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-3-30
在线时间
4 小时
发表于 2016-3-29 15:02:55 | 显示全部楼层
非常感谢
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-3-30
在线时间
4 小时
发表于 2016-4-6 04:18:49 | 显示全部楼层
,有数据手册吗
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
 楼主| 发表于 2016-4-6 21:47:16 | 显示全部楼层

手册和FT5206的差不多,明天传上来
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-5-7
在线时间
2 小时
发表于 2016-5-7 11:06:18 | 显示全部楼层
本帖最后由 wangrlo 于 2016-5-7 14:33 编辑

初始化时SDA是低电平应答信号,但为什么初始化后INT是低电平?多谢。附件是工程,下面是其中的FT6236.c:
//#include "delay.h"
#include "FT6236.h"

//#include "vmlog.h"
#include <string.h>
#include "vmtype.h"
#include "vmsystem.h"
#include "vmcmd.h"
#include "vmlog.h"
#include "vmboard.h"

#include "vmdcl.h"
#include "vmdcl_eint.h"

#include "vmdcl_gpio.h"
#include "stdio.h"


//VM_DCL_HANDLE gpio_handle;  // device handle
VM_DCL_HANDLE lcd_reset_handle;
VM_DCL_HANDLE lcd_cs_handle;
VM_DCL_HANDLE lcd_dc_handle;
VM_DCL_HANDLE lcd_wr_handle;
VM_DCL_HANDLE lcd_sda_handle;
static VM_DCL_HANDLE g_eint_handle = VM_DCL_HANDLE_INVALID;
VMCHAR g_buff[256];


#define RST_L vm_dcl_control(lcd_reset_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL)
#define RST_H vm_dcl_control(lcd_reset_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL)
#define DC_Low vm_dcl_control(lcd_dc_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL)
#define DC_High vm_dcl_control(lcd_dc_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL)
#define SCLK_Low vm_dcl_control(lcd_wr_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL)
#define SCLK_High vm_dcl_control(lcd_wr_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL)
#define SDIN_Low vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL)
#define SDIN_High vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Delay Time
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void delay_us(VMUINT32 millisecs){
   VMUINT32 timeStop;
   VMUINT32 timeStart;
   VMUINT32 Freq = 0;
   volatile VMUINT32 i;
   ///millisecs = millisecs*1000;

    timeStart = vm_time_ust_get_count();
    sprintf(g_buff,"delay_us = %d", timeStart);log_info(10, g_buff);

    while( Freq  < millisecs)
    {
            //for(i=0;i<5000;i++){}
        timeStop = vm_time_ust_get_count();
        Freq = timeStop - timeStart + 1;
    }
}

void Delay(unsigned char n)
{
unsigned char i,j,k;

        for(k=0;k<n;k++)
        {
                for(i=0;i<131;i++)
                {
                        for(j=0;j<15;j++)
                        {
                                delay_us(203);
                        }
                }
        }
}
vm_dcl_gpio_control_level_status_t FT6236_SDA_Read(){
vm_dcl_gpio_control_level_status_t gpio_input_data;  // parameter for VM_DCL_GPIO_COMMAND_READ.

vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_READ, (void *)&gpio_input_data);   // We call vm_dcl_control to read gpio55.
return gpio_input_data;
}
vm_dcl_gpio_control_level_status_t FT6236_INT_Read(){
vm_dcl_gpio_control_level_status_t gpio_input_data;  // parameter for VM_DCL_GPIO_COMMAND_READ.

vm_dcl_control(g_eint_handle, VM_DCL_GPIO_COMMAND_READ, (void *)&gpio_input_data);   // We call vm_dcl_control to read gpio55.
return gpio_input_data;
}


/****************************************************
* 函数名称 :
* 功    能 :单片机发送起始信号
* 入口参数 :无
* 返回参数 :无
* 注意事项 :
*****************************************************/
void FT6236_Start(void)                                       
{
        SDA_OUT();                     //sda线输出
        delay_us(3);
        SDIN_High;
        SCLK_High;                //SCL最小高电平脉宽:0.6us
        delay_us(4);                //起始信号的最小建立时间:0.6us
        SDIN_Low;                //SCL高电平期间,SDA的一个下降沿表示起始信号
        delay_us(4);                //起始信号的最小保持时间:0.6us
        SCLK_Low;                //箝住总线,为发送器件地址做准备;
        delay_us(2);                //SCL最小低电平脉宽:1.2us,由RET实现
}

/****************************************************
* 函数名称 :
* 功    能 :单片机发送停止信号
* 入口参数 :无
* 返回参数 :无
* 注意事项 :
*****************************************************/
void FT6236_Stop(void)                                                        
{
        SDA_OUT();                     //sda线输出        
        delay_us(3);        
        SCLK_High;                //SCL最小高电平脉宽:0.6us
        delay_us(4);                //停止信号的最小建立时间:0.6us
        SDIN_Low;
        delay_us(4);
        SDIN_High;                //SCL高电平期间,SDA的一个上升沿表示停止信号
        delay_us(2);                                                
}

/****************************************************
* 函数名称 :
* 功    能 :单片机发送应答信号
* 入口参数 :无
* 返回参数 :无
* 注意事项 :单片机读1B数据后发送一个应答信号
*****************************************************/
void FT6236_McuACK(void)                                                        
{
        SCLK_Low;
        SDA_OUT();                     //sda线输出        
        delay_us(3);
        SDIN_Low;
        delay_us(2);                                                                                                                                       
        SCLK_High;                //SCL最小高电平脉宽:0.6us
        delay_us(2);
        SCLK_Low;                //SCL最小低电平脉宽:1.2us
}

/****************************************************
* 函数名称 :
* 功    能 :单片机发送非应答信号
* 入口参数 :无
* 返回参数 :无
* 注意事项 :单片机读数据停止前发送一个非应答信号
*****************************************************/
void FT6236_McuNACK(void)
{
        SCLK_Low;
        SDA_OUT();                                     //sda线输出        
        delay_us(3);
        SDIN_High;
        delay_us(2);                                                                                                                                       
        SCLK_High;                                //SCL最小高电平脉宽:0.6us
        delay_us(2);
        SCLK_Low;                                //SCL最小低电平脉宽:1.2us
}

/****************************************************
* 函数名称 :
* 功    能 :单片机检查FT6236送来的应答信号
* 入口参数 :无
* 返回参数 :1,接收应答失败
                         0,接收应答成功
* 注意事项 :单片机写1个地址/数据后检查
                         全局变量RevAckF:收到FT6236应答信号的标志位,为0表示收到
*****************************************************/
u8 FT6236_CheckAck(void)                                                        
{
        u8 ucErrTime=0;
        SDA_IN();                                      //SDA设置为输入
        SDIN_High;
        SCLK_High;                                //使SDA上数据有效;SCL最小高电平脉宽:0.6us
        delay_us(3);
        while(FT6236_SDA_Read().level_status)
        {        
                ucErrTime++;
                if(ucErrTime>250)                //无应答
                {
                        FT6236_Stop();        
                        return 1;
                }
                delay_us(2);
        }
        SCLK_Low;
        return 0;
}

/****************************************************
* 函数名称 :
* 功    能 :单片机向IIC总线发送1B的地址/数据
* 入口参数 :待发送的1B地址/数据
* 返回参数 :无
* 注意事项 :不是一个完整的数据发送过程;送数的顺序是从高到低
*****************************************************/
void FT6236_WrOneByte(u8 dat)                                                
{
        u8 i;                                                
        SDA_OUT();                                     //sda线输出        
        SCLK_Low;                                //拉低时钟开始数据传输
        delay_us(3);
        for(i = 8; i > 0; i--)                //8位1B地址/数据的长度
        {
                if(dat & 0x80)                 
                        SDIN_High;                //发送"1"
                else
                        SDIN_Low;                //发送"0"
                delay_us(2);
                SCLK_High;                        //使SDA上的数据有效
                delay_us(2);                        //SCL最小高电平脉宽:0.6us                                                        
                SCLK_Low;                        //SCL最小低电平脉宽:1.2us
                delay_us(2);
                dat <<= 1;                                //发送数据左移1位,为下位发送准备        
        }               
}

/****************************************************
* 函数名称 :
* 功    能 :单片机从IIC总线接收1B的数据
* 入口参数 :无
* 返回参数 :收到的1B数据
* 注意事项 :不是一个完整的数据接收过程;从高到低的顺序接收数据
*****************************************************/
u8 FT6236_RdOneByte(void)                                                
{
        u8 i,dat = 0;                                //接收数据位数和内容暂存单元
        SDA_IN();                                                //SDA设置为输入
        delay_us(2);        
        //SDIN_High;                        //使能上拉,准备读取数据
        vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_ENABLE_PULL, NULL);
        vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_SET_PULL_HIGH, NULL);

        delay_us(2);
        for(i = 8;i > 0;i--)
        {
                SCLK_Low;
                delay_us(2);
                SCLK_High;
                dat <<= 1;
                if(FT6236_SDA_Read().level_status)
                        dat++;
                delay_us(2);                        //SCL最小低电平脉宽:1.2us
        }
        SDIN_High;
        return(dat);                                //返回1B的数据
}

//向FT6236写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 FT6236_WR_Reg(u16 reg,u8 *buf,u8 len)
{
        u8 i;
        u8 ret=0;
        FT6236_Start();         
        FT6236_WrOneByte(FT_CMD_WR);        //发送写命令         
        //FT6236_CheckAck();
        ret=FT6236_CheckAck();
    sprintf(g_buff,"FT_CMD_WR = %d", ret);log_info(3, g_buff);

        FT6236_WrOneByte(reg&0XFF);           //发送低8位地址
        FT6236_CheckAck();  
        for(i=0;i<len;i++)
        {           
            FT6236_WrOneByte(buf);          //发数据
                ret=FT6236_CheckAck();
                if(ret)break;  
        }
    FT6236_Stop();                                        //产生一个停止条件
    sprintf(g_buff,"buf = %d", ret);log_info(11, g_buff);

        return ret;
}
//从FT6236读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度                          
void FT6236_RD_Reg(u16 reg,u8 *buf,u8 len)
{
        u8 i;
         FT6236_Start();        
         FT6236_WrOneByte(FT_CMD_WR);           //发送写命令         
        FT6236_CheckAck();                                                                                                               
         FT6236_WrOneByte(reg&0XFF);           //发送低8位地址
        FT6236_CheckAck();  
         FT6236_Start();                     
        FT6236_WrOneByte(FT_CMD_RD);           //发送读命令                  
        FT6236_CheckAck();         
        for(i=0;i<len;i++)
        {           
                *buf++ = FT6236_RdOneByte();                //读入1B数据到接收数据缓冲区中
                FT6236_McuACK();                                        //发送应答位         
        }
        FT6236_McuNACK();                                                //n个字节读完,发送非应答位
    FT6236_Stop();                                        //产生一个停止条件         
}
/*
**函数名:FT6236_Init
**传入参数:无
**返回值:无
**功能:初始化FT6236引脚
*/  
void FT6236_Init(void)
{
    sprintf(g_buff,"FT6236_Init = %d", 5);log_info(3, g_buff);

        lcd_reset_handle = vm_dcl_open(VM_DCL_GPIO, 33);          // First, we call vm_dcl_open to get a handle. 55 means gpio55
        //lcd_dc_handle = vm_dcl_open(VM_DCL_GPIO, 47);          // First, we call vm_dcl_open to get a handle. 55 means gpio55
        lcd_wr_handle = vm_dcl_open(VM_DCL_GPIO, 35);          // First, we call vm_dcl_open to get a handle. 55 means gpio55
        lcd_sda_handle = vm_dcl_open(VM_DCL_GPIO, 36);          // First, we call vm_dcl_open to get a handle. 55 means gpio55
        vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_ENABLE_PULL, NULL);
        vm_dcl_control(lcd_wr_handle, VM_DCL_GPIO_COMMAND_ENABLE_PULL, NULL);
        vm_dcl_control(lcd_sda_handle, VM_DCL_GPIO_COMMAND_SET_PULL_HIGH, NULL);
        vm_dcl_control(lcd_wr_handle, VM_DCL_GPIO_COMMAND_SET_PULL_HIGH, NULL);
    /* Sets the pin direction to OUTPUT */
    vm_dcl_control(lcd_reset_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
    /* Sets the pin direction to OUTPUT */
    vm_dcl_control(lcd_wr_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
    SDA_OUT();
        u8 temp;
        SDIN_High;
        SCLK_High;
        RST_H;

        RST_L;
        delay_ms(50);
        RST_H;
        delay_ms(100);
        SDIN_High;
        SCLK_High;
        delay_ms(10);
        temp=0;
        FT6236_WR_Reg(FT_DEVIDE_MODE,&temp,1);        //进入正常操作模式


         temp=22;                                                                //触摸有效值,22,越小越灵敏        
         FT6236_WR_Reg(FT_ID_G_THGROUP,&temp,1);        //设置触摸有效值
         temp=12;                                                                //激活周期,不能小于12,最大14
         FT6236_WR_Reg(FT_ID_G_PERIODACTIVE,&temp,1);
    sprintf(g_buff,"INT = %d", FT6236_INT_Read().level_status);log_info(10, g_buff);

/******************************************************/
}
const u16 FT6236_TPX_TBL[5]=
{
        FT_TP1_REG,
        FT_TP2_REG,
        FT_TP3_REG,
        FT_TP4_REG,
        FT_TP5_REG
};
TouchPointRefTypeDef TPR_Structure;
void FT6236_Scan(void)
{
        u8 i=0;
        u8 sta = 0;
        u8 buf[4] = {0};   
        FT6236_RD_Reg(0x02,&sta,1);//读取触摸点的状态            
         if(sta & 0x0f)        //判断是否有触摸点按下,0x02寄存器的低4位表示有效触点个数
         {
                 TPR_Structure.TouchSta = ~(0xFF << (sta & 0x0F));        //~(0xFF << (sta & 0x0F))将点的个数转换为触摸点按下有效标志
                 for(i=0;i<5;i++)                                        //分别判断触摸点1-5是否被按下
                 {
                         if(TPR_Structure.TouchSta & (1<<i))                            //读取触摸点坐标
                         {                                                                                            //被按下则读取对应触摸点坐标数据
                                 FT6236_RD_Reg(FT6236_TPX_TBL,buf,4);        //读取XY坐标值
                                TPR_Structure.x=((u16)(buf[0]&0X0F)<<8)+buf[1];
                                TPR_Structure.y=((u16)(buf[2]&0X0F)<<8)+buf[3];
                                 if((buf[0]&0XC0)!=0X80)
                                 {
                                        TPR_Structure.x=TPR_Structure.y=0;//必须是contact事件,才认为有效        
                                        return;
                                }
                         }
                 }
                 TPR_Structure.TouchSta |= TP_PRES_DOWN;     //触摸按下标记
         }
         else
         {
                 if(TPR_Structure.TouchSta &TP_PRES_DOWN)         //之前是被按下的
                         TPR_Structure.TouchSta &= ~0x80;        //触摸松开标记        
                 else
                 {
                         TPR_Structure.x[0] = 0;
                         TPR_Structure.y[0] = 0;
                         TPR_Structure.TouchSta &=0xe0;        //清楚触摸点有效标记
                 }
         }
}

/* EINT callback, to be invoked when EINT triggers. */
static void eint_callback(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle)
{
        TPR_Structure.TouchSta |= TP_COORD_UD;                                //触摸坐标有更新

        if(TPR_Structure.TouchSta &TP_COORD_UD)                //触摸有按下
        {
                TPR_Structure.TouchSta &= ~TP_COORD_UD;        //清标记
                FT6236_Scan();                                                        //读取触摸坐标
                sprintf(g_buff,"X:\t%d",TPR_Structure.x[0]);
            log_info(2, g_buff);    /* output log to LCD if have */
                sprintf(g_buff,"Y:\t%d",TPR_Structure.y[0]);
            log_info(4, g_buff);    /* output log to LCD if have */

                //printf("\r\n");//插入换行
        }
}

/* Attaches EINT */
//static void eint_attach(void)
void eint_attach(void)
{
    vm_dcl_eint_control_config_t eint_config;
    vm_dcl_eint_control_sensitivity_t sens_data;
    vm_dcl_eint_control_hw_debounce_t deboun_time;
    VM_DCL_STATUS status;

    /* Resets the data structures */
    memset(&eint_config,0, sizeof(vm_dcl_eint_control_config_t));
    memset(&sens_data,0, sizeof(vm_dcl_eint_control_sensitivity_t));
    memset(&deboun_time,0, sizeof(vm_dcl_eint_control_hw_debounce_t));

    /* Opens and attaches VM_PIN_EINT EINT */
    g_eint_handle = vm_dcl_open(VM_DCL_EINT, PIN2EINT(VM_PIN_EINT));

    if(VM_DCL_HANDLE_INVALID == g_eint_handle)
    {
        sprintf(g_buff,"open EINT error");log_info(3, g_buff);
        return;
    }

    /* Usually, before configuring the EINT, we mask it firstly. */
    status = vm_dcl_control(g_eint_handle, VM_DCL_EINT_COMMAND_MASK, NULL);
    if(status != VM_DCL_STATUS_OK)
    {
      sprintf(g_buff,"VM_DCL_EINT_COMMAND_MASK  = %d", status);log_info(3, g_buff);
    }

    /* Registers the EINT callback */
    status = vm_dcl_register_callback(g_eint_handle, VM_DCL_EINT_EVENT_TRIGGER, (vm_dcl_callback)eint_callback, (void*)NULL );
    if(status != VM_DCL_STATUS_OK)
    {
        sprintf(g_buff,"VM_DCL_EINT_EVENT_TRIGGER = %d", status);log_info(3, g_buff);
    }

    /* Configures a FALLING edge to trigger */
    sens_data.sensitivity = 0;
    eint_config.act_polarity = 0;

    /* Sets the auto unmask for the EINT */
    eint_config.auto_unmask = 1;

    /* Sets the EINT sensitivity */
    status = vm_dcl_control(g_eint_handle, VM_DCL_EINT_COMMAND_SET_SENSITIVITY, (void*)&sens_data);
    if(status != VM_DCL_STATUS_OK)
    {
      sprintf(g_buff,"VM_DCL_EINT_COMMAND_SET_SENSITIVITY = %d", status);log_info(3, g_buff);
    }

    /* Sets debounce time to 1ms */
    deboun_time.debounce_time = 1;
    /* Sets debounce time */
    status = vm_dcl_control(g_eint_handle, VM_DCL_EINT_COMMAND_SET_HW_DEBOUNCE, (void*)&deboun_time);
    if(status != VM_DCL_STATUS_OK)
    {
      sprintf(g_buff,"VM_DCL_EINT_COMMAND_SET_HW_DEBOUNCE = %d", status);log_info(3, g_buff);
    }

    /* Usually, before configuring the EINT, we mask it firstly. */
    status = vm_dcl_control(g_eint_handle, VM_DCL_EINT_COMMAND_MASK, NULL);
    if(status != VM_DCL_STATUS_OK)
    {
       sprintf(g_buff,"VM_DCL_EINT_COMMAND_MASK  = %d", status);log_info(3, g_buff);
    }

    /* 1 means enabling the HW debounce; 0 means disabling. */
    eint_config.debounce_enable = 1;

    /* Make sure to call this API at the end as the EINT will be unmasked in this statement. */
    status = vm_dcl_control(g_eint_handle, VM_DCL_EINT_COMMAND_CONFIG, (void*)&eint_config);
    if(status != VM_DCL_STATUS_OK)
    {
      sprintf(g_buff,"VM_DCL_EINT_COMMAND_CONFIG = %d", status);log_info(3, g_buff);
    }
}

void test(){
        log_info(6,"test");
}








补充内容 (2016-5-17 15:00):
thx

touch_test.rar

253.02 KB, 下载次数: 1487

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-5-7
在线时间
2 小时
发表于 2016-5-17 15:11:55 | 显示全部楼层
本帖最后由 wangrlo 于 2016-5-17 15:23 编辑
wangrlo 发表于 2016-5-7 11:06
初始化时SDA是低电平应答信号,但为什么初始化后INT是低电平?多谢。附件是工程,下面是其中的FT6236.c:
/ ...

不能修改么
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-5-7
在线时间
2 小时
发表于 2016-5-17 15:21:21 | 显示全部楼层
本帖最后由 wangrlo 于 2016-5-17 15:23 编辑

驱动程序能用么
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
 楼主| 发表于 2016-5-17 15:32:03 | 显示全部楼层
怎么这么多,看着好乱
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
 楼主| 发表于 2016-5-17 19:02:04 | 显示全部楼层
一直忙忘了,上传FT6236资料。

FT6236寄存器资料.pdf

224.98 KB, 下载次数: 1986

D-FT6X36-DataSheet-20140724-V0.3_Prelimilary.pdf

867.48 KB, 下载次数: 1835

回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2022-3-7
在线时间
0 小时
发表于 2016-6-13 18:24:43 | 显示全部楼层
请问,能得到触摸点坐标,#define FT_GEST_ID        0x01  读姿态寄存器一直是0x00,这是哪里出错了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-5-18
在线时间
22 小时
发表于 2016-9-15 00:41:31 | 显示全部楼层
看不懂
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-10-1
在线时间
1 小时
发表于 2016-10-1 13:27:25 | 显示全部楼层
本帖最后由 后荫榆枫 于 2016-10-1 13:31 编辑

请问楼主,触摸一下屏幕,会响应多次,这个怎么解决?我看FT6236的寄存器没有记录上次触摸状态,读寄存器0x02,只返回0x01或者0xFF
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-8-1
在线时间
2 小时
发表于 2017-8-2 16:36:20 | 显示全部楼层
楼主,你好,我读寄存器0x02,一直都是0,但是都坐标却又有值,可是我看值的范围是120x255,而不是64x128啊,怎么回事啊,谁知道呢
回复 支持 反对

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2017-8-9 16:47:56 | 显示全部楼层
哥们,I2C读写地址为啥是0x70 0x71啊?在数据手册里没找到啊?现在用FT6336,配置后触摸不成功
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-8-17
在线时间
0 小时
发表于 2017-8-17 14:50:23 | 显示全部楼层
非常感谢。我正在找这个资料
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-8-21
在线时间
2 小时
发表于 2017-8-21 17:42:54 | 显示全部楼层
好,谢谢分享
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
发表于 2019-3-19 17:10:11 | 显示全部楼层
楼主,你好,我用的STM32L151,为啥总是进不了中断

[mw_shl_code=applescript,true]GPIO_InitTypeDef GPIO_InitStruct;
         
void IIC_Gpio_Init(void)
{

        __HAL_RCC_GPIOB_CLK_ENABLE();
         
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
         
        /*Configure GPIO pins : PB4  PB6  PB7  */
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;                                        //推挽输出
  GPIO_InitStruct.Pull = GPIO_PULLUP;                                                                        //上拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;        //高速
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

         
}

//初始化FT6236触摸屏
void FT6236_Init(void)
{
        u8 temp;
         
        IIC_Gpio_Init();
        FT_RST(0);
        HAL_Delay(50);
        FT_RST(1);
        HAL_Delay(100);
        IIC_SDA(1);
        IIC_SCL(1);
        HAL_Delay(10);
        temp=0;
        FT6236_WR_REG(FT_DEVIDE_MODE, &temp, 1);//进入正常操作模式
        FT6236_WR_REG(FT_ID_G_MODE,&temp,1);                //中断模式
        temp = 22;                //触摸有效值:22,越小越灵敏
        FT6236_WR_REG(FT_ID_G_THGRUP, &temp, 1);        //设置触摸有效值        
        temp = 12;//激活周期,不能小于12,最大14
        FT6236_WR_REG(FT_ID_G_PERIODACTIVE,&temp,1);
}[/mw_shl_code]

[mw_shl_code=applescript,true]//外部中断配置  PB4
void EXTI_Init(void)
{
        __HAL_RCC_GPIOB_CLK_ENABLE();               //开启GPIOB时钟
       
        GPIO_InitStruct.Pin=GPIO_PIN_4;        //PB4
  GPIO_InitStruct.Mode=GPIO_MODE_IT_FALLING;     //下降沿触发GPIO_MODE_IT_FALLING
  GPIO_InitStruct.Pull=GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
       
  //中断线4
  HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);       //抢占优先级为2,子优先级为0
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);             //使能中断线0
}

//外部中断4的中断服务函数
void EXTI4_IRQHandler(void)
{
        HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}

/**
* 中断服务程序中需要做的事情,在HAL库中所有的外部中断服务函数都会调用此函数
* GPIO_Pin        中断引脚号
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
                if(FT_INT == 0)
                        TPR_Structure.TouchSta |= TP_COORD_UD;                                //触摸坐标有更新
                LED_OFF;
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2015-9-11
在线时间
8 小时
发表于 2019-8-16 16:58:06 | 显示全部楼层
想问下这个驱动正常吗,我的stm32f103移植后,寄存器读写都不正常。
让IT变得艺术和生活!
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-9-21 10:53:51 | 显示全部楼层
无帝老三 发表于 2017-8-10 11:13
//从FT6236读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区

然后应该怎么改?您调好了吗?我最近正在调一款FT6236的触摸,一直有问题,用这个程序,想交流一下。
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-9-26 15:49:18 | 显示全部楼层
你好,我一直了您的程序,发现FT6236初始化对屏幕显示有影响,您碰到过这类问题吗
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-9-26 15:50:34 | 显示全部楼层
无帝老三 发表于 2017-8-9 16:47
哥们,I2C读写地址为啥是0x70 0x71啊?在数据手册里没找到啊?现在用FT6336,配置后触摸不成功

解决了吗?我也有这个问题
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-11-8 10:18:06 | 显示全部楼层
无帝老三 发表于 2017-8-10 11:13
//从FT6236读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区

兄弟,那你怎么解决的?改了吗?想交流下,感谢
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2011-4-29
在线时间
18 小时
发表于 2020-9-7 13:01:32 | 显示全部楼层
不错,谢谢分享。。。。
回复 支持 反对

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2020-10-10 11:30:53 | 显示全部楼层
我是用的FT6236U但是我发现一个问题就是,没有办法给定一个地址后连续读取数据。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-12-30
在线时间
0 小时
发表于 2022-12-30 17:12:35 | 显示全部楼层
这个驱动好用吗?我刚好有一块这个FT6236的触屏
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 18:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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