OpenEdv-开源电子网

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

FT6236驱动触摸屏,读到的坐标为什么都是FF 00 00 00啊?

[复制链接]

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
发表于 2019-3-20 21:19:22 | 显示全部楼层 |阅读模式
1金钱
FT6236驱动触摸屏,读到的坐标为什么都是FF 00 00 00啊?

[mw_shl_code=applescript,true]#define FT6236_TPX_TBL1                                0X03                  //第一个触摸点数据地址

const u16 FT6236_TPX_TBL[2] = {FT6236_TPX_TBL1,FT6236_TPX_TBL2};

TouchPointRefTypeDef TPR_Structure;
void FT6236_Scan(void)
{
        u8 buf[4];
        u8 sta = 0;

                FT6236_RD_Reg(FT_REG_NUM_FINGER, &sta, 1);//读取触摸点的状态
                if(sta & 0x0F)//判断是否有触摸点按下,
                {
                        TPR_Structure.TouchSta = ~(0xFF << (sta & 0x0F));//将点的个数转换为触摸点按下有效标志
                        TPR_Structure.TouchSta |= TP_PRES_DOWN;        //触摸按下标记
                        if(TPR_Structure.TouchSta )        //读取触摸到坐标
                        {
                                        FT6236_RD_Reg(FT6236_TPX_TBL[0], buf, 4);
                                        TPR_Structure.x1 = ((u16)(buf[0] & 0x0F) << 8) + buf[1];
                                        TPR_Structure.y1 = ((u16)(buf[2] & 0x0F) << 8) + buf[3];
                                        if((buf[0] & 0xC0) != 0x80)
                                        {
                                                TPR_Structure.x1 = TPR_Structure.y1 = 0;        //必须是contact事件,才认为有效
                                        }
                        }
                       
                }
                else
                {
                        if(TPR_Structure.TouchSta & TP_PRES_DOWN)//之前是被按下的
                                TPR_Structure.TouchSta &= ~TP_PRES_DOWN;//触摸松开标记
                        else
                        {
                                TPR_Structure.x1 = 0;
                                TPR_Structure.y1 = 0;
                                TPR_Structure.TouchSta &= 0xe0;        //清除触摸点有效标记
                        }
                }
}[/mw_shl_code]

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-3-21 01:44:02 | 显示全部楼层
说明驱动可能有问题,或者你的硬件有问题
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
 楼主| 发表于 2019-3-21 14:25:26 | 显示全部楼层
原子哥,我发现从FT6236读出来的数据都是0xFF,是我IIC读数据写的有什么问题吗?

[mw_shl_code=applescript,true]#define FT_CMD_WR                                                          0x70                //写命令
#define FT_CMD_RD                                                                0x71                //读命令
#define FT_DEVIDE_MODE                                        0x00                //FT6236模式控制寄存器
#define FT_ID_G_MODE                                                0xA4                //FT6236中断模式
#define FT_ID_G_THGRUP                                        0x80                //触摸有效值寄存器
#define FT_REG_NUM_FINGER                                0x02                //触摸状态寄存器
#define FT_ID_G_PERIODACTIVE                 0x88                //激活状态周期设置寄存器
#define FT_ID_G_LIB_VERSION                        0xA1                //版本
#define TP_PRES_DOWN                                                0x80                //触摸屏正在被按下
#define TP_COORD_UD                                                        0x40                //触摸松开,触摸坐标更新标记[/mw_shl_code]

[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);
       
}

//产生IIC起始信号
void IIC_Start(void)
{
        IIC_SCL(0);//气动信号必须保证SCL拉高之前SDA复位到高电平了,确保SCL高电平时只有下降沿
                                               
        IIC_SDA(1);//SDA输出高电平
        IIC_SCL(1);
        IIC_SDA(0);//START:when CLK is high,DATA change form high to low
        IIC_SCL(0);//钳住IIC总线,准备发送或接收数据
}

//产生IIC停止信号
void IIC_Stop(void)
{
        u8 i = 0;
        IIC_SCL(0);
        IIC_SDA(0);
        IIC_SCL(1);
        IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
        IIC_SDA(1);//发送IIC总线结束信号
}

//等待应答信号到来
//返回值:1,接收应答失败
//                                0,接收应答成功
void IIC_Wait_Ack()
{
        SDA_IN;//SDA设为输入
        IIC_SCL(1);
  IIC_SCL(0);//时钟输出0
}

//产生IIC应答信号
void IIC_Ack(void)
{
        IIC_SCL(0);
        IIC_SDA(0);
        IIC_SCL(1);
        IIC_SCL(0);
}

//不产生IIC应答信号
void IIC_NAck(void)
{
        IIC_SCL(0);
        IIC_SDA(1);
        IIC_SCL(1);
        IIC_SCL(0);
}

//IIC发送一个字节
//返回从机有无应答,1:有应答,0:无应答
void IIC_Send_Byte(u8 txd)
{
        u8 t;
        IIC_SCL(0);//拉低时钟开始数据传输
        for(t=0 ; t < 8 ; t++)
        {
                if((txd&0x80)== 0x80)
                        IIC_SDA(1);
                else
                        IIC_SDA(0);
                txd<<=1;
                IIC_SCL(1);
                IIC_SCL(0);
        }
}

//IIC读取一个字节,ack=1时,发送ACK,ack=0时,发送NACK
u8  IIC_Read_Byte(unsigned char ack)
{
        u8 i,receive=0;
        for(i = 0; i < 8; i++)
        {
                IIC_SCL(0);
                IIC_SCL(1);
                receive <<= 1;
                if(SDA_IN)
                        receive++;
                IIC_SCL(0);
        }
        if(!ack)
                IIC_NAck();//发送NACK
        else
                IIC_Ack();
        return receive;
}

//单片机向FT6236写入一次数据
//reg:起始寄存器地址
//buf:数据缓存区
//len:写数据长度
//返回值:0:成功,1:失败
void FT6236_WR_REG(u16 reg, u8 *buf, u8 len)
{
        u8 i;
        IIC_Start();
        IIC_Send_Byte(FT_CMD_WR);        //发送写命令
        IIC_Wait_Ack();
        IIC_Send_Byte(reg&0xFF);        //发送低8位地址
        IIC_Wait_Ack();
        IIC_Start();
        for(i = 0; i < len; i++)
        {
                IIC_Send_Byte(buf);        //发数据
               
        }
        IIC_Stop();                //产生一个停止条件
}

//单片机从FT6236读出一次数据
//reg:其实寄存器地址
//buf:数据缓存区
//len:读数据长度
void FT6236_RD_Reg(u16 reg, u8 *buf, u8 len)
{
        u8 i;
        IIC_Start();
        IIC_Send_Byte(FT_CMD_WR);                //发送写命令
        IIC_Wait_Ack();
        IIC_Send_Byte(reg&0xFF);                //发送低8位地址
        IIC_Wait_Ack();
        IIC_Send_Byte(FT_CMD_RD);                //发送读命令
        IIC_Wait_Ack();
        for(i = 0; i < len; i++)
        {
                *buf++= IIC_Read_Byte(1);//发数据
        }
        IIC_NAck();
        IIC_Stop();//产生一个停止条件
}

//初始化FT6236触摸屏
//返回值:0:初始化成功,1:初始化失败
void FT6236_Init(void)
{
        u8 temp;
        u8 vison;
       
        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);
        FT6236_RD_Reg(FT_ID_G_LIB_VERSION_H,&vison,1);
        USART_Write(vison);
       
}[/mw_shl_code]
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
 楼主| 发表于 2019-3-21 16:35:51 | 显示全部楼层
用逻辑分析仪看了之后,发现发了0x71之后没有ACK

1553157029(1).png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-3-22 01:31:53 | 显示全部楼层
流芷静兰 发表于 2019-3-21 16:35
用逻辑分析仪看了之后,发现发了0x71之后没有ACK

只能继续调试,没有好建议
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-11-8 09:51:36 | 显示全部楼层
流芷静兰 发表于 2019-3-21 14:25
原子哥,我发现从FT6236读出来的数据都是0xFF,是我IIC读数据写的有什么问题吗?

[mw_shl_code=applescr ...

你好,最近正在调试这个屏,我的是FT6236U,读触摸点都是0x00,你的问题解决了吗?看到能回复我吗,感谢交流
回复

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-11-8 11:42:58 | 显示全部楼层
正点原子 发表于 2019-3-21 01:44
说明驱动可能有问题,或者你的硬件有问题

原子哥,我是萌新,现在调试触摸屏,我的触控是FT6236U,座标都能读出数据,但就是0x02,读坐标点,怎么都是0x00,能读出座标点,硬件应该没错呀,麻烦原子帮忙指点迷津。感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 21:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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