应用笔记 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里还有更多数据。

下一步
EE-Mail 订阅EE-Mail,接收关于您感兴趣的新文档的自动通知。
© , Maxim Integrated Products, Inc.
The content on this webpage is protected by copyright laws of the United States and of foreign countries. For requests to copy this content, contact us.
APP 4054:
应用笔记 4054,AN4054, AN 4054, APP4054, Appnote4054, Appnote 4054