应用笔记 4054

MAX7359用于PDA/智能电话的多功能键和游戏键控制:编程指南

By: Walter Chen

摘要 : 当操作系统或应用程序需要检测多个按键同时按下时(例如Ctrl-Alt-Del和游戏控制),通常需要扩展手机芯片组的按键控制功能。MAX7359是一款理想的扩展按键开关的控制器,可用于构建PDA和智能电话的QWERTY键盘多功能键和游戏键控制。MAX7359可通过I²C接口连接到手机芯片组,并可使用简单的程序代码选择所需功能。

MAX7359概述

MAX7359是一款低功耗、特定功能的按键开关控制器,非常适合蜂窝电话、打印机及其他便携式应用。该器件可最多控制64个按键。器件为每个按键的按下和弹起都分配了独立的代码。多个按键可以按照不同顺序同时按下和/或保持、弹起。多达16个按键按下、弹起的输入操作可以被保存在FIFO内。MAX7359以一个字节为单位采集按键的按下或弹起输入,并通过简单的I²C接口读取。为了增强芯片的抗噪声能力,按键提供去抖检测。换句话说,它在很短的时间内对每次击键操作进行两次扫描,以确认击键动作是否有效。

为降低功耗,MAX7359在等待按键动作时处于休眠模式,仅消耗1.2µA电流。按键按下时,该控制器在200µs之内唤醒,从而采集按键的按下/弹起信息。经过一个固定的按键操作间隔时间(0.256s至8s)后,芯片再次进入休眠模式。需要注意的是,即使在休眠模式下也可以读取按键FIFO的信息。为了减轻主机的工作负荷,可以使用中断信号。当按键按下或FIFO达到预设的输入值时,芯片产生中断信号。该中断信号可以通过I²C接口读取,或在FIFO清空时被清除。

MAX7359是MAX7349改进版,供电范围为1.8V到3.3V。图1给出了MAX7359通过I²C与主机的典型连接。由于该I²C接口是开漏端口,因此MAX7359可连接到不同供电电压的主机。

图1. 通过I²C接口连接MAX7359。
图1. 通过I²C接口连接MAX7359。

MAX7359编程

FIFO中存储的是按键操作信息,所要求的功能由控制器内的其它寄存器定义。FIFO的寄存器地址是0x00,配置寄存器的地址是0x01,0x02到0x06地址的寄存器用于定义其余操作。

MAX7359寄存器的内容可以通过I²C写命令设定,并通过I²C读命令进行校验。I²C写命令首先发送控制器的器件地址,控制器地址取决于AD0引脚的状态,分别为0x70、0x74、0x78、0x7C。随后是寄存器地址,寄存器地址之后可能发送多个数据字节。如果只有一个字节的数据,它将存储在前一个字节指定的寄存器内。当数据多于一个字节时,第一个字节存储在指定的寄存器内,下一个字节将存储在对应的下一个地址寄存器内,依次类推。该操作基于控制器寄存器地址的自动递增特性。例如,执行写命令:0x70、0x01、0x0A、0x00,器件将把0x0A写入0x01寄存器,0x00写入0x02寄存器。寄存器地址的自动递增特性适用于FIFO地址0x00以外的所有可进行写操作寄存器,包括写命令和读命令。如果I²C写命令的寄存器地址之后没有数据字节,那么它通常用于设置下一次读命令的地址。

I²C读命令从发送MAX7359芯片地址开始,后面紧随一个或多个数据字节。当只读取一个数据字节时,数据来自上一次没有相应数据字节的写命令指定的寄存器。否则,该数据将来自上一次写或读命令操作的寄存器。超过一个数据字节时,第一个字节来自指定的寄存器,除FIFO寄存器外,地址递增机制同样适用于其余的数据字节。换而言之,重复读FIFO寄存器0x00不需要重新设置地址。

上电复位时,MAX7359将随时准备进行按键弹起检测、按键按下唤醒以及自动关断功能(缺省设置)。另外,只有两列可用作按键开关控制,共计16个有效键。其余六列/GPO (通用输出)在高电平时工作于GPO模式。下面的I²C命令可用于激活六列/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里还有更多数据。