|
PC标准并行接口-SPP
作者:温正伟 原载:电子报
|
PC机中的并行接口一般以D型25针母接口安装在PC机的后面板上,通常也称打印接口或LPT接口。在IEEE1284标准中定义了多种并行接口模式,常用的有以下三种:
SPP (Standara Parallel Port) 标准并行接口
EPP (Enhanced Parallel Port) 增强并行接口
ECP (Extended Capabilities Port) 扩展功能并行接口
这几种模式因硬件和编程方式的不同,传输速度可以从50K Bits/秒到2MB/秒不等。一般用以从主机传输数据到打印机、绘图仪或其它数字化仪器的接口,是一种叫Centronics的36脚弹簧式接口(通常主机上是25针D型接口,打印机上是36针Centronics接口)。Centronics接口的协议也将在下面进行讨论。
SPP模式是标准并行接口模式,它可以提供50K Bits/秒的典型传输速度,其最高的传输速度可达150K
Bits/秒。可进行9Bits的并行输入(现在的板载并行接口一般支持数据口的双向传输故最大可达17Bits的输入)和12Bits的并行输出。通常可选择Nibble(4bits)或Byte(8bits)的方式进行输入数据,还有一种Bi-directional的双向传输方式,这种方式需硬件支持。SPP硬件是由8条数据线,4条控制线和5条状态线所组成,它们分别对应三个不同的寄存器来进行数据的读写操作。
表一:D型25针和36针Centronics的针脚定义
|
针脚(Centronics)
|
针脚(D-Type25)
|
I/O
|
SPP信号
|
寄存器
|
硬件反转
|
| 1 |
1 |
输入/输出 |
nStrobe选通 |
控制 |
是 |
| 2 |
2 |
输出/* |
Data0数据位0 |
数据 |
|
| 3 |
3 |
输出/* |
Data1数据位1 |
数据 |
|
| 4 |
4 |
输出/* |
Data2数据位2 |
数据 |
|
| 5 |
5 |
输出/* |
Data3数据位3 |
数据 |
|
| 6 |
6 |
输出/* |
Data4数据位4 |
数据 |
|
| 7 |
7 |
输出/* |
Data5数据位5 |
数据 |
|
| 8 |
8 |
输出/* |
Data6数据位6 |
数据 |
|
| 9 |
9 |
输出/* |
Data7数据位7 |
数据 |
|
| 10 |
10 |
输入 |
nAck确认 |
状态 |
|
| 11 |
11 |
输入 |
Busy忙 |
状态 |
是 |
| 12 |
12 |
输入 |
Pager-Out
Pager-End缺纸 |
状态 |
|
| 13 |
13 |
输入 |
Select选择 |
状态 |
|
| 14 |
14 |
输入/输出 |
nAuto-Linefeed
自动换行 |
控制 |
是 |
| 32 |
15 |
输入 |
nError/nFault错误 |
状态 |
|
| 31 |
16 |
输入/输出 |
nInitialize初始化 |
控制 |
|
| 36 |
17 |
输入/输出 |
nSelect-Printer
nSelect-In选择输入 |
控制 |
是 |
| 19-30 |
18-25 |
Gnd |
Ground信号地 |
|
|
注:没有在表中列出的Centronics引脚定义有:15保留(悬空),16逻辑地,17机壳地,18保留(悬空),33地,34保留(悬空),35
+5V。表中“I/O”栏中的“*”表示如果并行接口支持双向传输则该引脚可以输入数据,表中“SPP信号”栏中,信号名称前的“n”表示该信号是低电平有效的。例如“nError”表示如果打印机出错则这个针脚将为低电平,正常为高电平(这里的信号是指定于打印机的,其它的外设可能有不同的定义)。表中的“硬件反转”栏所表示的意思是,输入的信号先被并行接口硬件反相再送到相应的寄存器。例如“Busy”,外部设备输入一个逻辑信号1(TTL+5V逻辑电平),信号被反相送入状态寄存器,这时读状态寄存器Bit7(最后一位)为0,如输入信号为0,Bit7的值则为1。
并行接口输出的是TTL标准的逻辑电平,输入信号也要符合TTL标准。这种特性可以使接口容易应用在电子设计中。大部分的PC并行接口能吸收和输出12mA左右的电流,如应用时小于或大于这个值,应使用缓冲电路。
现在整合在主板上的并行接口通常可以使用3BCh,378h和278h这三个基地址,它们几乎都支持SPP,ECP和EPP模式,你可以在BIOS设置为并行接口选择基地址(地址值为16进制数加“h”表示)。3BCh这个地址在早期的并口打印机适配器上是不支持EPP和ECP模式的。三个不同基地址的地址段如表二:
表二:
|
3BCh - 3BFh
|
在早期的并口适配卡中不支技ECP
|
|
378h - 37Fh
|
|
|
278h - 27Fh
|
|
如果系统有不只一个的并行接口,每个占用一个并行口基地址,那我们如何知道LPT1占用什么基地址,LPT2占用什么基地址?如:当系统只有一个主板整合的并行接口,在BIOS中设为使用278h基地址,自然LPT1占用278h,如果再往主板插入一张使用3BCh基地址的打印机适配卡,这时LPT1占用3BCh,LPT2占用278h。这就是说LPT1,LPT2,LPT3,并没有指定基地址,启动时BIOS程序分别以3BCh,378h,278h去检测使用该基地址的并行接口是否可用,第一个检测通过的为LPT1,依此类推,直到检测完成,结果保存在特定的内存地址中,以供操作系统或软件使用。所用的内存地址和LPT号的关系如表三。每个编号值占用2Bytes,如LPT1为378h,则内存地址0000:0408的值为78,0000:0409的值为03。
表三:
|
内存地址
|
编号
|
|
0000:0408-0000:0409
|
LPT1的基地址
|
|
0000:040A-0000:040B
|
LPT2的基地址
|
|
0000:040C-0000:040D
|
LPT3的基地址
|
注:在旧式的系统还可能有0000:040E-0000:040F(LPT4的基地址),现在新的BIOS更多的用这个内存去保存PS/2或别的设备的设置。
在windows系统中要读取这几个内存地址可能有点困难,特别对于初学者来说。因此我们可以用直接检测端口的方法来检测并行接口基地址分配,其方法是向基地址写一个非FFh的值,再读出该基地址的值,如果读出的是写入的值而不是FFh,表明地址是可用的。这种方法在DOS或Win9x系统是很容易实现的,在WinNT或Win2000下可用第三方写端口控件或自行编写有Ring0特权的程序。下面一段检测基地址的汇编修改一下可以镶入到C,VC++,Delphi,C++Builder中(只能在Win9X或Dos下正常运行)。
mov dx,Address //Address为基地址(如为控制、状态地址时向指定口地址读写数据)
mov al,Data //Data为要向基地输出非FFh的数据
out dx,al //向基地址写数据
in al,dx //读基地址数据
mov Result,al //向主程序返回读出的数据,再用主程序比较Data和Result的值,若相同则该基地址可用
SPP标准并行接口有三个寄存器,分别为数据寄存器,状态寄存器和控制寄存器(通常称为数据端口,状态端口,控制端口)。
数据寄存器:
数据寄存器所占用的地址是并行接口的基地址,连接于接口的2-9针,如果你的并行接口不支持双向传输,则它只能输出数据。
表四:
|
地址
|
I/O
|
数据位
|
引脚
|
SPP信号
|
数据位为1时引脚电平状态
|
| 基地址 |
输出
(如果并口支持双向传输则也可输入数据)
|
Bit0
|
2
|
Data0
|
H (H为高电平,L为低电平)
|
|
Bit1
|
3
|
Data1
|
H
|
|
Bit2
|
4
|
Data2
|
H
|
|
Bit3
|
5
|
Data3
|
H
|
|
Bit4
|
6
|
Data4
|
H
|
|
Bit5
|
7
|
Data5
|
H
|
|
Bit6
|
8
|
Data6
|
H
|
|
Bit7
|
9
|
Data7
|
H
|
状态寄存器:
状态寄存器占用的地址是基地址加一,与接口的10,11,12,13,15针相连,这个寄存器是只读寄存器,其中包含一个IRQ中断寄存器(由Ack相反后形成),当有中断发生这个数据位为“0”。要注意的是Bit7(引脚11)在输入+5VTTL电平时,数据值为”0”,有反转的特性。
表五:
|
地址
|
I/O
|
数据位
|
引脚
|
SPP信号
|
数据位为1时引脚电平状态
|
|
基地址+1
|
输入
|
Bit0
|
/
|
保留
|
/
|
|
|
|
Bit1
|
/
|
保留
|
/
|
|
|
|
Bit2
|
/
|
IRQ (Not)
|
/
|
|
|
|
Bit3
|
15
|
Error
|
H
|
|
|
|
Bit4
|
13
|
Select In
|
H
|
|
|
|
Bit5
|
12
|
Paper Out
|
H
|
|
|
|
Bit6
|
10
|
Ack
|
H
|
|
|
|
Bit7
|
11
|
Busy
|
L
|
控制寄存器
控制寄存器占用的地址是基地址加二,与接口的1,14,16,17针相连,寄存器可读写。其中Bit0,Bit1,Bit3有反转的特性。通常用于打印机控制时,这个端口为只读。这个端口还有高阻特性,在应用时可以根据要求加电阻,以使电平足够高或足够低。Bit4为IRQ应用,当向Bit4写入“1”时,将使ACK(引脚10)信号反相后成为中断请求IRQ信号,通常为IRQ5或IRQ7。
表六:
|
地址
|
I/O
|
数据位
|
引脚
|
SPP信号
|
数据位为1时引脚电平状态
|
|
基地址+2
|
输入/输出
|
Bit0
|
1
|
Strobe
|
L
|
|
|
|
Bit1
|
14
|
Auto Linefeed
|
L
|
|
|
|
Bit2
|
16
|
Initialize Printer (Reset)
|
H
|
|
|
|
Bit3
|
17
|
Select Printer
|
L
|
|
|
|
Bit4
|
/
|
Enable IRQ Via Ack Line
|
/
|
|
|
|
Bit5
|
/
|
Enable bi-directional Port
|
/
|
|
|
|
Bit6
|
/
|
/
|
/
|
|
|
|
Bit7
|
/
|
/
|
/
|
握手信号:
使用标准PC并行接口的打印机会用到Centronics标准的握手信号。时序图见图一。首先数据加到数据寄存器,然后检查Busy(引脚11)是否为高,为高打印机处在以下状态之一:正在输入数据、正在打印操作、打印机出错、处在脱机状态,这时打印机不接收数据,Busy为低时,nStrobe(引脚1)输出一最小宽度大于1us的负脉冲,打印机随后接收数据并使Busy变为高,打印机接收完一个字节后回送给并行接口nAck(引脚10)一个宽度大于5us的响应负脉冲,这个信号可以被并行接口硬件反相之后作为IRQ中断信号或做为查询的状态信号,由于该信号的负脉冲较短,一般不会查询它,而是查询Busy。打印机状态回复,准备接收下一个字节。在应用标准并行接口的外部设备中并不一定就会用到这种握手信号,通常它们都有自己相应的握手信号,在我们自己的制作中也可以制定相应的握手信号。
 |
| 图一:握手信号 |
现在的板载的并行接口都会支持EPP和ECP模式,由于硬件上数据端口是支持双向传输的,所以在SPP模式下也可在数据端口中输入数据。如果你用的是旧式的并行接口功能卡或你不想用数据端口输入数据,而又要用并行接口采集8Bit的数据时,还可以用以下的两种方法。一种是用控制端口和状态端口的输入功能组成8Bit的数据输入,但要注意输入电平和所对应的数据位的相互关系,可以用软件进行调整控制。另一种方式只用到状态端口做输入,因一次只能读取4Bit也就是半个字节,故又称Nibble
Mode。具体电路图请参看图二。电路中用nStrobe控制74HC157(或74LS157)当前是读取前半个字节还是后半个字节,读取后只要把前后半个字节合并就可。
 |
| 图二:8Bit读取 |
|