笔记:XPT2046调试总结

时间:2020-07-21
本文章向大家介绍笔记:XPT2046调试总结,主要包括笔记:XPT2046调试总结使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、芯片

1.1 芯片简介

四线电阻屏驱动芯片
差分输入模式,12位模式,转换速率125KHz,SPI时钟频率2MHz

1.2 命令字

采用SPI接口,一次完整转换需要24个串行时钟周期
前8个时钟周期输入控制字节,3个多周期后进入转换状态,12个周期完成数模转换



1.3 笔中断输出

当PD0=0时,笔中断输出触发;当PD0=1,笔中断输出禁止
笔中断输出引脚上拉电阻越高,对触摸屏反应越慢
在X、Y坐标测量中,笔中断被禁止,输出为低电平
如果最后写进芯片的控制字包含PD0=1,笔中断输出功能禁止,不能监测触摸屏上触摸动作。要想重新使能笔中断输出功能,需要把带有PD0=0的控制字写入芯片
官方文档建议:无论在任何时候,处理器在发控制字给XPT2046之前,都要屏蔽笔中断,以避免错误的中断触发

二、外围电路

三、芯片驱动

STM32-HAL库,SPI配置

    /* Set the SPI parameters */
    hspi2.Instance               = SPI1;
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    hspi2.Init.Direction         = SPI_DIRECTION_2LINES;
    hspi2.Init.CLKPhase          = SPI_PHASE_1EDGE;
    hspi2.Init.CLKPolarity       = SPI_POLARITY_LOW;
    hspi2.Init.DataSize          = SPI_DATASIZE_8BIT;
    hspi2.Init.FirstBit          = SPI_FIRSTBIT_MSB;
    hspi2.Init.TIMode            = SPI_TIMODE_DISABLE;
    hspi2.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    hspi2.Init.CRCPolynomial     = 7;
    hspi2.Init.CRCLength         = SPI_CRC_LENGTH_8BIT;
    hspi2.Init.NSS               = SPI_NSS_SOFT;
    hspi2.Init.NSSPMode          = SPI_NSS_PULSE_DISABLE;
    hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;  /* Recommanded setting to avoid glitches */
    hspi2.Init.Mode              = SPI_MODE_MASTER;

    /* 复位配置 */
    if (HAL_SPI_DeInit(&hspi2) != HAL_OK)
    {
        Error_Handler(__FILE__, __LINE__);
    }    

    /* 初始化配置 */
    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
        /* Initialization Error */
        Error_Handler(__FILE__, __LINE__);
    }    

SPI读写函数

void bsp_xpt2046_spiWrite(uint8_t data)
{
    HAL_SPI_Transmit(&hspi2, &data, 1, 20000); //不配置硬件片选(NSS)功能,手动片选
}

uint8_t bsp_xpt2046_spiRead(void)
{
    uint8_t rxData = 0;
    uint8_t txData = 0;

    //HAL_SPI_Receive(&hspi2, &data, 1, 20000);
    /* 注意读取转换结果时,填充的命令字(PD0=0),直接填充0x00即可 */
    HAL_SPI_TransmitReceive(&hspi2, &txData,&rxData, 1, 20000);
    return rxData;
}
/*
*********************************************************************************************************
*    函 数 名: xpt2046_ReadAdc
*    功能说明: 选择一个模拟通道,启动ADC,并返回ADC采样结果
*    形    参: _ucCMD,通道采样命令 
*    返 回 值: 12位ADC值
*********************************************************************************************************
*/
uint16_t bsp_xpt2046_ReadAdc(uint8_t _ucCMD)
{
    uint16_t usAdc;

    xpt2046_SetCS_L;        /* 使能TS2046的片选 */

    /*
        TSC2046 控制字(8Bit)
        Bit7   = S     起始位,必须是1
        Bit6:4 = A2-A0 模拟输入通道选择A2-A0; 共有6个通道。
        Bit3   = MODE  ADC位数选择,0 表示12Bit;1表示8Bit
        Bit2   = SER/DFR 模拟输入形式,  1表示单端输入;0表示差分输入
        Bit1:0 = PD1-PD0 掉电模式选择位
    */
    bsp_xpt2046_spiWrite(_ucCMD);            /* 选择转换通道,选择转换坐标轴 */
    //bsp_DelayUS(6);
    /* 读ADC结果, 12位ADC值的高位先传,前12bit有效,最后4bit填0 */
    usAdc = bsp_xpt2046_spiRead();        /* 发送的0x00可以为任意值,无意义 */
    usAdc <<= 8;
    usAdc += bsp_xpt2046_spiRead();        /* 获得12位的ADC采样值 */

    usAdc >>= 3;                        /* 右移3位,保留12位有效数字.  */

    xpt2046_SetCS_H;                    /* 禁能片选 */

    return (usAdc);
}

四、问题总结

4.1 SPI配置

XPT2046-SPI接口频率2MHz左右,配置时注意MCU-SPI接口频率不要过高

4.2 触摸笔中断

注意读XPT2046转换结果时,写入的字节为0x00,
如果填充为0xff,则会导致下一次触摸笔中断失效

原文地址:https://www.cnblogs.com/bog-box/p/13353069.html