摘要:当操作系统或应用程序需要检测多个按键同时按下时(例如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。
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里还有更多数据。
| 相关型号 | |
APP 4054: Oct 23, 2007
|
|
|
自动更新
需要自动接收最新发布的应用笔记吗?请订阅EE-Mail™ (English only)。
我们期待您的反馈! 喜欢?不喜欢?有待改善?或为我们提供建议?请与我们联系 — 我们将根据您的意见或建议改善我们的工作。
网页评价或提供建议
|
下载,PDF格式 (50kB)
AN4054,
AN 4054,
APP4054,
Appnote4054,
Appnote 4054
|
|