2015-12-14 90 views
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); 
} 

我在找工作的現有驅動程序這個觸摸屏控制器或可能你請給我一個建議,我做錯了什麼。我應該如何正確解釋數據?

回答

2

ADS7843是一個非常簡單的設備。它在屏幕座標中不起作用,它只是給你兩個與屏幕座標成線性比例的數字。要轉換爲屏幕座標,您需要找到該線性函數(即ScreenX = RawX * CoeffX + OffsetX,對於Y座標也是如此)。獲取兩個對角的測量值並將其計算出來。

根據硬件的製造工藝不同,不同單元之間的線性函數可能會有所不同。因此,您可能希望在固件中具有校準功能。

另外,在編程ADS7843時,我發現this resource非常有用。