PS/2
電腦介面名稱
徠PS/2是在較早電腦上常見的介面之一,用於滑鼠、鍵盤等設備。一般情況下,PS/2介面的滑鼠為綠色,鍵盤為紫色。PS/2 原是“Personal System 2”的意思,“個人系統2”,是IBM公司在上個世紀80年代推出的一種個人電腦。以前完全開放的PC標準讓IBM覺得利益受了損失。所以IBM設計了PS/2這種電腦,目的是重新定義PC標準,不再採用開放標準的方式。在這種電腦上IBM使用了新型MCA匯流排,新的OS/2操作系統。PS/2電腦上使用的鍵盤滑鼠介面就是現在的PS/2介面。因為標準不開放,PS/2電腦在市場中失敗了。只有PS/2介面一直沿用到今天。
PS/2介面是輸入裝置介面,而不是傳輸介面。所以PS2口根本沒有傳輸速率的概念,只有掃描速率。在Windows環境下,ps/2滑鼠的採樣率默認為60次/秒,USB滑鼠的採樣率為120次/秒。較高的採樣率理論上可以提高滑鼠的移動精度。
PS/2介面支持熱插拔(相對於傳統AT鍵盤而言),但插入后需先重新啟動,有別於熱插拔。
PS/2可以與USB介面互轉,即PS/2介面設備可以轉成USB,USB介面設備也可以轉成PS/2。
早期,在Ps/2鍵盤中,包含了一個嵌入式的微控制器(如InDl,8048系列),以用來執行各項的工作並減少整個系統工作中的負擔。微控制器所要作的工作就是監測所有的按鍵,以及當按鍵被按下或放開時,就回報給主機。
PS/2
1.1 物理介面
現行的計算機鍵盤多是通過一個6芯介面插座,即PS/2 介面與
主機相接,各引腳定義分別是:
電源(VCC)、地(GND)、串列時鐘線CLK 和串列數據線DATA,還有2根未用。
鍵盤介面的插座外形圖及各線定義如圖1 所示。
PS/2
2 ---預留N/C ;
3 ---GND;
4 ---Vcc (+5V);
5 ---時鐘線CLK;
6 ---預留N/C ;
表1 時鐘及數據線狀態
CLK | DATA | 匯流排狀態 |
1 | 1 | 空閑 |
1 | 主機申請發送,禁止通信 | |
1 | 禁止通信 |
PS/2
一般,具有五腳連接器的鍵盤稱之為AT鍵盤,而具有六腳mini-DIN連接器的鍵盤則稱之為ps/2鍵盤。其實這兩種連接器都只有四個腳有意義。它們分別是Clock(時鐘腳)、DATA(數據腳)、+5V(電源腳)和Ground(電源地)。在ps/2鍵盤與pc機的物理連接上只要保證這四根線一一對應就可以了。ps/2鍵盤靠pc的ps/2埠提供+5V電源,另外兩個腳Clock(時鐘腳)和DATA(數據腳)都是集電極開路的,所以必須接大阻值的上拉電阻。它們平時保持高電平,有輸出時才被拉到低電平,之後自動上浮到高電平。現在比較常用的連接器如圖1所示。
ps/2 通訊協議是一種雙向同步串列通訊協議。通訊的兩端通過Clock(時鐘腳)同步,並通過DATA(數據腳)交換數據。任何一方如果想抑制另外一方通訊時,只需要把Clock(時鐘腳)拉到低電平。如果是pc機和ps/2鍵盤間的通訊,則pc機必須做主機,也就是說,pc機可以抑制ps/2鍵盤發送數據,而 ps/2鍵盤則不會抑制pc機發送數據。一般兩設備間傳輸數據的最大時鐘頻率是33kHz,大多數ps/2設備工作在10~20kHz。推薦值在 15kHz左右,也就是說,Clock(時鐘腳)高、低電平的持續時間都為40μs。每一數據幀包含11~12個位,具體含義如表1所列。
表1 數據幀格式說明
1個起始位總是邏輯0
8個數據位(LSB)低位在前
1個奇偶校驗位奇校驗
1個停止位總是邏輯1
1個應答位僅用在主機對設備的通訊中
表中,如果數據位中1的個數為偶數,校驗位就為1;如果數據位中1的個數為奇數,校驗位就為0;總之,數據位中1的個數加上校驗位中1的個數總為奇數,因此總進行奇校驗。
ps/2 設備的Clock(時鐘腳)和DATA(數據腳)都是集電極開路的,平時都是高電平。當ps/2設備等待發送數據時,它首先檢查Clock(時鐘腳)以確認其是否為高電平。如果是低電平,則認為是pc機抑制了通訊,此時它必須緩衝需要發送的數據直到重新獲得匯流排的控制權(一般ps/2鍵盤有16個位元組的緩衝區,而ps/2滑鼠只有一個緩衝區僅存儲最後一個要發送的數據)。如果Clock(時鐘腳)為高電平,ps/2設備便開始將數據發送到pc機。一般都是由ps/2設備產生時鐘信號。發送時一般都是按照數據幀格式順序發送。其中數據位在Clock(時鐘腳)為高電平時準備好,在Clock(時鐘腳)的下降沿被pc機讀入。ps/2設備到pc機的通訊時序如圖2所示。
當時鐘頻率為15kHz時,從Clock(時鐘腳)的上升沿到數據位轉變時間至少要5μs。數據變化到Clock(時鐘腳)下降沿的時間至少也有5 μs,但不能大於25 μs,這是由ps/2通訊協議的時序規定的。如果時鐘頻率是其它值,參數的內容應稍作調整。
PS/2
徠ps/2設備主要用於產生同步時鐘信號和讀寫數據。
從ps/2向pc機發送一個位元組可按照下面的步驟進行:
(1)檢測時鐘線電平,如果時鐘線為低,則延時50μs;
(2)檢測判斷時鐘信號是否為高,為高,則向下執行,為低,則轉到(1);
(3)檢測數據線是否為高,如果為高則繼續執行,如果為低,則放棄發送(此時pc機在向ps/2設備發送數據,所以ps/2設備要轉移到接收程序處接收數據);
(4)延時20μs(如果此時正在發送起始位,則應延時40μs);
(5)輸出起始位(0)到數據線上。這裡要注意的是:在送出每一位后都要檢測時鐘線,以確保pc機沒有抑制ps/2設備,如果有則中止發送;
(6)輸出8個數據位到數據線上;
(7)輸出校驗位;
(8)輸出停止位(1);
(9)延時30μs(如果在發送停止位時釋放時鐘信號則應延時50μs);
通過以下步驟可發送單個位:
(1)準備數據位(將需要發送的數據位放到數據線上);
(2)延時20μs;
(3)把時鐘線拉低;
(4)延時40μs;
(5)釋放時鐘線;
(6)延時20μs。
由於ps/2設備能提供串列同步時鐘,因此,如果pc機發送數據,則pc機要先把時鐘線和數據線置為請求發送的狀態。pc機通過下拉時鐘線大於100μs來抑制通訊,並且通過下拉數據線發出請求發送數據的信號,然後釋放時鐘。當ps/2設備檢測到需要接收的數據時,它會產生時鐘信號並記錄下面8個數據位和一個停止位。主機此時在時鐘線變為低時準備數據到數據線,並在時鐘上升沿鎖存數據。而ps/2設備則要配合pc機才能讀到準確的數據。具體連接步驟如下:
(1)等待時鐘線為高電平。
(2)判斷數據線是否為低,為高則錯誤退出,否則繼續執行。
(3)讀地址線上的數據內容,共8個bit,每讀完一個位,都應檢測時鐘線是否被pc機拉低,如果被拉低則要中止接收。
(4)讀地址線上的校驗位內容,1個bit。
(5)讀停止位。
(6)如果數據線上為0(即還是低電平),ps/2設備繼續產生時鐘,直到接收到1且產生出錯信號為止(因為停止位是1,如果ps/2設備沒有讀到停止位,則表明此次傳輸出錯)。
(7 輸出應答位。
(8) 檢測奇偶校驗位,如果校驗失敗,則產生錯誤信號以表明此次傳輸出現錯誤。
(9)延時45 μs,以便pc機進行下一次傳輸。
讀數據線的步驟如下:
(1)延時20μs;
(2)把時鐘線拉低
(3)延時40μs
(4)釋放時鐘線
(5)延時20μs
(6)讀數據線。
下面的步驟可用於發出應答位;
(1)延時15μs;
(2)把數據線拉低;
(3)延時5μs;
(4)把時鐘線拉低;
(5)延時40μs;
(6)釋放時鐘線;
(7)延時5μs;
(8)釋放數據線。
工控機通常要接標準鍵盤,但是為了方便操作,常常需要外接一個專用鍵盤。此實例介紹了在工控pc機到ps/2匯流排上再接入一個自製專用鍵盤的應用方法。
PS/2
通過軟體可在專用鍵盤複位后把p0.2清0,以使模擬開關CD4052打開相應的通道。這時工控pc的標準鍵盤將開始工作。標準鍵盤可以完成工控pc剛啟動時對外設檢測的應答。複位后的專用鍵盤不停地掃描有沒有按鍵,如果有鍵按下則識別按鍵,並且按照預先的設計進行編碼,同時調用發送程序並通過ps/2口發送到工控pc。此時模擬開關關閉相應通道(將p0.2置1),專用鍵盤接入工控pc ps/2口的時鐘線和數據線而工作,但標準鍵盤被模擬開關從ps/2的時鐘線和數據線中斷而不工作,這樣,雙鍵盤便可時分復用同一個工控pc機的ps/2 口。相應的發送子程序如下:
#define DATA p00 用p0.0做數據線
#define CLK p01 用p0.1做時鐘線
#define INHIbit p02 用p0.2做CD4052的INH端
#define PORTR p1 用P1口做讀入口
#define PORTW p2 用P2口做寫出口 可以實現64個自定義鍵
void send(uchar x)
{
uchar i,temp,char_temp;
bit flag_check =1;
INHIBIT =1; //disable standard keyboard
delay_ms(3);
temp = x;
for( i=0; i<8; 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;i<8;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)(temp&0x01);
//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
}
ps/2 介面協議是現在大多數鍵盤、滑鼠與pc機通訊的標準協議。其中滑鼠對pc機的通訊更為簡單,只是傳輸數據的內容不一樣而已。充分理解ps/2介面協議,可以幫助設計者自主開發一些工控機上的專用鍵盤等外設,並能夠按照用戶的要求開發出專用的多功能鍵盤。該工控機的雙鍵盤設計目前已被某工控公司所採納,並已作為組件加入到產品當中。