コマンドフォーマット:
bit |
名前 |
説明 |
7 |
S |
スタートビット (必ず 1 にセットして使う) |
6..4 |
A2..A0 |
チャンネルセレクト |
3 |
Mode |
12 bit(2MHz) / 8 bit(3MHz) モード切り替え |
2 |
SER/DFR |
読み込みタイプ (0=Differential, 1=Single-Ended) |
1..0 |
PD1..PD0 |
パワーダウンモード |
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) のみアクセス可能です。
PD1 |
PD0 |
/PENIRQ |
VREF |
ADC |
説明 |
推奨使用モード |
0 |
0 |
Enabled |
Auto |
Auto |
Power-down between conversions |
Differential Mode (タッチスクリーン, Penirq) |
0 |
1 |
Disabled |
Off |
On |
Voltage reference off, ADC on |
Single-Ended Mode (温度センサ, マイク) |
1 |
0 |
Enabled |
On |
Off |
Voltage reference on, ADC off |
/ |
1 |
1 |
Disabled |
On |
On |
Device 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_TEMP1 |
0x84 |
Measures temperature diode 1 |
TSC_MEASURE_Y |
0x94 |
Measures Y position |
TSC_MEASURE_BATTERY |
0xA4 |
Does not work on DS, VBAT is grounded |
TSC_MEASURE_Z1 |
0xB4 |
Measures cross-panel position 1 |
TSC_MEASURE_Z2 |
0xC4 |
Measures cross-panel position 2 |
TSC_MEASURE_X |
0xD4 |
Measures X position |
TSC_MEASURE_AUX |
0xE4 |
Measures ?, its non-zero, but I don't know what |
TSC_MEASURE_TEMP2 |
0xF4 |
Measures 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;
リンク:
最終更新:2007年12月09日 22:13