TI社の TSC2046 コントローラが入ってます。 ARM7 の SPI ポートに繋がってます。 タッチスクリーンの値の取得は、SPIポートにコマンドを発行することで行います。 devKitPro には、この辺のことをラッピングする関数がいろいろついてますので、ここに載ってるようなことを直接扱うことはあんまりないと思います。 コマンドフォーマット †
チャンネルセレクト (4 〜 6) †
全てのチャンネルは、シングルエンデッドモードで接続できます。 ディファレンシャルモードにした場合、1,3,4,5 (X,Z1,Z2,Y) のみアクセス可能です。 パワーダウンモード (0 〜 1) †
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. 便利なコマンド †
12-bit の、測定サイクルは 3バイトの SPI 転送 から成っている。
測定用の 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 |