痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6706|回復: 2

PS2接口協議解析及應用

[複製鏈接]
發表於 2009-9-19 16:00:54 | 顯示全部樓層 |閱讀模式
ps/2接口標準的發展過程

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

ps/2接口硬件

http://playkof.sg1008.myweb.hinet.net/km/01.JPG


2.1 物理連接器

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

2.2 電氣特性

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的個數總為奇數,因此總進行奇校驗。

2.3 ps/2設備和pc機的通訊

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通訊協議的時序規定的。如果時鐘頻率是其它值,參數的內容應稍作調整。

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

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

ps/2設備主要用於產生同步時鐘信號和讀寫數據。

3.1 ps/2向pc機發送一個字節


從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。

3.2 ps/2設備從pc機接收一個字節

http://playkof.sg1008.myweb.hinet.net/km/02.JPG

由於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)釋放數據線。

http://playkof.sg1008.myweb.hinet.net/km/03.JPG

4 用於工控機的雙鍵盤設計

工控機通常要接標準鍵盤,但是為了方便操作,常常需要外接一個專用鍵盤。此實例介紹了在工控pc機到ps/2總線上再接入一個自製專用鍵盤的應用方法。

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

通過軟件可在專用鍵盤復位後把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) /*   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; 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
}
發表於 2009-9-19 19:00:24 | 顯示全部樓層
感謝分享......好複雜阿
發表於 2009-9-19 20:04:05 | 顯示全部樓層
還可以用單晶片玩鍵盤控制,還附上程式碼。
謝謝playkof大您分享的鍵盤原理資料!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-18 07:16 PM , Processed in 0.047672 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.