葉青青



[中圖分類號]R562.25[文獻標識碼]A[文章編號]1007-9416(2009)11-0121-04
1 并行口簡介
并行口是PC機的常用接口。并行口由4根控制線,5根狀態線及8根數據線構成。并行口位于PC機背面,通常為D-25針母座,也有的是D-25針公座。并行口有5種向下兼容的操作模式,分別是:兼容模式(Compatibility Mode)、半模式(Nibble Mode)、BYTE模式(Byte Mode)、EPP模式(EPP Mode)和ECP.模式(ECP Mode)。兼容模式(SPP)、半模式、Byte模式均是軟件握手,速率只有50KByte/s,最多也就是150KByte/s。EPP、ECP模式都是硬件握手,傳輸速率相近,速率最高可達2Mbyt/s。EPP模式5根狀態線中只用了2條,因而在實時雙向通信中能力顯得不足,且ECP模式可以使用FIFO緩沖器來發送/接收數據同時在Windows下還可以使用DMA通道來移動數據,因而ECP模式更適用。
2 ECP說明
(1)ECP協議里有一個叫做Run Length Encoding的簡單壓縮配置,它的最大壓縮比率是64:1,且它對發送重復單一字節的數據采用計數和COPY一個字節的方式工作,計的數確定重復字節的個數。例如,要發送出25個‘A,首先發送24緊隨其后是‘A。外圍設備接收到之后通過計數24及‘A恢復出25個‘A, 這對于像掃描儀、打印機那樣數據比較長的外設來說,是非常好的并行接口。
壓縮的 Byte在數據處理路徑上有別于其它Byte,它作為指令被送到ECP的地址FIFO端口(ECP Address FIFO),發送到Address FIFO寄存器的字節可能是兩種東西,一是壓縮數據長度的計數,二是字符的ASCI碼。壓縮Byte的MSB為1,那么其它7個BIT(BIT0—BIT6)代表的就是字符的ASCI碼;如果壓縮Byte的BIT7為0,那么在其它BIT位傳輸的就是一個壓縮數據長度的計數。
(2) ECP硬件特性
普通計算機只有一個并行接口,ECP、SPP、EPP只是并行接口的幾種工作模式,它們之間的差異就在于引腳
功能分配的不同,軟件運行的方式不同。SPP是軟件握手,EPP、ECP是硬件握手,但ECP和EPP硬件握手的方式還不同。ECP向后兼容SPP、EPP,當它工作在SPP模式時,并行端口上的每個數據線的用途與工作在SPP模式下并行口上的數據線的用途完全相同。當它工作在EPP模式時,并行端口上的每個數據線的用途與工作在EPP模式下并行口上的數據線的用途完全相同。當計算機工作在ECP模式下時,25腳并行接口各引腳功能定義如下表:
(4)ECP軟件寄存器
表格2列出了ECP寄存器的內容。前三個寄存器和SPP寄存器幾乎完全相同,只是控制端口寄存器的Bit5位特殊,在ECP模式里它控制并行口的收發方向,進而影響ECR寄存器的FIFO Full及FIFO Empty Bit位。
當并行口工作在SPP模式時,基地址通常被稱為數據端口或數據寄存器,它使用簡單,用于把數據放到并行口的數據線上(PINS2—9)。在標準SPP模式下,這個寄存器通常只負責把數據寫到并口上,如果你想讀這個寄存器,只能讀到上一次發出的數據。然而如果你的并口是雙向的(Byte Mode),就可以在這個地址上接收數據。當并行口工作在ECP模式時,基地址+0用作地址FIFO(見表1、表2)。
基地址+1 稱為狀態端口或狀態寄存器,不可寫。狀態端口的高5位直接反映并行口的5條狀態線(引腳10,11,12,13,15)的狀態,Bit2是顯示IRQ的狀態位,Bit1、Bit0是保留位。請注意BIT7位(BUSY)低電平有效,例如,如果寄存器的第7位是‘0,那就意味著并行口的第11腳加入的是+5V,同樣如果BIT2(NIRQ)是‘1那一定沒有中斷發生,詳見表格3。
控制端口(基地址+2)又稱為控制寄存器。在具體使用它時,讀是沒有意義的,一般用作只寫,詳見表格4。
基地址+402h :
基地址+402h是ECP的擴展控制寄存器(ECR),ECR設定在那一種模式ECP端口就將工作在那一種模式。
ECR的高三位字節用于選擇操作模式,共有7種模式,但并不是所有主機的并口硬件都支持這些模式,EPP就是其中一例。
Standard Mode :選擇這種模式,將使ECP端口工作于SPP標準模式,但不包含雙向功能。
Byte Mode / PS/2 Mode :ECP端口工作于SPP的雙向模式。
Parallel Port FIFO Mode :此種模式任何數據都可寫入DATA FIFO,端口使用SPP握手把FIFO中的DATA送給外圍設備,而握手過程是由硬件產生的。這對于非ECP的外設如打印機是非常有用的,你可以有一些ECP的特性如FIFO緩沖器、硬件握手,它是用已有的SPP握手而非ECP握手。
ECP FIFO Mode :ECP使用的標準模式。這種模式使用的是已經講述過的ECP握手。
EPP Mode/Reserved :對于有些計算機,這種模式就是使ECP端口工作于EPP模式;而在有些計算機里這種模式仍作為保留模式。
Reserved :保留模式。
Configuration Mode :在這個模式里共有兩個配置寄存器可以用(CNFGA及CNFGB),它們都有指定的地址。
FIFO test mode:用于測試FIFO緩沖器的性能也用于確定這些功能的正確性。當端口處于這種模式時,任何寫進TEST FIFO(BASE+400H)的字節都被放進FIFO緩沖器里,任何從TESTFIFO寄存器里讀出的字節都是取自FIFO緩沖器。你可以使用ECR的FIFO Full及FIFO Empty的Bit位來確定FIFO緩沖器的性能,通常FIFO緩沖器有16個字節的深度。
ECR的其它BIT位在ECP操作端口中也起到非常重要的作用,ECP中斷BIT(BIT4)位使能中斷,DMA Enable Bit (Bit 3)使能直接內存的存取的。如果ECP?Service Bit (Bit 2)被置高說明一個中斷請求已開始。不同計算機并行口使用的芯片往往不同,而不同芯片的ECP Service Bit位的復位方法可能是不同的,有些芯片需要你置0該Bit位,而有些芯片只需對ECR讀一次就可實現對ECP Service Bit位的復位。
FIFO Full (Bit 1) and FIFO Empty (Bit 0)顯示FIFO緩沖器的狀態。由于這兩個Bit位是在并行口數據傳輸方向已確定的條件下取得的,所以這里無需考慮Control Register的Bit5位。如果BIT0(FIFO Empty)置為1,那么FIFO緩沖器為空;如果BIT1置為1,那么FIFO緩沖器為滿;如果這兩個BIT位都不為1的話,說明有數據在FIFO里但它不滿,這兩個BIT位可用在FIFO Test Mode,用以測定FIFO緩沖器的容量。
基地址 + 400h為ECP的配置寄存器A,有關ECP端口的一些內容都可以在配置寄存器A里得到。MSB確定中斷方式:邊沿或電平觸發,這主要依賴于你使用的并行卡。BIT4—6位列出了卡上的總線寬度,一些卡只有8位數據寬度,而有些卡卻有32或16位的數據寬度。為了使你的并行卡發揮最大的效能,可以先利用軟件讀出這些BIT位的狀態,以此決定輸出端口的最大字的數據寬度(見表5)。
配置寄存器的低三位,用于主機的恢復。為了從一個錯誤中恢復,軟件必須知道有多少個字節已送出,而獲取已送出字節的方法是查看暫存于FIFO的字節數。
有些外設的輸入端口可能有以Byte為單位的移位寄存器,需要并行口FIFO滿之后才將數據發送給外設,Bit2就是確定并口是否FIFO滿之后再傳輸的Bit位。還有,并行口只有8位寬度,而你需要傳輸字長16位或32位的指令,如果是這種情況,并行端口的字仍然能夠送出。字長可能是1Byte、2Byte或4Byte,而在發生錯誤時整個字的一些Byte可能還未送出,此時配置寄存器的Bite0和Bite1位就指明了剩余在FIFO里的Byte數量,繼而可以將剩余的Byte全部送出。
基地址+401h為配置寄存器B (cnfgB),是可讀/寫寄存器。一些并行口可以利用軟件配置CnfgB從而設置IRQ和DMA資源。而有些端口則需設置BIO或在并行卡上跳線來設置IRQ和DMA,因此此時ConfgB為只讀。
配置寄存器的Bit 7設為1時,選擇使用RLE壓縮輸出數據,在發送之前主機將壓縮數據,復位之后壓縮數據將被發送到外圍設備,BIT6將反饋IRQJ腳的狀態。有些設備不僅僅把IRQ用做反映并行口的狀態,還用于診斷沖突(見表6)。
BIT5到BIT3提供了端口IRQ分配的狀態,同樣BIT2到BIT0提供了DMA通道狀態。我們可以讀/寫前面提及的BIT位,但對于跳線的并行卡,只能讀它的狀態。
3 并行口ECP模式與外設通信實例
計算機實現對AT89C51單片機的控制,單片機上傳一組數據給計算機處理。單片機與計算機的所有對接端口需加10K上拉電阻(見圖1、圖2、圖3)。
計算機C語言:
#define ECPAddr 0x0378
#define ECPState 0x0379
#define ECPContr0x037A
#define DataFIFO0x0778
#define ConfigRegB 0x0779
#define ECR0x077A
#include
/******************************** 下傳3452 *********************************/
outp (ECR, 0x60);
outp (ECPContr, 0x04);//進入1284傳輸模式
outp(DataFIFO,3); outp(DataFIFO,4);outp(DataFIFO,5);outp(DataFIFO,2);m= inp(ECR)&0x01;
while(m==0x00)//如果數據未完全移出循環等待
{
m= inp(ECR)&0x01;Outtime++;
if( Outtime>1024)
{
state = 0x10;//“通信失敗”顯示
break;
}
}
Outtime=0;
outp (ECPContr, 0x3c);//退出1284傳輸模式
/********************************** End*********************************/
/*************************** 接收100個數據*****************************/
outp (ECR, 0x60);
outp (ECPContr, 0x21);//0x21
for(i=0;i<=99;i++)
{
m= inp(ECR)&0x01;
while(m==0x01)//如果數據為空循環等待
{
m= inp(ECR)&0x01;
Outtime++;
if( Outtime>1024)
{
i=100;//退出本次100個讀數
break;
}
}
y[i]=inp (DataFIFO)/10.0-3.5;
}//數據完全讀入后,nreverse Request并未置高
outp (ECPContr, 0x0c);//退出1284傳輸模式并口17腳此時為低電平
/*********************************End ********************************/
上述程序片段是本人利用LabWindows軟件制作的,經過實際測試,這里為限制篇幅而略去了一些變量的定義、控制。
單片機C語言:
sbit HostCLK=P2^0;sbit PeriphReq = P2^2;sbit PeriphCLK=P2^5;sbit HostACK=P2^1;
sbit PeriphACK=P2^6;sbit nReverReq=P2^3; sbit nACKRever = P2^7;sbit ACT1284=P2^4;
while(ACT1284&&nReverReq;==0)//主機未下傳指令之前等待
{ }
PeriphACK=1;//外設應答置高停止接收數據
PeriphACK=0;//外設應答置低準備接收數據計算機只有查詢到此信號為低電平才將數據移入總線。
for(j=0;j<=3;j++)
{
while(HostCLK)
{}
PeriphACK = 1;
while(HostCLK==0)
{}
DATA[j]=P0;//HostCLK上升沿將數據移入單片機
PeriphACK = 0;//外設應答置低結束一個讀周期
}
While (nReverReq)//主機沒有上傳數據請求循環等待
{ }
if((DATA[0]==3)&&(DATA[1]==4)&&(DATA[2]==5)&&(DATA[3]==2))
{
nACKRever=0;//響應主機上傳數據的請求
PeriphACK=1;//通知主機送出的是數據防止主機誤操作移出數據
for(j=0;j<=99;j++)
{
P0=j;
PeriphCLKC=0;//通知主機總線上的數據是有效數據
while(HostACK==0)//主機未響應有效數數據前循環等待
{ }
PeriphCLKC=1;//正沿將數據移入主機
while(HostACK)//主機未響應已讀入數據之前循環等待
{ }
}
}
上述程序段因篇幅所限略去了一些變量的定義、賦值。
計算機的并行口ECP模式傳輸速率最高可達2Mbyt/s,可實現實時通信。它成本低,在短距離數據傳輸及控制中是非常理想的通信方式。在辦公、工業控制中得到廣泛的應用。
[參考文獻]
[1] http://www.beyondlogic.org/spp/parallel.pdf
[2] Http://www.deyondlogic.org/ecp/ecp.htm
[3] LabWindows/CVI8 Help