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]
[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]
一周热门 更多>