增強(qiáng)型并行端口EPP編程 - 全文
1、引言
標(biāo)準(zhǔn)并行端口SPP(Standard Parallet Port)為大家所熟知,但是基于SPP的擴(kuò)展經(jīng)常受到一些限制,如傳輸前進(jìn)行“忙信號(hào)”的查詢和傳輸后狀態(tài)的握手,導(dǎo)致傳輸速率降低;再則數(shù)據(jù)線是單向的,由狀態(tài)線完成的數(shù)據(jù)輸入需要進(jìn)行字節(jié)的拼接,因此又降低了數(shù)據(jù)的傳輸速率。
增強(qiáng)型并行端口協(xié)議從根本上改變了這一狀況,它不但與SPP兼容,又能進(jìn)行雙向的高速數(shù)據(jù)傳輸。它的握手信號(hào)由硬件完成,數(shù)據(jù)傳輸速率最高可達(dá)到ISA總線的速度。
2、SPP簡(jiǎn)介
2.1、EPP讀寫(xiě)周期及信號(hào)定義
增強(qiáng)型并行端口協(xié)議最初是由Intel、Xircom和Zenith Data System公司發(fā)起并制定的,它后以后的IEEE1284標(biāo)準(zhǔn)都極大的改善了并行端口的性能。EPP協(xié)議提供了數(shù)據(jù)寫(xiě)、數(shù)據(jù)讀、地址寫(xiě)、地址讀四種數(shù)據(jù)傳輸周期。
數(shù)據(jù)周期用于主機(jī)和外設(shè)間的數(shù)據(jù)傳輸,地址周期用于傳送地址、通道、命令和控制信息。表1列出EPP與SPP信號(hào)的定義及相互關(guān)系。
表1、EPP信號(hào)描述
SPP信號(hào)EPP信號(hào)方向EPP信號(hào)描述
nSTROBEnWRITE輸出低有效,表示寫(xiě)操作。高電平讀周期
nAUTOFEEDnDATASTB輸出低有效,表示數(shù)據(jù)的讀寫(xiě)操作正在進(jìn)行
nSELECTINnADDRSTB輸出低有效,表示地址的讀寫(xiě)操作正在進(jìn)行
nINITnRESET輸出低有效,外設(shè)復(fù)位
nIACKnINTR輸入外設(shè)中斷,用于對(duì)主機(jī)產(chǎn)生一個(gè)中斷
BUSYnWAIT輸入握手信號(hào) ,低表示可以開(kāi)始一個(gè)周期(置選通),高表示可以結(jié)束一個(gè)周期(清選通)
D[8:1]AD[8:1]雙向雙向地址/數(shù)據(jù)線
PE用戶定義輸入每種外設(shè)有不同的使用
SELECT用戶定義輸入每種外設(shè)有不同的使用
nERROR用戶定義輸入每種外設(shè)有不同的使用
?
附圖是EPP數(shù)據(jù)寫(xiě)周期的時(shí)序圖。因它的握手信號(hào)由硬件完成,整個(gè)數(shù)據(jù)傳輸過(guò)程發(fā)生在一個(gè)ISA I/O周期內(nèi),因而使用EPP傳送數(shù)據(jù),協(xié)調(diào)可以獲得500KB/S~2MB/S的傳輸率。
2.2、EPP端口及寄存器
EPP占用并行口基地址+0~+7共8個(gè)相鄰的I/O映像地址。基地址+3是EPP的地址口,對(duì)它進(jìn)行I/O操作便產(chǎn)生地址周期;基地址+4是EPP的數(shù)據(jù)口,對(duì)它進(jìn)行8位I/O讀寫(xiě)操作,便產(chǎn)生數(shù)據(jù)讀寫(xiě)周期。如軟件使用16位或32位的I/O操作,則會(huì)用到基地址+4~+7映像地址。對(duì)基地址+0~+2的操作與SPP相同,這就保證了與SPP的兼容性。但由于EPP為雙向端口,其寄存器的內(nèi)容比SPP有所增加(如表2所示)。
口地址端口名BIT0BIT1BIT2BIT3BIT4BIT5BIT6BIT7
基地址+0數(shù)據(jù)口D0D1D2D3D4D5D6D7
基地址+1狀態(tài)口TIEMOUT00nERRSLCTPEnACKnBUSY
基地址+2控制口STROBEAUTOFDnINITSLCIRQEPCD00
基地址+3EPP地址口D0D1D2D3D4D5D6D7
基地址+4EPP數(shù)據(jù)口0D0D1D2D3D4D5D6D7
基地址+5EPP數(shù)據(jù)口1D0D1D2D3D4D5D6D7
基地址+6EPP數(shù)據(jù)口2D0D1D2D3D4D5D6D7
基地址+7EPP數(shù)據(jù)口3D0D1D2D3D4D5D6D7
新增的位如下:
(1)TIMEOUT位:邏輯“1”表示EPP讀寫(xiě)操作時(shí)發(fā)生超時(shí)錯(cuò)誤;邏輯“0”表示無(wú)超時(shí)發(fā)生。
(2)PCD位(Parallel Control Direction并行口方向控制):在雙向傳輸種,PCD位為“0”時(shí)進(jìn)行寫(xiě)操作;為“1”時(shí)進(jìn)行讀操作,8位數(shù)據(jù)線處于讀狀態(tài)。
2.3、EPP1.9和EPP1.7
EPP1.7是指Xircom 1.7版的提案,Intel在最初的82360 I/O控制器中使用這一協(xié)議,而那時(shí)IEEE1284標(biāo)準(zhǔn)還沒(méi)建立起來(lái)。EPP1.7與IEEE1284標(biāo)準(zhǔn)所規(guī)定的EPP1.9的區(qū)別在于,EPP1.7在讀寫(xiě)周期開(kāi)始時(shí),nDATASTROBE或nADDRSTROBE置位時(shí)不考慮nWAIT信號(hào)的狀態(tài)。這意味著外設(shè)不能通過(guò)清nWAIT來(lái)推遲一個(gè)EPP周期的開(kāi)始。因而服從1284標(biāo)準(zhǔn)的外設(shè)可以在EPP1.7的主機(jī)上工作,而EPP1.7的外設(shè)不能在服從1284 標(biāo)準(zhǔn)的主機(jī)上工作。
EPP控制芯片中的看門(mén)狗時(shí)鐘會(huì)防止系統(tǒng)鎖死。一般來(lái)講,EPP1.9在讀寫(xiě)周期開(kāi)始10us后,如果nWAIT仍沒(méi)有響應(yīng),則發(fā)生TIMEOUT錯(cuò)誤,狀態(tài)寄存器的第0位TIMEOUT為“1”,EPP周期終止;而EPP1.7則是在EPP讀寫(xiě)周期開(kāi)始10us后仍未結(jié)束時(shí),置TIMEOUT為“1”。
3、EPP編程方法
3.1、EPP模式的設(shè)置與基地址的選擇
由于EPP控制芯片的生產(chǎn)廠家不同,具體的編程方式也有所不同,因而EPP協(xié)議對(duì)該模式的設(shè)置和檢測(cè)沒(méi)有統(tǒng)一的規(guī)定。比較實(shí)用的設(shè)置方式是在系統(tǒng)的CMOS中選擇含有EPP模式的選項(xiàng),再選擇EPP協(xié)議的類型EPP1.7或EPP1.9,由系統(tǒng)完成對(duì)EPP芯片的設(shè)置。
并行端口的地址也可在CMOS中設(shè)置,如果操作系統(tǒng)為Windows 9x,可以在其中“控制面板”的“系統(tǒng)”窗口中設(shè)置。值得注意的是,基地址一般使用378H或278H,而不使用3BCH。因?yàn)镋PP要求8個(gè)相鄰的I/O端口,而3C0H可能為VGA設(shè)備所占用。
3.2、傳輸方向控制
并行端口的8位數(shù)據(jù)線在EPP模式下為雙向數(shù)據(jù)線,數(shù)據(jù)傳輸方向由控制寄存器(基地址+2)的第5位控制。該位置“1” 時(shí),禁止數(shù)據(jù)輸出,可以從外部數(shù)據(jù)線上讀取信號(hào)。改位置“0”時(shí),可以執(zhí)行EPP的寫(xiě)操作,如地址寫(xiě)或數(shù)據(jù)寫(xiě)操作。
3.3、數(shù)據(jù)、地址的讀寫(xiě)操作
EPP模式設(shè)置后,數(shù)據(jù)傳輸非常簡(jiǎn)單,只需簡(jiǎn)單的端口讀寫(xiě)即可實(shí)現(xiàn),其C語(yǔ)言指令如下:
寫(xiě)一個(gè)字節(jié)的數(shù)據(jù):outportb(base_addr+4,data)
寫(xiě)一個(gè)字節(jié)的地址:outportb(base_addr+3,value)
讀一個(gè)字節(jié)的數(shù)據(jù):data=inportb(base_addr+4)
讀一個(gè)字節(jié)的地址:value=inportb(base_addr+3)
3.4、狀態(tài)檢查及TIMEOUT位清除
每一次讀寫(xiě)后,應(yīng)檢查狀態(tài)寄存器是否發(fā)生錯(cuò)誤(如超時(shí)錯(cuò)誤TIMEOUT)。如果TIMEOUT位被置位,下一次EPP數(shù)據(jù)和地址口的讀寫(xiě)操作都將無(wú)效,因而每次EPP操作后對(duì)該位的檢測(cè)時(shí)必要的。TIMEOUT位為狀態(tài)寄存器(基地址+1)的第0位,對(duì)該位TIMEOUT標(biāo)志的清除,不同的控制芯片使用不同的方法,這對(duì)編程不利。有的向該位寫(xiě)“1”,可以清除TIMEOUT標(biāo)志,寫(xiě)“0”對(duì)該位無(wú)影響;有的對(duì)狀態(tài)寄存器進(jìn)行讀操作,就可以清除該位;還有的是寫(xiě)“0”清除該標(biāo)志。所以通用的方法是讀狀態(tài)寄存器后,TIMEOUT位如果置位,先向該位寫(xiě)“1”,再寫(xiě)“0”。這樣,無(wú)論哪種芯片都可以保證對(duì)該位的清除。
3.5、16位、32位數(shù)據(jù)的讀寫(xiě)操作
EPP的8位數(shù)據(jù)口共有4個(gè):基地址+4~+7,在其中任意一個(gè)端口上進(jìn)行8位I/O寫(xiě)指令(如匯編語(yǔ)言的out,或C語(yǔ)言中的outportb函數(shù)),都會(huì)發(fā)生EPP的數(shù)據(jù)周期,與外設(shè)傳遞數(shù)據(jù)。這4個(gè)數(shù)據(jù)口的另一種用法是,使用16/32位輸出指令,2個(gè)或4個(gè)字節(jié)就會(huì)自動(dòng)的按順序傳送給外設(shè)。例如使用匯編指令outsd向第一個(gè)EPP數(shù)據(jù)口寫(xiě)一個(gè)雙字,雖然只用了一條I/O指令,但外設(shè)收到了這雙字的4個(gè)字節(jié)。值得注意的是,外設(shè)不是一次收到32位的數(shù)據(jù),而是分4次收到,在EPP模式下,數(shù)據(jù)寬度仍是8位。另外,地址口只能使用8位I/O指令,不能一次傳遞 16位或32位地址。
3.6、Windows 3.x/Windows 9x環(huán)境下的編程
Windows 3.x/Windows 9x環(huán)境下對(duì)硬件操作的最好方法是使用虛擬設(shè)備驅(qū)動(dòng)程序VxD(virtual device driver),它可以使用DDK或C開(kāi)發(fā),對(duì)端口的操作可以得到系統(tǒng)級(jí)的保護(hù),并能得到快速的中斷響應(yīng)。另一種和硬件打交道的方法是使用OCX或ActiveX控件,在32位的Visual Basic中就能實(shí)現(xiàn)。但是這些方法需要較多的編程經(jīng)驗(yàn),所采用的編程語(yǔ)言也受到很大限制,一般的軟件人員不易實(shí)現(xiàn)。使用 Windows API也可以實(shí)現(xiàn)硬件操作,例如通過(guò)API調(diào)用可以實(shí)現(xiàn)對(duì)串口和打印機(jī)的操作。但是Windows API沒(méi)有一般性的端口操作函數(shù),不適用于 EPP的編程。
實(shí)用而有效的方法是對(duì)EPP進(jìn)行直接I/O操作,并將相關(guān)函數(shù)生成動(dòng)態(tài)連接庫(kù)DLL,供應(yīng)用程序調(diào)用。在并口不被其他程序使用的情況下,對(duì)EPP執(zhí)行直接I/O讀寫(xiě)是沒(méi)有問(wèn)題的。由于Windows編程語(yǔ)言都支持對(duì)DLL的調(diào)用,因而程序員可以使用他所熟悉的語(yǔ)言(包括不支持直接I/O的VB)編寫(xiě)應(yīng)用程序,實(shí)現(xiàn)EPP的操作。
下面給出在32位的Delphi中,通過(guò)內(nèi)嵌匯編代碼實(shí)現(xiàn)的EPP端口讀寫(xiě)的input32.dll源程序。
library input32;
uses sysutils;
//向端口寫(xiě)一個(gè)字節(jié)
procedure function out32(portaddress, value: smallint);stdcall;export;
var
bytevalue: byte;
begin
bytevalue := byte(value);
asm
push dx
mov dx,portaddress //寫(xiě)bytevalue到portaddress
mov al,bytevalue
out x,al
pop dx
end; end;
//從端口讀一個(gè)字節(jié),br> function in32(portaddress: smallint):smallint;stdcall;export;
var
bytevalue: byte;
begin
asm
push dx
mov dx,portaddress //從portaddress讀bytevalue
in al,dx
mov bytevalue,al
pop dx
end;
in32 := smallint(bytevalue) and $00ff;
end;
exports
in32,out32;
begin
end.
- 第 1 頁(yè):增強(qiáng)型并行端口EPP編程
- 第 2 頁(yè):狀態(tài)檢查及TIMEOUT位清除
本文導(dǎo)航
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
相關(guān)閱讀:
- [電子說(shuō)] PLC編程軟件離開(kāi)了硬件,能模擬應(yīng)用嗎? 2023-10-24
- [電子說(shuō)] DFRobot志愿者走進(jìn)寧夏中衛(wèi)支教活動(dòng)帶來(lái)趣味編程體驗(yàn) 2023-10-24
- [電子說(shuō)] STM32速成筆記(1)概述 2023-10-23
- [編程語(yǔ)言及工具] Rust語(yǔ)言為什么這么卷? 2023-10-23
- [工業(yè)控制] PLC初學(xué)者怎么選擇西門(mén)子還是三菱? 2023-10-23
- [工業(yè)控制] 西門(mén)子、三菱PLC編程指令大全收藏 2023-10-23
- [電子說(shuō)] 為什么不能直接使用從PLC讀取到的模擬量信號(hào)? 2023-10-23
- [嵌入式技術(shù)] C編程中指針的語(yǔ)法和工作原理 2023-10-21
( 發(fā)表人:小蘭 )