新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PS/2接口協(xié)議解析和應(yīng)用

PS/2接口協(xié)議解析和應(yīng)用

作者: 時間:2012-01-03 來源:網(wǎng)絡(luò) 收藏

隨著計算機工業(yè)的發(fā)展,作為計算機最常用輸入設(shè)備的鍵盤也日新月異。1981年IBM推出了IBM pc/XT鍵盤及其接口標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義了83鍵,采用5腳DIN連接器和簡單的串行協(xié)議。實際上,第一套鍵盤掃描碼集并沒有主機到鍵盤的命令。為此,1984年IBM推出了IBM AT鍵盤接口標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義了84~101鍵,采用5腳DIN連接器和雙向串行通訊協(xié)議,此協(xié)議依照第二套鍵盤掃描碼集設(shè)有8個主機到鍵盤的命令。到了1987年,IBM又推出了PS/2鍵盤接口標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)仍舊定義了84~101鍵,但是采用6腳mini-DIN連接器,該連接器在封裝上更小巧,仍然用雙向串行通訊協(xié)議并且提供有可選擇的第三套鍵盤掃描碼集,同時支持17個主機到鍵盤的命令。現(xiàn)在,市面上的鍵盤都和PS/2及AT鍵盤兼容,只是功能不同而已。



PS/2接口硬件


2.1 物理連接器

  一般,具有五腳連接器的鍵盤稱之為AT鍵盤,而具有六腳mini-DIN連接器的鍵盤則稱之為PS/2鍵盤。其實這兩種連接器都只有四個腳有意義。它們分別是Clock(時鐘腳)、DATA(數(shù)據(jù)腳)、+5V(電源腳)和Ground(電源地)。在PS/2鍵盤與pc機的物理連接上只要保證這四根線一一對應(yīng)就可以了。PS/2鍵盤靠pc的PS/2端口提供+5V電源,另外兩個腳Clock(時鐘腳)和DATA(數(shù)據(jù)腳)都是集電極開路的,所以必須接大阻值的上拉電阻。它們平時保持高電平,有輸出時才被拉到低電平,之后自動上浮到高電平?,F(xiàn)在比較常用的連接器如圖1所示。

2.2 電氣特性

  PS/2 通訊協(xié)議是一種雙向同步串行通訊協(xié)議。通訊的兩端通過Clock(時鐘腳)同步,并通過DATA(數(shù)據(jù)腳)交換數(shù)據(jù)。任何一方如果想抑制另外一方通訊時,只需要把Clock(時鐘腳)拉到低電平。如果是pc機和PS/2鍵盤間的通訊,則pc機必須做主機,也就是說,pc機可以抑制PS/2鍵盤發(fā)送數(shù)據(jù),而 PS/2鍵盤則不會抑制pc機發(fā)送數(shù)據(jù)。一般兩設(shè)備間傳輸數(shù)據(jù)的最大時鐘頻率是33kHz,大多數(shù)PS/2設(shè)備工作在10~20kHz。推薦值在 15kHz左右,也就是說,Clock(時鐘腳)高、低電平的持續(xù)時間都為40μs。每一數(shù)據(jù)幀包含11~12個位,具體含義如表1所列。

表1 數(shù)據(jù)幀格式說明

1個起始位總是邏輯0
8個數(shù)據(jù)位(LSB)低位在前
1個奇偶校驗位奇校驗
1個停止位總是邏輯1
1個應(yīng)答位僅用在主機對設(shè)備的通訊中


表中,如果數(shù)據(jù)位中1的個數(shù)為偶數(shù),校驗位就為1;如果數(shù)據(jù)位中1的個數(shù)為奇數(shù),校驗位就為0;總之,數(shù)據(jù)位中1的個數(shù)加上校驗位中1的個數(shù)總為奇數(shù),因此總進(jìn)行奇校驗。

2.3 PS/2設(shè)備和pc機的通訊

PS/2 設(shè)備的Clock(時鐘腳)和DATA(數(shù)據(jù)腳) 都是集電極開路的,平時都是高電平。當(dāng)PS/2設(shè)備等待發(fā)送數(shù)據(jù)時,它首先檢查Clock(時鐘腳)以確認(rèn)其是否為高電平。如果是低電平,則認(rèn)為是pc機抑制了通訊,此時它必須緩沖需要發(fā)送的數(shù)據(jù)直到重新獲得總線的控制權(quán)(一般PS/2鍵盤有16個字節(jié)的緩沖區(qū),而PS/2鼠標(biāo)只有一個緩沖區(qū)僅存儲最后一個要發(fā)送的數(shù)據(jù))。如果Clock(時鐘腳)為高電平,PS/2設(shè)備便開始將數(shù)據(jù)發(fā)送到pc機。一般都是由PS/2設(shè)備產(chǎn)生時鐘信號。發(fā)送時一般都是按照數(shù)據(jù)幀格式順序發(fā)送。其中數(shù)據(jù)位在Clock(時鐘腳)為高電平時準(zhǔn)備好,在Clock(時鐘腳)的下降沿被pc機讀入。PS/2設(shè)備到pc機的通訊時序如圖2所示。

當(dāng)時鐘頻率為15kHz時,從Clock(時鐘腳)的上升沿到數(shù)據(jù)位轉(zhuǎn)變時間至少要5μs。數(shù)據(jù)變化到Clock(時鐘腳)下降沿的時間至少也有5 μs,但不能大于25 μs,這是由PS/2通訊協(xié)議的時序規(guī)定的。如果時鐘頻率是其它值,參數(shù)的內(nèi)容應(yīng)稍作調(diào)整。

上述討論中傳輸?shù)臄?shù)據(jù)是指對特定鍵盤的編碼或者對特定命令的編碼。一般采用第二套掃描碼集所規(guī)定的碼值來編碼。其中鍵盤碼分為通碼(make)和斷碼 (Break)。通碼是按鍵接通時所發(fā)送的編碼,用兩位十六進(jìn)制數(shù)來表示,斷碼通常是按鍵斷開時所發(fā)送的編碼,用四位十六進(jìn)制數(shù)來表示。

3 PS/2接口的嵌入式軟件編程方法

PS/2設(shè)備主要用于產(chǎn)生同步時鐘信號和讀寫數(shù)據(jù)。

3.1 PS/2向pc機發(fā)送一個字節(jié)


從PS/2向pc機發(fā)送一個字節(jié)可按照下面的步驟進(jìn)行:

(1)檢測時鐘線電平,如果時鐘線為低,則延時50μs;

(2)檢測判斷時鐘信號是否為高,為高,則向下執(zhí)行,為低,則轉(zhuǎn)到(1);

(3)檢測數(shù)據(jù)線是否為高,如果為高則繼續(xù)執(zhí)行,如果為低,則放棄發(fā)送(此時pc機在向PS/2設(shè)備發(fā)送數(shù)據(jù),所以PS/2設(shè)備要轉(zhuǎn)移到接收程序處接收數(shù)據(jù));

(4)延時20μs(如果此時正在發(fā)送起始位,則應(yīng)延時40μs);

(5)輸出起始位(0)到數(shù)據(jù)線上。這里要注意的是:在送出每一位后都要檢測時鐘線,以確保pc機沒有抑制PS/2設(shè)備,如果有則中止發(fā)送;

(6)輸出8個數(shù)據(jù)位到數(shù)據(jù)線上;

(7)輸出校驗位;

(8)輸出停止位(1);

(9)延時30μs(如果在發(fā)送停止位時釋放時鐘信號則應(yīng)延時50μs);

通過以下步驟可發(fā)送單個位:

(1)準(zhǔn)備數(shù)據(jù)位(將需要發(fā)送的數(shù)據(jù)位放到數(shù)據(jù)線上);

(2)延時20μs;

(3)把時鐘線拉低;

(4)延時40μs;

(5)釋放時鐘線;

(6)延時20μs。

3.2 PS/2設(shè)備從pc機接收一個字節(jié)

由于PS/2設(shè)備能提供串行同步時鐘,因此,如果pc機發(fā)送數(shù)據(jù),則pc機要先把時鐘線和數(shù)據(jù)線置為請求發(fā)送的狀態(tài)。pc機通過下拉時鐘線大于100μs來抑制通訊,并且通過下拉數(shù)據(jù)線發(fā)出請求發(fā)送數(shù)據(jù)的信號,然后釋放時鐘。當(dāng)PS/2設(shè)備檢測到需要接收的數(shù)據(jù)時,它會產(chǎn)生時鐘信號并記錄下面8個數(shù)據(jù)位和一個停止位。主機此時在時鐘線變?yōu)榈蜁r準(zhǔn)備數(shù)據(jù)到數(shù)據(jù)線,并在時鐘上升沿鎖存數(shù)據(jù)。而PS/2設(shè)備則要配合pc機才能讀到準(zhǔn)確的數(shù)據(jù)。具體連接步驟如下:

(1)等待時鐘線為高電平。

(2)判斷數(shù)據(jù)線是否為低,為高則錯誤退出,否則繼續(xù)執(zhí)行。

(3)讀地址線上的數(shù)據(jù)內(nèi)容,共8個bit,每讀完一個位,都應(yīng)檢測時鐘線是否被pc機拉低,如果被拉低則要中止接收。

(4)讀地址線上的校驗位內(nèi)容,1個bit。

(5)讀停止位。

(6)如果數(shù)據(jù)線上為0(即還是低電平),PS/2設(shè)備繼續(xù)產(chǎn)生時鐘,直到接收到1且產(chǎn)生出錯信號為止(因為停止位是1,如果PS/2設(shè)備沒有讀到停止位,則表明此次傳輸出錯)。

(7 輸出應(yīng)答位。

(8) 檢測奇偶校驗位,如果校驗失敗,則產(chǎn)生錯誤信號以表明此次傳輸出現(xiàn)錯誤。

(9)延時45 μs,以便pc機進(jìn)行下一次傳輸。

讀數(shù)據(jù)線的步驟如下:

(1)延時20μs;

(2)把時鐘線拉低

(3)延時40μs

(4)釋放時鐘線

(5)延時20μs

(6)讀數(shù)據(jù)線。

下面的步驟可用于發(fā)出應(yīng)答位;

(1)延時15μs;

(2)把數(shù)據(jù)線拉低;

(3)延時5μs;

(4)把時鐘線拉低;

(5)延時40μs;

(6)釋放時鐘線;

(7)延時5μs;

(8)釋放數(shù)據(jù)線。


4 用于工控機的雙鍵盤設(shè)計

工控機通常要接標(biāo)準(zhǔn)鍵盤,但是為了方便操作,常常需要外接一個專用鍵盤。此實例介紹了在工控pc機到PS/2總線上再接入一個自制專用鍵盤的應(yīng)用方法。

該設(shè)計應(yīng)能保證兩個鍵盤單獨工作,而且相互不能影響。因此,不能直接把專用鍵盤和標(biāo)準(zhǔn)鍵盤一起接到工控pc的PS/2口。鑒于這種情況,本設(shè)計使用模擬開關(guān)CD4052并通過時分復(fù)用工控pc的PS/2口,來使在同一個時刻只有一個鍵盤有效,從而解決上述問題。其硬件原理圖如圖3所示。其中P2口和P1口用于鍵盤掃描電路(圖中未畫出),p0.0為數(shù)據(jù)端,p0.1為時鐘端,p0.2為模擬開關(guān)選通端。由于專用鍵盤不需要接收工控pc機的命令,所以軟件中并不需要寫這部分相應(yīng)的代碼。

通過軟件可在專用鍵盤復(fù)位后把p0.2清0,以使模擬開關(guān)CD4052打開相應(yīng)的通道。這時工控pc的標(biāo)準(zhǔn)鍵盤將開始工作。標(biāo)準(zhǔn)鍵盤可以完成工控pc剛啟動時對外設(shè)檢測的應(yīng)答。復(fù)位后的專用鍵盤不停地掃描有沒有按鍵,如果有鍵按下則識別按鍵,并且按照預(yù)先的設(shè)計進(jìn)行編碼,同時調(diào)用發(fā)送程序并通過PS/2口發(fā)送到工控pc。此時模擬開關(guān)關(guān)閉相應(yīng)通道(將p0.2置1),專用鍵盤接入工控pc PS/2口的時鐘線和數(shù)據(jù)線而工作,但標(biāo)準(zhǔn)鍵盤被模擬開關(guān)從PS/2的時鐘線和數(shù)據(jù)線中斷而不工作,這樣,雙鍵盤便可時分復(fù)用同一個工控pc機的PS/2 口。相應(yīng)的發(fā)送子程序如下:

#define DATA p00 用p0.0做數(shù)據(jù)線

#define CLK p01 用p0.1做時鐘線

#define INHIbit p02 用p0.2做CD4052的INH端

#define PORTR p1 用P1口做讀入口

#define PORTW p2 用P2口做寫出口 可以實現(xiàn)64個自定義鍵


void send(uCHAR x) /* functiON for send a CHAR data*/
{

uCHAR i,TEMP,CHAR_TEMP;
bit flag_check =1;
INHIBIT =1; //disable STANDARD KEYBOARD
delay_ms(3);
TEMP = x;
for( i=0; i8; i++) //find the NUMBER of 1 in this uCHAR x is odd or not
{
CHAR_TEMP = TEMP 0x01;
if(CHAR_TEMP == 0x01)
{
flag_check =!flag_check;
}
TEMP = TEMP >>1;
}
CLK =1; //send 1 to P1 then read P1
while(!CLK) //if CLK is low wait
{
;
}
CLK =1;
DATA =1; //send 1 to P1 then read P1
if(CLK ==1)
{
delay_us(30);
}

if(CLK==1 DATA==1) //send data
{
DATA =0; //start bit 0
delay_us(10);
CLK =0;
delay_us(5);
TEMP =x;
for(i=0;i8;i++) //send 8 bits LSB first
{
CLK =1;
delay_us(5);
CHAR_TEMP = TEMP 0x01;
if ( CHAR_TEMP == 0x01)
{
DATA =1;
}
ELSE
{
DATA =0;
}
//DATA=(bit)(TEMP0x01);
//LSB
delay_us(10);
CLK = 0;
delay_us(5);
TEMP = TEMP>>1;
}
CLK = 1; //send check bit

delay_us(5);
DATA = flag_check;
delay_us(10);
CLK = 0;
delay_us(5);
CLK =1; //send stop bit
delay_us(5);
DATA =1;
dalay_us(10);
CLK = 0;
delay_us(5);
CLK =1;
delay_us(30);
CLK =1;
DATA =1 ; //send 1 to P1 then read P1
if(CLK ==1 DATA == 0)
{
return ; //pc is sending data to mcu,goto
//receiving function
}
INHIBIT = 0; //enable STANDARD KEYBOARD
}



5 結(jié)論

PS/2 接口協(xié)議是現(xiàn)在大多數(shù)鍵盤、鼠標(biāo)與pc機通訊的標(biāo)準(zhǔn)協(xié)議。其中鼠標(biāo)對pc機的通訊更為簡單,只是傳輸數(shù)據(jù)的內(nèi)容不一樣而已。充分理解PS/2接口協(xié)議,可以幫助設(shè)計者自主開發(fā)一些工控機上的專用鍵盤等外設(shè),并能夠按照用戶的要求開發(fā)出專用的多功能鍵盤。該工控機的雙鍵盤設(shè)計目前已被某工控公司所采納,并已作為組件加入到產(chǎn)品當(dāng)中。



關(guān)鍵詞: PS2接口協(xié)議

評論


技術(shù)專區(qū)

關(guān)閉