TI社の TSC2046 コントローラが入ってます。

ARM7 の SPI ポートに繋がってます。 タッチスクリーンの値の取得は、SPIポートにコマンドを発行することで行います。

devKitPro には、この辺のことをラッピングする関数がいろいろついてますので、ここに載ってるようなことを直接扱うことはあんまりないと思います。

コマンドフォーマット

ビット名前説明
7Sスタートビット (必ず 1 にセットして使う)
4 〜 6A0, A1, A2チャンネルセレクト
3Mode12 bit(2MHz) / 8 bit(3MHz) モード切り替え
2SER/DFR読み込みタイプ (0=Differential, 1=Single-Ended)
0 〜 1PD0, PD1パワーダウンモード

チャンネルセレクト (4 〜 6)

内容説明
0温度 0初期設定が必要。2.1mV 毎に1℃ の精度
1タッチスクリーン Y 座標大体 0B0h 〜 F20h で変動。FFFh=押されていない時
2バッテリー電圧未使用。DS の GND に接続されている。常に 000h
3タッチスクリーン Z1 座標圧力センサ?
4タッチスクリーン Z2 座標圧力センサ?
5タッチスクリーン X 座標大体 100h 〜 ED0h で変動。000h=押されていない時
6補助入力DSのマイクに接続されている
7温度 1初期設定不要。 2℃ の精度

全てのチャンネルは、シングルエンデッドモードで接続できます。 ディファレンシャルモードにした場合、1,3,4,5 (X,Z1,Z2,Y) のみアクセス可能です。

パワーダウンモード (0 〜 1)

PD1PD0/PENIRQVREFADC説明推奨使用モード
00EnabledAutoAutoPower-down between conversionsDifferential Mode (タッチスクリーン, Penirq)
01DisabledOffOnVoltage reference off, ADC onSingle-Ended Mode (温度センサ, マイク)
10EnabledOnOffVoltage reference on, ADC off
11DisabledOnOnDevice always powered. Voltage reference on, ADC on

VREF = 内部電源 ADC = アナログデジタルコンバータ

/PENIRQ は、R2_CR の bit 6 に繋がれています。

The DS has wired an external VREF of 3.3 V to the TSC, instead of using the internal 2.5 VREF. This impacts the temperature calculations below, and converting any reading into an actual voltage.

便利なコマンド

定数説明
TSC_MEASURE_TEMP10x84Measures temperature diode 1
TSC_MEASURE_Y0x94Measures Y position
TSC_MEASURE_BATTERY0xA4Does not work on DS, VBAT is grounded
TSC_MEASURE_Z10xB4Measures cross-panel position 1
TSC_MEASURE_Z20xC4Measures cross-panel position 2
TSC_MEASURE_X0xD4Measures X position
TSC_MEASURE_AUX0xE4Measures ?, its non-zero, but I don't know what
TSC_MEASURE_TEMP20xF4Measures temperature diode 2

12-bit の、測定サイクルは 3バイトの SPI 転送 から成っている。

  • 最初の転送:コマンド転送と意味の無いデータが戻ってくる
  • 2回目の転送:戻り値 0 、測定値 (11)..測定値 (5)
  • 3回目の転送: 測定値を返す (4..0) 000

測定用の TSC 入力のコード例:

BlockingWriteSPI(command);
data = BlockingWriteSPI(0);
data = (data << 5) | (BlockingWriteSPI(0) >> 3);

温度計算:

Temperature diode two has a 91 times larger current, and the absolute temperature can be calculated based on the measurements of the two sensors. I'll present a fixed point algorithm for computing the temperature in degrees C (see the TSC 2046 datasheet for the original equation). temperature(deg C) = 8490 * (V_I91 - V_I1) - 273*4096; (in 20.12 fixed point)

タッチスクリーンセンサの読み込み (SPI)

uint16 touchRead(uint32 command) {
 uint16 result;
 while (SERIAL_CR & SERIAL_BUSY) swiDelay(1);

 // コマンド書き込みと完了待ち
 SERIAL_CR = SERIAL_ENABLE | 0x800 | 0x201;
 SERIAL_DATA = command;
 while (SERIAL_CR & SERIAL_BUSY) swiDelay(1);

 // 2回目のコマンド書き込みとデータの一部取得
 SERIAL_DATA = 0;
 while (SERIAL_CR & SERIAL_BUSY) swiDelay(1);
 result = SERIAL_DATA;

 // 残りのデータの取得 (最後の転送)
 SERIAL_CR = SERIAL_ENABLE | 0x201;
 SERIAL_DATA = 0;
 while (SERIAL_CR & SERIAL_BUSY) swiDelay(1);

 // 結果を返す
 return ((result & 0x7F) << 5) | (SERIAL_DATA >> 3);
}

Todo: figure out what bit 11, bit 9, and bit 0 are doing (bit 0 is probably the CR select, since the firmware reads have this bit cleared)

位置計算

#define SCREEN_WIDTH   256
#define SCREEN_HEIGHT   192

// ピクセル位置の2箇所を取得するためのレジスタ。クリック位置の調整用に2箇所を取得する
#define TOUCH_CNTRL_X1   (*(vu8*)0x027FFCDC)
#define TOUCH_CNTRL_Y1   (*(vu8*)0x027FFCDD)
#define TOUCH_CNTRL_X2   (*(vu8*)0x027FFCE2)
#define TOUCH_CNTRL_Y2   (*(vu8*)0x027FFCE3)

// タッチスクリーン用レジスタの位置の宣言
#define TOUCH_CAL_X1   (*(vu16*)0x027FFCD8)
#define TOUCH_CAL_Y1   (*(vu16*)0x027FFCDA)
#define TOUCH_CAL_X2   (*(vu16*)0x027FFCDE)
#define TOUCH_CAL_Y2   (*(vu16*)0x027FFCE0)

// タッチスクリーン位置からピクセル位置へはリニアマッピングを使う

// いくつかの変数の準備
static int16 TOUCH_WIDTH  = TOUCH_CAL_X2 - TOUCH_CAL_X1;
static int16 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1;
static int16 CNTRL_WIDTH  = TOUCH_CNTRL_X2 - TOUCH_CNTRL_X1;
static int16 CNTRL_HEIGHT = TOUCH_CNTRL_Y2 - TOUCH_CNTRL_Y1;


// ピクセルポジションの取得
int16 x = (IPC->touchX - (int16) TOUCH_CAL_X1) * CNTRL_WIDTH  / TOUCH_WIDTH  + (int16) TOUCH_CNTRL_X1;
int16 y = (IPC->touchY - (int16) TOUCH_CAL_Y1) * CNTRL_HEIGHT / TOUCH_HEIGHT + (int16) TOUCH_CNTRL_Y1;

リンク:

http://focus.tij.co.jp/jp/docs/toolsw/folders/print/tsc2046evm-pdk.html


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 17:45:25 (1310d)