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

2019-07-20 03:04发布

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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
正点原子
1楼-- · 2019-07-20 07:56
 精彩回答 2  元偷偷看……
流芷静兰
2楼-- · 2019-07-20 13:50
原子哥,我发现从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]
流芷静兰
3楼-- · 2019-07-20 16:03
用逻辑分析仪看了之后,发现发了0x71之后没有ACK

正点原子
4楼-- · 2019-07-20 21:36
 精彩回答 2  元偷偷看……

一周热门 更多>