屏幕是某信买的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,输入模式,无上下
|