硬汉嵌入式论坛

 找回密码
 立即注册
查看: 714|回复: 2
收起左侧

[其它] XPT2046的PEN一直为高

[复制链接]

5

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2023-9-22 15:30:02 | 显示全部楼层 |阅读模式
屏幕是某信买的2.4寸电阻触摸屏,16位并口。调试时发现触摸屏幕时PEN引脚始终为高。万用表测量为3.26V,电路联通正常。
直接读取,能读到手指触摸的位置。若手指未触摸,用软件SPI读取的位置在(0,4095)左右小幅度波动;使用硬件SPI时值不会更新,要触摸后才会更新到手指触摸的地方

引脚相关宏定义
[C] 纯文本查看 复制代码
/*TOUCH*/
#define PEN (LL_GPIO_ReadInputPort(T_IRQ_GPIO_Port) & T_IRQ_Pin)
/*CS*/
#define TCS_SET LL_GPIO_SetOutputPin(T_CS_GPIO_Port, T_CS_Pin)
#define TCS_CLR LL_GPIO_ResetOutputPin(T_CS_GPIO_Port, T_CS_Pin)

#if !(TOUCH_USE_HARD_SPI)
/*MISO*/
#define TDOUT (T_DOUT_GPIO_Port->IDR & T_DOUT_Pin)
/*MOSI*/
#define TDIN_SET LL_GPIO_SetOutputPin(T_DIN_GPIO_Port,T_DIN_Pin)
#define TDIN_CLR LL_GPIO_ResetOutputPin(T_DIN_GPIO_Port,T_DIN_Pin)
/*SCLK*/
#define TCLK_SET LL_GPIO_SetOutputPin(T_CLK_GPIO_Port,T_CLK_Pin)
#define TCLK_CLR LL_GPIO_ResetOutputPin(T_CLK_GPIO_Port,T_CLK_Pin)
#endif /*TOUCH_USE_HARD_SPI*/


移植的读取XPT2046的部分代码
[C] 纯文本查看 复制代码
static uint8_t CMD_RDX = 0XD0;
static uint8_t CMD_RDY = 0X90;

void TP_Write_Byte(uint8_t num)
{
#if !(TOUCH_USE_HARD_SPI)
    uint8_t count = 0;
    for (count = 0; count < 8; count++)
    {
        if (num & 0x80)
        {
            TDIN_SET;
        }
        else
        {
            TDIN_CLR;
        }
        num <<= 1;
        TCLK_CLR;
        delay_us(1);
        TCLK_SET; // 上升沿有效
    }
#else
	HAL_SPI_Transmit(&hspi2,&num,1,0xFFFF);
#endif

}


uint16_t TP_Read_AD(uint8_t CMD)
{
    uint16_t adc_data = 0;

#if !(TOUCH_USE_HARD_SPI)

    TCLK_CLR;           // 先拉低时钟
    TDIN_CLR;           // 拉低数据线
    TCS_CLR;            // 选中触摸屏IC
    TP_Write_Byte(CMD); // 发送命令字
    delay_us(6);        // ADS7846的转换时间最长为6us
    TCLK_CLR;
    delay_us(1);
    TCLK_SET; // 给1个时钟,清除BUSY
    delay_us(1);
    TCLK_CLR;
    for (uint8_t count = 0; count < 16; count++) // 读出16位数据,只有高12位有效
    {
        adc_data <<= 1;
        TCLK_CLR; // 下降沿有效
        delay_us(1);
        TCLK_SET;
        if (TDOUT)
            adc_data++;
    }

    TCS_SET; // 释放片选
#else
    TCS_CLR;
	// 发送命令字
    TP_Write_Byte(CMD); 
	// ADS7846的转换时间最长为6us
    delay_us(6);
	
	HAL_SPI_Receive(&hspi2, (uint8_t*)&adc_data, 2, 0xFFFF);
	adc_data = __REV16(adc_data);

	TCS_SET;
#endif

    adc_data >>= 4; // 只有高12位有效.
    return (adc_data);
}




补充信息:


  • 主控:STM32H7B0VBT6
  • 环境:CubeMX 6.9.6 + Keil 5.36
  • 引脚:PB1,输入模式,无上下


IMG_20230922_151514.jpg


回复

使用道具 举报

5

主题

8

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-9-22 15:36:13 | 显示全部楼层
问题解决
参考http://www.manongjc.com/detail/18-akqqxuydsncgpcl.html中的一句话
如果最后写进芯片的控制字包含PD0=1,笔中断输出功能禁止,不能监测触摸屏上触摸动作。要想重新使能笔中断输出功能,需要把带有PD0=0的控制字写入芯片

修改驱动中读取数据的部分,将HAL_SPI_Receive()改为HAL_SPI_TransmitReceive()发送0x0000数据,即可成功使能笔中断
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2023-9-23 07:40:10 | 显示全部楼层
有始有终,谢谢楼主分享最终原因。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-1 07:48 , Processed in 0.214888 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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