首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于I2C总线的键盘驱动的设计与实现
来源:本站整理  作者:佚名  2009-07-03 16:27:10



3.2 软件实现框架

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队列中其他键值,只保留最后一个。

4 性能分析

整个过程CPU通过3根主线和芯片通信,实现了按键操作的快速响应和处理,可以控制最多达64个按键的防抖及响应,由于芯片封装了一部分功能,由硬件来处理使得速度变快。由于I2C的多主控特点,不会影响挂在I2C上的其他外设的工作和性能。

5 结 语

本文介绍基于PXA270处理器和WindowsCE 5.0操作系统上的键盘驱动的设计和实现。目前已经在本平台上稳定运行,具有很好的按键处理能力。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:309,707.00000 毫秒