I2C总线在键盘驱动中的应用
扫描二维码
随时随地手机看文章
1 引 言
矩阵键盘驱动一般是层次型的,故驱动程序由两个独立的层组成:上层是模型设备驱动程序(MDD),映射矩阵键盘扫描码到虚拟键的编码上,产生与虚拟键编码相关的字符。然后打包键盘信息,并将此信息输入到系统信息队列中。下层是依赖平台的驱动程序(PDD),它将从硬件重新获得扫描码。
随着嵌入式系统的飞速发展,嵌入式PC在许多领域得到广泛应用。其中嵌入式键盘作为一种人机交互工具,有着非常重要的作用。通常的键盘设计采用阵列的设计方式,例如一个含有9个键值的键盘需要6个通用I/O口来实现通信。键盘的键值越多,需要的通用I/O口也越多。
I2C(Inter-IntegratedCircuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。由于连接到I2C总线的器件有不同种类的工艺(CMOS、NMOS、双极性),逻辑0(低)和逻辑1(高)的电平不是固定的,它由电源VCC的相关电平决定,每传输一个数据位就产生一个时钟脉冲。
I2C的这些特点使得在许多设计中备受青睐,本文所介绍的MAX7347-7349系列芯片,即是一款I2C兼容芯片。它将键值扫描等一系列操作封装在芯片内部完成,CPU只需要通过I2C总线与芯片通信,通过向芯片写入一定的命令完成某些操作。从而简化了键盘驱动的处理。而且由于I2C支持多主控,因此不影响系统其他设备的操作。整个过程只需要3个通用I/O口与CPU通信,可以处理多达64个键值的响应,有效地节省了通用I/O口。
2 基本原理
2.1 键盘驱动实现原理
通常的键盘采用矩阵式原理,例如对于一个含20个键值的键盘,采用4×5的矩阵阵列,即4行5列。其中行和列直接与CPU的I/O口相连,4个I/O口作为中断I/O口。一旦外部有键按下,就会产生中断,由于键盘被按下后,该键对应的行和列被连通,因此根据判断各列对应的I/O口的电平,可以得到被按下键的位置,从而采取相应的响应。
本文所采用的MAX7347-7349系列芯片内部有一个FIFO队列,他在内部完成按键去抖、扫描键值、按键自动重复,以及某些时刻报警等一系列复杂的操作,而键盘驱动本身是需要通过发送一系列的命令来得到所需要的某些状态值,从而进行相应的操作。
2.2 I2C总线通信原理
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。各种被控制电路均并联在这条总线上,每个电路和模块都有惟一的地址。CPU会发出地址码用来选址,即接通需要控制的电路。所以,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线定义了严格的传输信号来完成一次传输。
开始信号:当SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:当SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。如图1所示。
注意:SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变会被识别为起始和停止条件。
SDA也是I2C总线的数据信号线,I2C总线由数据线SDA和时钟信号线SCL构成串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps.各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
中央处理器(英文CentralProcessingUnit,CPU)是一台计算机的运算核心和控制核心。CPU、内部存储器和输入/输出设备是电子计算机三大核心部件。电脑中所有操作都由CPU负责读取指令,对指令译码并执行指令的核心部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。所谓的计算机的可编程性主要是指对CPU的编程。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。
应答信号:接收数据的IC在接收到8 b数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出1个信号后,等待受控单元发出1个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。如图2所示。
3 具体实现
3.1 接口电路
如图3所示MAX7347芯片电路示意图。
其中11个脚为键盘阵列输入连接到键盘外设,3行8列,最多可以控制24个不同按键。3个脚与PXA 270直接通信,INT为中断脚,按键按下为低电平,SCL为I2C兼容串行时钟输入,SDA为I2C兼容串行I/O口。
当有键按下时,连接到键盘的11个脚会有电平的变化,芯片会根据电平的变化得到按下键的键值,然后存放在芯片内部的FIFO中,同时把INT脚下拉为低电平。此时键盘驱动在检测到INT变低之后会通过SDA向芯片发送一系列命令,芯片通过SDA传回给驱动相应的状态及值。SCL和SDA的电平变化严格遵循2.2节介绍的I2C总线通信信号规律。
3.2 软件实现框架
WindowsCE作业系统是Windows家族中最新的成员,专门设计给掌上型电脑(HPCs)所使用的电脑环境。这样的作业系统可使完整的可携式技术与现有的Windows桌面技术整合工作。WindowsCE被设计成针对小型设备(它是典型的拥有有限内存的无磁盘系统)的通用操作系统,WindowsCE可以通过设计一层位于内核和硬件之间代码来用设定硬件平台,这即是众所周知的硬件抽象层(HAL)(在以前解释时,这被称为OEMC(原始设备制造)适应层,即OAL;内核压缩层,即KAL.以免与微软的WindowsNT操作系统HAL混淆)。
Windows CE操作系统驱动层分为MDD层(Model Device Driver,模型设备驱动)和PDD(Platform Dependent Driver,平台相关驱动)两层,框架结构如图4所示。MDD层是抽象出来的一些功能,不与硬件直接相关,他接收PDD层传来的数据,完成处理得到的键值,发出消息通知处理处理响应操作的程序,PDD层与硬件直接相关,实现硬件接口以及获得的硬件特性传递给MDD层。
驱动实现流程,PDD层主要实现键盘的监控,开辟两个线程,线程MaxKeyCheckPro监控INT脚的电平变化。当有键按下,INT拉低,此时在I2C总线准备完毕的情况下,通过I2C总线发送读取键值的命令读取芯片的FIFO,芯片在接收到命令之后会将FIFO中存储的键值通过I2C总线发出传回给线程MaxKeyCheckPro,同时发出通知给线程KeybdIstThreadProc,将传递回来的键值传给线程KeybdIstThreadProc,再由线程KeybdIstThreadProc负责将键值传给MDD层,MDD层负责存储键值,并发出消息通知相应的程序对键值做出响应。
采用两个线程的目的是让各自完成自己的操作,不会造成相互的影响,在按键频繁触发的情况下,线程MaxKey CheckPro可以在快速得到键值传递出去之后立即等待下一次按键的发生,不会因为在处理其他的操作而使得下一次按键的响应有所延迟。
3.3 I2C总线的通信流程
由于按键的频繁按下会导致不停地使用I2C总线读取芯片FIFO,所以防止2次读写之间的干扰(即在一次读写没有完成之前另一次读写操作也占用I2C总线,两次的数据会造成紊乱)是一个重要的问题。
针对一次读写操作,考虑到其不可打断性以防止数据的破坏,采用mutex互斥锁。即每次只允许1个读写操作占用I2C总线。在1次读写操作开始之前,等待互斥锁,直到读写操作完毕,释放互斥锁。这样当在一次读写没有完成之前,另一次读写无法占用I2C总线,而只能等待。具体流程如图5所示:
3.4 具体读写操作
这里的键盘驱动与普通键盘驱动不同,不需要通过判断键盘矩阵的电平变化来得到键值,这些操作由芯片内部完成。键盘控制器对按键操作去抖并且自动存入FIFO中,因此所需要做的操作就是在检测到键盘按下之后读取FIFO.如图6所示。
但值得注意的是,每次按键按下之后,INT脚会被拉高,但是只有在将FIFO清空之后INT才会被拉低,拉低之后如果继续有键盘按下,会继续把键值存放在FIFO中。所以每次的读取操作需要清空FIFO.但是在实际应用中发现当键盘在被快速按下时,对于FIFO中的操作都做出响应会影响系统的性能,所以选择丢掉FIFO队列中其他键值,只保留最后一个。
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
4 性能分析
整个过程CPU通过3根主线和芯片通信,实现了按键操作的快速响应和处理,可以控制最多达64个按键的防抖及响应,由于芯片封装了一部分功能,由硬件来处理使得速度变快。由于I2C的多主控特点,不会影响挂在I2C上的其他外设的工作和性能。
5 结 语
本文介绍基于PXA270处理器和WindowsCE 5.0操作系统上的键盘驱动的设计和实现。目前已经在本平台上稳定运行,具有很好的按键处理能力。
QICK