2
中解讀觸摸屏控制器(ADS7843)的原始數據!從stm32
我正在開發嵌入式項目,之前我從來沒有遇到過這樣的問題。我將在下面解釋這個問題。
我的環境:
- 與STM32F429ZI控制器定製電路板;
- ER TFT024-3 display(ili 9341),240x320;
- 觸摸屏控制器ADS7843。
顯示屏和觸摸屏控制器通過SPI協議連接並使用相同的端口。我想提一下,我使用軟件SPI。
問題是我無法將觸摸屏控制器的數據解釋爲真實的屏幕座標。
下面是結果的例子: example
#define UB_TOUCH_CMD_CH3 0x900000 // CH=X+, Mode=12bit, DiffEnded, PwrDown
#define UB_TOUCH_CMD_CH4 0xD00000 // CH=Y+, Mode=12bit, DiffEnded, PwrDown
void BSP_TS_GetState(TS_StateTypeDef* TsState)
{
static uint32_t _x = 0, _y = 0;
uint16_t xDiff, yDiff , x , y, xr, yr;
TsState->TouchDetected = TsDrv->DetectTouch();
if(TsState->TouchDetected)
{
TsDrv->GetXY(&x, &y);
// Here is convertation from raw data to display coordinates.
// ....
/* Update the X position */
TsState->X = x;
/* Update the Y position */
TsState->Y = y;
}
}
TsDrv-> GetXY調用方法ads7843_TS_GetXY
void ads7843_TS_GetXY(uint16_t *X, uint16_t *Y)
{
// ...
*X = P_Touch_Frame(UB_TOUCH_CMD_CH3);
*Y = P_Touch_Frame(UB_TOUCH_CMD_CH4);
}
uint16_t P_Touch_Frame(uint32_t frame)
{
uint16_t n;
uint32_t maske_out = 0x800000;
uint16_t maske_in = 0x800;
uint16_t data_in = 0x00;
TS_CS_LOW();
for (n = 0; n<24; n++) {
if ((frame & maske_out) == 0) {
LCD_SPI_MOSI_LOW();
}
else {
LCD_SPI_MOSI_HIGH();
}
LCD_SPI_SCK_HIGH();
if ((n >= 8) && (n <= 20)) {
if (LCD_SPI_MISO_GET() != 0) {
data_in |= maske_in;
}
maske_in = (maske_in >> 1);
}
LCD_SPI_SCK_LOW();
maske_out = (maske_out >> 1);
}
TS_CS_HIGH();
return(data_in);
}
我在找工作的現有驅動程序這個觸摸屏控制器或可能你請給我一個建議,我做錯了什麼。我應該如何正確解釋數據?