2C總線的鍵盤驅動的設計與實現(xiàn)"/>
摘 要:鍵盤是嵌入式系統(tǒng)中非常重要的一個組件。該設計基于Windows CE5.0操作系統(tǒng)、PXA270處理器,采用MAX7347芯片,以I2C總線通信為基礎。不同于通常的掃描式鍵盤陣列,鍵值的掃描由芯片處理。芯片作為為I2C的外設器件,驅動通過與CPU的通信完成對鍵盤操作的管理。這種設計可以實現(xiàn)多達64個按鍵的管理,與CPU通信只需要3條總線,有效地節(jié)省了GPIO口。把一部分原先需要軟件完成的工作放到硬件中完成,提高了按鍵處理速度。實驗結果表明采用此方案鍵盤的處理速度迅速、有效、可行性很高。
關鍵詞:嵌入式系統(tǒng);I2C;MAX7347;鍵盤與驅動
中圖分類號:TP391文獻標識碼:B文章編號:1004373X(2008)2006503
Design and Realization of the Keyboard Driver Based on I2C Bus
HE Jun,ZHANG Zhe
(National ASIC System Engineering Center,Southeast University,Nanjing,210096,China)
Abstract:Keyboard is one of the most important elements in embeded system.This design on the basis of PXA270 processor and WinCE operating system selects MAX7347 to communicate with CPU through I2C bus.Different from the common drivers,the scan of key value is done by the chip.As a peripheral of I2C,the driver controls the operation of the keyboard.The designation could process as much as 64 key values with 3 GPIO to communicate with CPU.It saves the GPIOs effectively.The designation shortens time of the whole process by putting some works from the software to hardware.The result of the experiment shows that this designation is available to accomplish all the work efficiently.
Keywords:embedded system;I2C;MAX7347;keyboard driver
1 引 言
隨著嵌入式系統(tǒng)的飛速發(fā)展,嵌入式PC在許多領域得到廣泛應用。其中嵌入式鍵盤作為一種人機交互工具,有著非常重要的作用。通常的鍵盤設計采用陣列的設計方式,例如一個含有9個鍵值的鍵盤需要6個通用I/O口來實現(xiàn)通信。鍵盤的鍵值越多,需要的通用I/O口也越多。
I2C(Inter-Integrated Circuit)總線是一種由Philips公司開發(fā)的2線式串行總線,用于連接微控制器及其外圍設備。I2C總線最主要的優(yōu)點是其簡單性和有效性。由于接口直接在組件上,因此I2C總線占用的空間非常小。I2C總線的另一個優(yōu)點是,它支持多主控(multimastering),其中任何能夠進行發(fā)送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。但在任何時間點上只能有一個主控。
I2C的這些特點使得在許多設計中備受青睞,本文所介紹的MAX7347-7349系列芯片,即是一款I2C兼容芯片。它將鍵值掃描等一系列操作封裝在芯片內部完成,CPU只需要通過I2C總線與芯片通信,通過向芯片寫入一定的命令完成某些操作。從而簡化了鍵盤驅動的處理。而且由于I2C支持多主控,因此不影響系統(tǒng)其他設備的操作。整個過程只需要3個通用I/O口與CPU通信,可以處理多達64個鍵值的響應,有效地節(jié)省了通用I/O口。
2 基本原理
2.1 鍵盤驅動實現(xiàn)原理
通常的鍵盤采用矩陣式原理,例如對于一個含20個鍵值的鍵盤,采用4×5的矩陣陣列,即4行5列。其中行和列直接與CPU的I/O口相連,4個I/O口作為中斷I/O口。一旦外部有鍵按下,就會產生中斷,由于鍵盤被按下后,該鍵對應的行和列被連通,因此根據(jù)判斷各列對應的I/O口的電平,可以得到被按下鍵的位置,從而采取相應的響應。
本文所采用的MAX7347-7349系列芯片內部有一個FIFO隊列,他在內部完成按鍵去抖、掃描鍵值、按鍵自動重復,以及某些時刻報警等一系列復雜的操作,而鍵盤驅動本身是需要通過發(fā)送一系列的命令來得到所需要的某些狀態(tài)值,從而進行相應的操作。
2.2 I2C總線通信原理
I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構成的串行總線,可發(fā)送和接收數(shù)據(jù)。各種被控制電路均并聯(lián)在這條總線上,每個電路和模塊都有惟一的地址。CPU會發(fā)出地址碼用來選址,即接通需要控制的電路。所以,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。
I2C總線定義了嚴格的傳輸信號來完成一次傳輸。
開始信號:當SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。
結束信號:當SCL為低電平時,SDA由低電平向高電平跳變,結束傳送數(shù)據(jù)。如圖1所示。
注意:SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態(tài)的改變會被識別為起始和停止條件。
應答信號:接收數(shù)據(jù)的IC在接收到8 b數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出1個信號后,等待受控單元發(fā)出1個應答信號,CPU接收到應答信號后,根據(jù)實際情況做出是否繼續(xù)傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現(xiàn)故障。如圖2所示。
3 具體實現(xiàn)
3.1 接口電路
如圖3所示MAX7347芯片電路示意圖。
其中11個腳為鍵盤陣列輸入連接到鍵盤外設,3行8列,最多可以控制24個不同按鍵。3個腳與PXA 270直接通信,INT為中斷腳,按鍵按下為低電平,SCL為I2C兼容串行時鐘輸入,SDA為I2C兼容串行I/O口。
當有鍵按下時,連接到鍵盤的11個腳會有電平的變化,芯片會根據(jù)電平的變化得到按下鍵的鍵值,然后存放在芯片內部的FIFO中,同時把INT腳下拉為低電平。此時鍵盤驅動在檢測到INT變低之后會通過SDA向芯片發(fā)送一系列命令,芯片通過SDA傳回給驅動相應的狀態(tài)及值。SCL和SDA的電平變化嚴格遵循2.2節(jié)介紹的I2C總線通信信號規(guī)律。
3.2 軟件實現(xiàn)框架
Windows CE操作系統(tǒng)驅動層分為MDD層(Model Device Driver,模型設備驅動)和PDD(Platform Dependent Driver,平臺相關驅動)兩層,框架結構如圖4所示。MDD層是抽象出來的一些功能,不與硬件直接相關,他接收PDD層傳來的數(shù)據(jù),完成處理得到的鍵值,發(fā)出消息通知處理處理響應操作的程序,PDD層與硬件直接相關,實現(xiàn)硬件接口以及獲得的硬件特性傳遞給MDD層。
驅動實現(xiàn)流程,PDD層主要實現(xiàn)鍵盤的監(jiān)控,開辟兩個線程,線程MaxKeyCheckPro監(jiān)控INT腳的電平變化。當有鍵按下,INT拉低,此時在I2C總線準備完畢的情況下,通過I2C總線發(fā)送讀取鍵值的命令讀取芯片的FIFO,芯片在接收到命令之后會將FIFO中存儲的鍵值通過I2C總線發(fā)出傳回給線程MaxKeyCheckPro,同時發(fā)出通知給線程KeybdIstThreadProc,將傳遞回來的鍵值傳給線程KeybdIstThreadProc,再由線程KeybdIstThreadProc負責將鍵值傳給MDD層,MDD層負責存儲鍵值,并發(fā)出消息通知相應的程序對鍵值做出響應。
采用兩個線程的目的是讓各自完成自己的操作,不會造成相互的影響,在按鍵頻繁觸發(fā)的情況下,線程MaxKeyCheckPro可以在快速得到鍵值傳遞出去之后立即等待下一次按鍵的發(fā)生,不會因為在處理其他的操作而使得下一次按鍵的響應有所延遲。
3.3 I2C總線的通信流程
由于按鍵的頻繁按下會導致不停地使用I2C總線讀取芯片F(xiàn)IFO,所以防止2次讀寫之間的干擾(即在一次讀寫沒有完成之前另一次讀寫操作也占用I2C總線,兩次的數(shù)據(jù)會造成紊亂)是一個重要的問題。
針對一次讀寫操作,考慮到其不可打斷性以防止數(shù)據(jù)的破壞,采用mutex互斥鎖。即每次只允許1個讀寫操作占用I2C總線。在1次讀寫操作開始之前,等待互斥鎖,直到讀寫操作完畢,釋放互斥鎖。這樣當在一次讀寫沒有完成之前,另一次讀寫無法占用I2C總線,而只能等待。具體流程如圖5所示:
3.4 具體讀寫操作
這里的鍵盤驅動與普通鍵盤驅動不同,不需要通過判斷鍵盤矩陣的電平變化來得到鍵值,這些操作由芯片內部完成。鍵盤控制器對按鍵操作去抖并且自動存入FIFO中,因此所需要做的操作就是在檢測到鍵盤按下之后讀取FIFO。如圖6所示。
但值得注意的是,每次按鍵按下之后,INT腳會被拉高,但是只有在將FIFO清空之后INT才會被拉低,拉低之后如果繼續(xù)有鍵盤按下,會繼續(xù)把鍵值存放在FIFO中。所以每次的讀取操作需要清空FIFO。但是在實際應用中發(fā)現(xiàn)當鍵盤在被快速按下時,對于FIFO中的操作都做出響應會影響系統(tǒng)的性能,所以選擇丟掉FIFO隊列中其他鍵值,只保留最后一個。
4 性能分析
整個過程CPU通過3根主線和芯片通信,實現(xiàn)了按鍵操作的快速響應和處理,可以控制最多達64個按鍵的防抖及響應,由于芯片封裝了一部分功能,由硬件來處理使得速度變快。由于I2C的多主控特點,不會影響掛在I2C上的其他外設的工作和性能。
5 結 語
本文介紹基于PXA270處理器和Windows CE 5.0操作系統(tǒng)上的鍵盤驅動的設計和實現(xiàn)。目前已經(jīng)在本平臺上穩(wěn)定運行,具有很好的按鍵處理能力。
參考文獻
[1] 傅曦,陳黎,董磊鋆,等.Windows CE嵌入式開發(fā)入門基于Xscale架構\\.北京:人民郵電出版社,2006.
[2]Intel Corporation.IntelRPXA27x Processor Family Developer′s Manual[S].April 2004.
[3]Microsoft.Microsoft Developer Network Library.April\\.2005.
[4]Microsoft.Microsoft Windows CE.NET HLEP[S].March2003.
[5]石秀民.嵌入式系統(tǒng)設計與開發(fā)實驗[M].北京:北京航空航天大學出版社,2006.
[6]田澤.嵌入式系統(tǒng)開發(fā)與應用實驗教程[M].北京:北京航空航天大學出版社,2004.
[7]陳向群,王雷,馬洪兵.Windows CE.NET系統(tǒng)分析及實驗教程[M].北京:機械工業(yè)出版社,2003.
[8]Microsoft 希望.Microsoft Windows CE Device Driver Kit設備驅動程序開發(fā)指南[M].北京:希望電子出版社,1999.
[9]MAX7347系列芯片文檔\\;Maxim Integrated Products;www.maxim-ic.com.cn.
[10]何立民.I2C總線應用系統(tǒng)設計\\.北京:北京航空航天大學出版社,2002.
作者簡介 賀 君 女,1984年出生,安徽蚌埠人,東南大學電子科學與工程學院國家專用集成電路工程技術研究中心碩士研究生。研究方向為微電子與固體電子學、嵌入式系統(tǒng)設計。
張 哲 男,1976年出生,東南大學電子工程系助教。