アプリケーションノート 4054

PDA/スマートフォンのマルチファンクションキーおよびゲームキーのためのMAX7359の用法:プログラミングガイド

筆者: Walter Chen

要約: 携帯電話用のチップセットのキーパッド制御特性は多くの場合、オペレーティングシステムまたはアプリケーションが複数のキー押下(例:Ctrl-Alt-Delおよびゲーム制御)を検出する必要がある場合にその限界まで使用されます。MAX7359はPDA/スマートフォンのQWERTYキーパッドのマルチファンクションキーおよびゲーム用のキーを実装するための理想的なアッドオンのキースイッチコントローラです。MAX7359はI²C経由で携帯電話用のチップセットに接続することができ、簡単なプログラムの作成で所望の機能セットを選択して使用することができます。

MAX7359の概要

MAX7359は低消費電力の特殊用途のキースイッチコントローラであり、携帯電話、プリンタ、およびその他の携帯アプリケーションに適しています。このデバイスを使うと最大64個のキーを実現することができます。各キーにはキーの押下と開放で別のコードが割り当てられます。複数のキーを同時に押下および/または異なった順序で保持および開放とすることができます。最大16個のキー押下および開放入力をFIFOレジスタに保持可能です。キーの動作情報はMAX7359によって集められて簡単なI²Cインタフェース経由で読み取られますが、1回のキー押下または開放に1バイトが割り当てられます。デバイスのノイズ耐性を強化するために、キー押下の検出はバウンス保護されています。具体的には、キー押下のたびに短時間に2度スキャンされて検出されます。

電力消費を下げるために、MAX7359はキー動作の待機中はスリープモードであり、1.2µAしか消費しません。キーを押下すると、このコントローラは200µs以内に起動してキー押下/開放の情報を収集します。0.256s~8sに定めるキー動作後のアイドル時間の後、デバイスは再びスリープモードになります。FIFO内のキー情報はスリープモードでもアクセスすることができます。ホストが常時監視しなくてよいように、キー押下のたびに、またはFIFOが既定のエントリ数に達した場合、割込み信号を発生することができます。割込み信号はデバイスをI²C経由で読み取るか、またはFIFOが空になったときクリアされます。

MAX7359はMAX7349のエンハンスバージョンであり、1.8Vから~3.3Vの電源範囲で動作します。図1はI²CによるMAX7359のホストとの標準的な接続を示しています。I²Cインタフェースはオープンドレインのポートであるため、MAX7359はホストとさまざまな電源電圧でインタフェースすることができます。

Figure 1. Connecting the MAX7359 through an I²C interface.
図1. I²CインタフェースによるMAX7359の接続

MAX7359のプログラミング

キーの動作情報はFIFOに含まれており、所望の動作機能はコントローラ内部の他のレジスタで定義されます。FIFOレジスタのアドレスは0x00です。構成レジスタのアドレスは0x01であり、その他の動作機能はアドレスが0x02~0x06のレジスタで定義されます。

MAX7359のレジスタの内容はI²Cの書込みコマンドで定められ、I²C読取りコマンドで確認されます。I²Cの書込みコマンドはコントローラのデバイスアドレスで始まり、その後にレジスタアドレスが続きます。デバイスアドレスはAD0端子の接続の仕方で0x70、0x74、0x78、または0x7Cになります。レジスタアドレスに続いて、幾つかのデータバイトがあります。データバイトが1つしかない場合は、先行バイトで決められるレジスタに格納されます。データバイト数が複数の場合は、最初のバイトは定められたレジスタに格納され、次のバイトはアドレスが1つ大きい数のレジスタに格納され、以下同様です。この動作はコントローラのレジスタアドレスの自動増加機能によります。つまり、0x70、0x01、0x0A、および0x00の書込みコマンドはレジスタ0x01に0x0Aバイトを、レジスタ0x02に0x00バイトを格納します。レジスタアドレスの自動増加機能はすべての書込みおよび読取りコマンドの両方に対して適用されますが、FIFOアドレスの0x00は例外です。レジスタアドレスの後にデータバイトがないI²Cコマンドは通常次の読取りコマンドのレジスタアドレスを設定するために使われます。

I²Cの読取りコマンドはMAX7359のデバイスアドレスで始まり、その後に1個または複数のデータバイトが続きます。データバイトが1個のみの場合、データはデータバイトを持たない先行の書込みコマンドで定められるレジスタから読み出されます。そうでない場合は、書込みまたは読出しコマンドでアクセスされた最後のレジスタから読み出されます。1個を超えるデータがある場合、最初のバイトは定められたレジスタから読み出され、レジスタアドレスの自動増加機構はFIFOレジスタを除いてデータバイトの残りに適用されます。つまり、FIFOレジスタの0x00を繰り返して読み取るためにレジスタアドレスの再設定は不要であるということです。

電源オンリセットの間、MAX7359はキー開放、キー押下ウエイクアップの動作の用意ができており、自動シャットダウン機能はイネーブル(デフォルト設定)となっています。さらに、キースイッチの制御用にアクティブなコラムは2つしかなく、使用可能なキーは合計で16個となります。6個のコラム/GPO (汎用出力)ポートの残りはロジックハイでGPOモード となります。次に示すI²Cコマンド構造は6個のコラム/GPOポートをアクティブにするために使用することができ、合計で64個のキーとなります。
// A Write Command to disable GPO ports
0x70		// MAX7359 device address
0x02		// GPO enable and debounce register
0x00		// Disable GPO ports and 9ms debounce time
次に示すI²CコマンドはFIFOエントリの読取りに使うことができます。
// A write command to set the register address to 0x00 and a read command from the FIFO
// A write 0 data byte to address 0x00 command
0x70		// MAX7359 device address

0x00		// FIFO register
// A read one byte from FIFO command
0x71		// MAX7359 device address
0xXX		// A data byte from the FIFO. The value depends on what is there
次のI²CコマンドはMAX7359が64個のキーの動作をイネーブルとしてキーを押下したときに割込み信号を送信するために使うことができます。割込み信号はMAX7359がI²Cインタフェースを通して読み取られるとクリアされます。
// Initialization
More = 0x80				// More keys in the FIFO mask
Key = 0x00				// Key code variable
0x70, 0x02, 0x00			// Disable GPO ports
0x70, 0x03, 0x02           		// Enable interrupt upon a keypress
0x70, 0x01, 0x2A            		// Enable interrupt cleared once read

// When an interrupt is received
0x70, 0x00			// Set the register address to 0x00
Loop:	0x71, 0xXX		// Read the FIFO register
Key = 0xXX			// Assign the key code to a variable
Save the key code		// Save the key code for application
If (Key | More) go to Loop	// If not the last entry, read more key codes
表1. キー押下でFIFOにエントリされる最後のコード
  Col. 0 Col. 1 Col. 2 Col. 3 Col. 4 Col. 5 Col. 6 Col. 7
Row 0 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38
Row 1 0x01 0x09 0x11 0x19 0x21 0x29 0x31 0x39
Row 2 0x02 0x0A 0x12 0x1A 0x22 0x2A 0x32 0x3A
Row 3 0x03 0x0B 0x13 0x1B 0x23 0x2B 0x33 0x3B
Row 4 0x04 0x0C 0x14 0x1C 0x24 0x2C 0x34 0x3C
Row 5 0x05 0x0D 0x15 0x1D 0x25 0x2D 0x35 0x3D
Row 6 0x06 0x0E 0x16 0x1E 0x26 0x2E 0x36 0xBE*
Row 7 0x07 0x0F 0x17 0x1F 0x27 0x2F 0x37 0xBF*
* FIFOが空であるかどうかを知るために複数回読み取ります。

表2. キー開放でFIFOにエントリされる最後のコード
  Col. 0 Col. 1 Col. 2 Col. 3 Col. 4 Col. 5 Col. 6 Col. 7
Row 0 0x40 0x48 0x50 0x58 0x60 0x68 0x70 0x78
Row 1 0x41 0x49 0x51 0x59 0x61 0x69 0x71 0x79
Row 2 0x42 0x4A 0x52 0x5A 0x62 0x6A 0x72 0x7A
Row 3 0x43 0x4B 0x53 0x5B 0x63 0x6B 0x73 0x7B
Row 4 0x44 0x4C 0x54 0x5C 0x64 0x6C 0x74 0x7C
Row 5 0x45 0x4D 0x55 0x5D 0x65 0x6D 0x75 0x7D
Row 6 0x46 0x4E 0x56 0x5E 0x66 0x6E 0x76 0xFE*
Row 7 0x47 0x4F 0x57 0x5F 0x67 0x6F 0x77 0xFF*
* FIFOが空であるかどうかを知るために複数回読み取ります。

表3. FIFOに複数のエントリがあるキー押下コード
  Col. 0 Col. 1 Col. 2 Col. 3 Col. 4 Col. 5 Col. 6 Col. 7
Row 0 0x80 0x88 0x90 0x98 0xA0 0xA8 0xB0 0xB8
Row 1 0x81 0x89 0x91 0x99 0xA1 0xA9 0xB1 0xB9
Row 2 0x82 0x8A 0x92 0x9A 0xA2 0xAA 0xB2 0xBA
Row 3 0x83 0x8B 0x93 0x9B 0xA3 0xAB 0xB3 0xBB
Row 4 0x84 0x8C 0x94 0x9C 0xA4 0xAC 0xB4 0xBC
Row 5 0x85 0x8D 0x95 0x9D 0xA5 0xAD 0xB5 0xBD
Row 6 0x86 0x8E 0x96 0x9E 0xA6 0xAE 0xB6 0xBE*
Row 7 0x87 0x8F 0x97 0x9F 0xA7 0xAF 0xB7 0xBF*
* FIFOが空であるかどうかを知るために複数回読み取ります。

表4. FIFOに複数のエントリがあるキー開放コード
  Col. 0 Col. 1 Col. 2 Col. 3 Col. 4 Col. 5 Col. 6 Col. 7
Row 0 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8 0xF0 0xF8
Row 1 0xC1 0xC9 0xD1 0xD9 0xE1 0xE9 0xF1 0xF9
Row 2 0xC2 0xCA 0xD2 0xDA 0xE2 0xEA 0xF2 0xFA
Row 3 0xC3 0xCB 0xD3 0xDB 0xE3 0xEB 0xF3 0xFB
Row 4 0xC4 0xCC 0xD4 0xDC 0xE4 0xEC 0xF4 0xFC
Row 5 0xC5 0xCD 0xD5 0xDD 0xE5 0xED 0xF5 0xFD
Row 6 0xC6 0xCE 0xD6 0xDE 0xE6 0xEE 0xF6 0xFE*
Row 7 0xC7 0xCF 0xD7 0xDF 0xE7 0xEF 0xF7 0xFF*
* FIFOが空であるかどうかを知るために複数回読み取ります。

キーコードの0x3FはFIFO空のためにリザーブされています。
キーコードの0x7FはFIFOのオーバフローのためにリザーブされています。
キーコードの0x3Eはキーのリピートのためにリザーブされており、それは最後のFIFOエントリです。
キーコードの0x7EはFIFO内に複数エントリがある場合のキーリピートのためにリザーブされています。