La porta parallela EPP

La porta parallela del PC supporta diverse modalità operative, in genere tutte quelle previste dallo standard IEEE 1284. Tra le varie opzioni la più semplice da utilizzare per realizzazione interfacce da parte degli hobbisti è sicuramente la SPP - Standard Parallel Port - ma la EPP - Enhanced Parallel Port - è quella che permette maggiore flessibilità e velocità.

Lo standard EPP 1.7 fu originariamente definito da un consorzio costituito da Intel, Xircom e Zenith ed in seguito recepito, con qualche variazione, della norma IEEE 1284 come EPP 1.9.

Diverse sono le caratteristiche interessanti della EPP:

In genere tutte le porte parallele recenti sono EPP-compatibili anche se occorre impostare correttamente questa modalità di funzionamento agendo sui parametri del BIOS o posizionando un ponticello. Se la porta permette la configurazione come EPP 1.7 oppure EPP 1.9, si consiglia la seconda opzione.

Nel prosieguo si riterrà sufficientemente noto il funzionamento generale della porta parallela Centronics; tali informazioni possono essere acquisite leggendo, per esempio, il "Tutorial sulla porta SPP" disponibile all'indirizzo https://www.vincenzov.net/tutorial/spp/spp.htm. In particolare si presumono note le conoscenze necessarie per configurare le porte LPT, per individuare gli indirizzi effettivamente utilizzati e per scrivere un programma di modifica dei registri, operazioni tutte identiche alla SPP. È consigliabile anche avere nozione dei rischi che il PC corre nel caso di errori di montaggio dei circuiti elettronici e sulle possibili strategie per evitarli.

I segnali

La porta EPP utilizza gli stessi connettori e segnali della porta Centronics; ne ridefinisce però i nomi e la funzione, secondo la seguente tabella.

Pin Nome SPP Nome EPP Direzione Funzione EPP
1 Strobe nWRITE Out Questo segnale basso indica una scrittura
2 Data 0 PD 0 Bidirezionale Trasporta dati e indirizzi
3 Data 1 PD 1 Bidirezionale Trasporta dati e indirizzi
4 Data 2 PD 2 Bidirezionale Trasporta dati e indirizzi
5 Data 3 PD 3 Bidirezionale Trasporta dati e indirizzi
6 Data 4 PD 4 Bidirezionale Trasporta dati e indirizzi
7 Data 5 PD 5 Bidirezionale Trasporta dati e indirizzi
8 Data 6 PD 6 Bidirezionale Trasporta dati e indirizzi
9 Data 7 PD 7 Bidirezionale Trasporta dati e indirizzi
10 Ack Interrupt In Se abilitato, genera un interrupt sul fronte di salita
11 Busy nWAIT In Usato per la sincronizzazione.
12 Paper Out - In Non usato
13 Select - In Non usato
14 Linefeed nDSTRB Out Quando basso indica un trasferimento di dati
15 Error . In Non usato
16 Inizialize Reset Out Attivo basso, resetta le periferiche
17 Select in nASTRB Out Quando basso indica un trasferimento di indirizzi
18-25 Massa Massa    

La numerazione dei pin è relativa al connettore femmina DB25 presente sul retro del PC. Per alcuni pin della modalità EPP è indicato il nome premettendo la lettera "n" minuscola (per esempio nASTRB) per indicare che è attivo basso; a volte lo stesso pin è indicato senza tale prefisso oppure con un segmento al disopra (qualunque sia la convenzione usata non vi sono però modifiche ai livelli logici ed i diagrammi temporali indicati sono quelle "fisicamente" presenti).

Come si nota tre pin di ingresso non sono usati nello standard EPP e quindi possono essere gestiti direttamente dal programma, attraverso le stesse tecniche della porta SPP. Tutti gli altri segnali sono gestiti direttamente dall'HW della porta parallela anche se rimangono comunque disponibili per il controllo via SW secondo le modalità SPP. Ad esclusione dei tre segnali di ingresso non utilizzati non è però consigliabile un utilizzo contemporaneo della modalità EPP e SPP.

I registri EPP

La gestione della EPP avviene attraverso otto registri consecutivi, ciascuno formato da otto bit, presentati nella tabella seguente. Con Base di intende l'indirizzo di base della porta parallela, in genere 0x378 oppure 0x278. Si noti che la porta EPP non può avere indirizzo 0x3BC, corrispondente nella nomenclatura DOS a LPT3.

Indirizzo Nome R/W
Base + 0 SPP data port W
Base + 1 SPP status port R
Base + 2 SPP control port W
Base + 3 EPP Address port R/W
Base + 4 EPP data port R/W
Base + 5 EPP dataport - 16 bit R/W
Base + 6 EPP dataport - 32 bit R/W
Base + 7 EPP dataport - 32 bit R/W

Le modalità a 16 e 32 bit non sono supportate da tutte le parallele EPP: in questo caso i registri corrispondenti non sono definiti.

Come riportato nella tabella i primi tre registri sono sostanzialmente identici sia come nome che come funzione ai registri della SPP e non verranno quindi qui descritti. Questo permette di usare una porta EPP in tutte le applicazioni in cui è richiesta una porta SPP, senza alcuna modifica all'HW o al SW. L'unico problema si può eventualmente presentare qualora si vogliano sfruttare alcune caratteristiche elettriche della SPP, quale la presenza di pin a collettore aperto.

La scrittura di un dato

Come già anticipato nella precedente tabella gli otto pin PD0... 7 permettono il trasporto bidirezionale sia di indirizzi che di dati, ovviamente in tempi diversi.

La sincronizzazione del trasferimento è realizzata attraverso una coppia di segnali che devono essere attivati alternativamente da trasmettitore e ricevitore, secondo uno schema detto "intelocking handshakes". Ciò permette di adeguare la velocità al dispositivo più lento tra quelli collegati.

Il registro Base+4 (Data port) permette di scrivere (o di leggere) un dato sui pin della LPT, semplicemente facendo una singola operazione di scrittura (o lettura).

Di seguito si riporta il diagramma temporale semplificato con l'andamento dei segnali nel caso di scrittura di un dato (cioè un byte è generato dal PC e ricevuto dalla periferica). In verde sono indicati i segnali pilotati dal PC, in rosso quelli pilotati dalla periferica:

  1. Il ciclo inizia con la scrittura da parte del processore di un byte nel registro Base+4 (ciclo generato dall'esecuzione di un a singola operazione di I/O e quindi legato alle variazioni dei segnali interni al PC IOCHRDY, WR e D0..D7, non indicati nel diagramma temporale in quanto non disponibili sul connettore EPP)
  2. nWRITE diventa basso, per indicare un'operazione di scrittura. Questa fase inizia nella EPP 1.9 solo se nWAIT è tenuto basso dalla periferica (come indicato nel diagramma); altrimenti la sequenza si sospende e riprende sul fronte di discesa di nWAIT
  3. Sono posti sui pin PD0…PD7 i dati scritti nel registro
  4. nDSTRB diventa basso per indicare un trasferimento di dati. Queste tre ultime operazioni sono, se nWAIT è basso, praticamente contemporanee, come rappresentato nel diagramma temporale
  5. Il PC attende che nWAIT, generato dalla periferica, diventi alto. Tale evento deve avvenire entro qualche microsecondo. In questo momento termina l'esecuzione dell'operazione di scrittura da parte del processore che può riprendere l'esecuzione del programma temporaneamente sospeso.
  6. E' disattiva nDSTRB
  7. nWRITE diventa alto (cioè inattivo)
  8. I dati presenti su PD0... PD7 non sono più validi. Non è specificato cosa succede: da una serie di informazioni sembra che, a seconda del chip utilizzato, non si hanno cambiamenti oppure viene generato il byte precedentemente scritto in Base+0 oppure ancora i pin sono posti in alta impedenza. Il consiglio è quello di non fare nessun affidamento sullo stato assunto dopo la disattivazione di nWRITE.

epp1 - Diagramma temporale di scrittura

Alcune osservazioni:

La scrittura di un indirizzo

Il ciclo per la scrittura di un indirizzo è sostanzialmente identico alla scrittura di un dato. Le differenze sono solo due:

Le altre operazioni, incluse le temporizzazioni ed i timeout, rimangono invariate.

Occorre notare che il termine "indirizzo" oppure "dato" è puramente convenzionale e nulla impedisce di utilizzarli come dato1 e dato2, se nella specifica applicazione hanno questa funzione.

La lettura di un dato o di un indirizzo

La porta EPP gestisce in modo automatico anche il transito di dati ed indirizzi da periferica a PC.

  1. Il ciclo inizia con la lettura da parte del processore del registro Base+4 (oppure base+3 nel caso di lettura di un indirizzo). I segnali interni coinvolti sono, al solito, D0... D7, RD e IOCHRDY e non indicati nello schema semplificato
  2. nDSTRB (oppure nASTRB nel caso di lettura di un indirizzo) diventa basso. Notare che nWRITE rimane alto, cioè inattivo. Anche in questo caso il ciclo inizia nel caso della EPP 1.9 solo se nWAIT è mantenuto basso dalla periferica
  3. La periferica deve mandare sul bus PD0…PD7 i dati (o gli indirizzi). In realtà la periferica può impostare PD0…PD7 in un momento qualunque antecedente questo istante
  4. La periferica deve alzare il pin nWAIT.
  5. Il PC acquisisce il dato da PD0…PD7 in corrispondenza del fronte di salita di nDSTRB (oppure nASTRB).
  6. Il PC pone alto nDSTRB (o nASTRB) e il ciclo termina. I buffer della porta EPP rimangono nello stato di alta impedenza (anche se non tutte le fonti affermano esplicitamente ciò)
  7. La periferica deve porre nWAIT basso prima dell'inizio del ciclo successivo

epp2. - Diagramma temporale di lettura

È necessario che, in corrispondenza la disattivazione di nDSTRB (oppure di nASTRB) siano mantenuti stabili i pin PD0...7 al fine di rispettare i tempi di set-up e di hold della porta: per sicurezza è opportuno che la periferica mantenga i dati stabili per qualche centinaio di ns nell'intorno del fronte di nDSTRB .

Un esempio reale

Nella figura seguente sono riportate le temporizzazioni dettagliate della porta EPP PC87307VUL prodotta da National Semiconductor e ampiamente usato in molti PC. Tale grafico è utilizzabile per la progettazione anche se occorre notare che non si tratta dello standard ufficiale ma solo di un'implementazione relativa ad uno specifico chip.

Accanto ai segnali riportati anche nei precedenti diagrammi semplificati sono presenti anche alcuni segnali interni al PC (WR, RD, D0... 7, IOCHRDY, ZWS), utili per comprendere nel dettaglio il funzionamento del chip ma non necessari per la progettazione di periferiche esterne.

Nel diagramma temporale è rappresentata un'operazione di scrittura seguita da una di lettura. Dallo stato del segnale nWAIT all'inizio del ciclo si vede che la rappresentazione grafica è relativa alla EPP 1.7, come del resto chiarito dalla nota 1.

epp3 - Temporizzioni EPP

Simbolo Parametro Condizioni Min Max Unità
tWW Tempo tra i fronti di WR (interno) e di nWRITE (1)     45 ns
tWST Tempo tra i fronti di WR (interno) e di nDSTRB (o nASTRB) (2) EPP 1.7   45 ns
EPP 1.9 (1)   65 ns
tWEST Tempo tra l'attivazione di nWRITE e di nDSTRB (o nASTRB) EPP 1.7 0   ns
EPP 1.9 10   ns
tWPDh Tempo di hold di PD0...PD7 dopo che nDSTRB (o nASTRB) diviene inattivo   50   ns
tHRW Tempo tra l'attivazione di nWAIT e IOCHRDY (3) EPP 1.7   40  
tWPDS PD0...PD7 validi dopo che nWRITE diviene attivo     15 ns
tEPDW Tempo di validità di PD0...PD7   80   ns
tEPDh Validità di PD0...PD7 dopo nDSTRB o nASTRB   0   ns

(1) I tempi tWW e tWST sono, nel caso della EPP 1.9, relativi al fronte di WR solo se nWAIT è basso. Altrimenti sono misurati rispetto all'istante in cui nWAIT diviene basso.

(2) E' garantito che nWRITE non passi da basso ad alto prima di nDSTRB (o nASTRB)

(3) Nel caso di EPP 1.9, tempo tra l'attivazione di nRD o nWR e IOCHRDY

Il time-out

Il tempo impiegato dalla porta EPP per completare un ciclo di scrittura o di lettura dipende sostanzialmente dal tempo che la periferica impiega per gestire il pin nWRITE. E' infatti secondario il tipo di chip utilizzato, il tipo di processore e, anche se in misura minore, il tipo di bus con cui la porta EPP è collegata al processore. 

Il pin nWRITE interviene direttamente sul segnale IOCHRDY interno al computer che ha lo scopo si sospendere l'esecuzione dell'istruzione di I/O fino al suo completamento, inserendo un certo numero di cicli di ritardo. Si noti che tale sospensione avviene all'interno di un'operazione elementare e questo blocca completamente l'hardware del processore, rendendo impossibile la prosecuzione del programma o l'intervento del sistema operativo, qualunque esso sia. Questo meccanismo porterebbe quindi ad un blocco irreversibile dell'intero computer se, per esempio, nessuna periferica fosse collegata alla porta EPP...

La soluzione è costituita da una sorta di watchdog (cane da guardia) che rileva la situazione appena descritta ed interrompe la sospensione del processore intervenendo direttamente sull'hardware sbloccando il segnale IOCHRDY dopo alcuni microsecondi di inattività. Questo errore è segnalato attraverso l'uso del bit 0 del registro di stato (indirizzo Base+1): se tale bit vale 0 non vi sono stati errori, se vale 1 il ciclo non si è potuto completare a causa di un timeout.

E' opportuno verificare regolarmente questo bit se si utilizza la modalità EPP. Si noti che in caso di errore il SW deve esplicitamente azzerare questo bit altrimenti anche tutte le operazioni successive genereranno a loro volta un timeout.

La lettura/scrittura di dati a 16 e 32 bit

Alcune parallele EPP supportano il trasferimento di dati a 16 e 32 bit. Per fare ciò è sufficiente scrivere (o leggere) una word (16 bit) o una double word (32 bit) nel registro base+4; la porta provvederà a convertire quest'unica scrittura (o lettura) in due o quattro cicli EPP. Il vantaggio è costituito dal fatto che il processore esegue più velocemente la scrittura o la lettura, eseguendo una sola operazione di I/O invece di due o quattro.

Non tutte le porte parallele EPP supportano tale metodo e ciò limita la portabilità tra macchine diverse di questa tecnica.

Per gli indirizzi è previsto solo il trasferimento di 8 bit.

La preparazione della porta

Prima di utilizzare la porta in modalità EPP è opportuno eseguire due operazioni:

Per questi motivi è opportuno porre sul registro di controllo il byte 00000100b attraverso l'istruzione:

outportb (control_reg, 0x04);

Questa operazione è necessaria una sola volta, all'inizio del programma: nelle successive operazioni di I/O il controllo di questi segnali è gestito unicamente dall'HW. La successiva gestione via SW potrebbe addirittura creare problemi e pertanto vivamente sconsigliata.

Prima dell'utilizzo è ovviamente necessario impostare la porta (attraverso il settaggio dei parametri del BIOS o un apposito jumper) come EPP 1.7, 1.9 oppure EPP/SPP.

History

1.0 Settembre 1999 Prima versione del tutorial
2.0 Luglio 2001 Prima versione GNU FDL del tutorial. Modifiche nei diagrammi temporali (ringrazio Giulio di Pescara)
2.1 Gennaio 2003 Descrizione EPP 1.7

Le versioni con variazioni limitate alla sola correzione di errori di battitura e simili sono identificate dall'aggiunta di una lettera e non sono riportate.


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima