Port Bi-direktional

Funktion


Ein Port Bi-Modul umfasst bis zu 18 bidirektionale Pins, die als Eingang mit Interruptmöglichkeit bei steigender oder fallender Flanke oder als Ausgang konfiguriert werden können. Die Pins eines Moduls können einzeln programmiert werden, indem das jeweils korrespondierende Bit des entsprechenden Steuerregisters verändert wird.

Register



OffsetRegisterFunktionZugriff
0PIN_BI_DATDatenread/write
1PIN_BI_IEInterrupt Freigabe für jedes Bit (1= Freigabe)read/write
2PIN_BI_OEOutput Freigabe für jedes Bit (1= Freigabe)read/write
3PIN_BI_DIRRichtung (1= Input)read/write
4PIN_BI_EDGSELAuswahl der aktiven Flanke für jedes Bit (1= positive Flanke)read/write
5PIN_BI_IR_STATUSInterrupt Status für jedes Bitread


Das Datenregister PIN_BI_DAT enthält immer die Daten der Pins des Port Bi-Moduls, unabhängig davon ob die BITs als Input oder Output initialisiert sind. Beim Schreiben wird immer das OUTPUT Register gesetzt. Bei einem Reset werden alle Bits des OUTPUT Registers mit Null initialisiert. Auf PIN_BI_DAT kann lesend und schreibend zugegriffen werden.

Im Steuerregister PIN_BI_DIR kann die Funktion der Pins des Port Bi-Moduls als Ausgang oder Eingang programmiert werden. Bei einem Reset werden alle Bits mit Null (= Ausgang) initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.

Im Steuerregister PIN_BI_IE können für die einzelnen Pins des Port Bi-Moduls Interrupts aktiviert werden. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.

Im Steuerregister PIN_BI_EDGSEL kann für die Pins des Port Bi-Moduls ausgewählt werden, ob sie auf steigende oder fallende Flanken einen Interrupt generieren sollen. Bei einem Reset werden alle Bits mit Null (= fallende Flanke) initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.

Im Steuerregister PIN_BI_OE können für die einzelnen Pins des Port Bi-Moduls die Ausgänge aktiviert werden. Bei einem Reset werden alle Bits mit Null initialisiert (Ausgang gesperrt). Auf das Register kann lesend und schreibend zugegriffen werden.

Im Statusregister PIN_BI_IR_STATUS wird für die einzelnen Pins des Port Bi-Moduls der Zustand des Interruptsignals angezeigt. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden. Die gesetzten Bits des Registers lösen nur dann Interrupt aus, wenn auch das Bit an der gleichen Position im PIN_BI_IE Register gesetzt ist.

port_bi.h

#ifndef __PORT_BI_H
#define __PORT_BI_H

#define PORT_IOBIT_0    (1<<0)
#define PORT_IOBIT_1    (1<<1)
#define PORT_IOBIT_2    (1<<2)
#define PORT_IOBIT_3    (1<<3)
#define PORT_IOBIT_4    (1<<4)
#define PORT_IOBIT_5    (1<<5)
#define PORT_IOBIT_6    (1<<6)
#define PORT_IOBIT_7    (1<<7)
#define PORT_IOBIT_8    (1<<8)
#define PORT_IOBIT_9    (1<<9)
#define PORT_IOBIT_10   (1<<10)
#define PORT_IOBIT_11   (1<<11)
#define PORT_IOBIT_12   (1<<12)
#define PORT_IOBIT_13   (1<<13)
#define PORT_IOBIT_14   (1<<14)
#define PORT_IOBIT_15   (1<<15)
#define PORT_IOBIT_16   (1<<16)
#define PORT_IOBIT_17   (1<<17)

typedef struct port_bi {
    volatile unsigned int data;     // (r/w) (reset-interrupt)
    volatile unsigned int ie;       // (r/w) (reset-interrupt)
    volatile unsigned int oe;       // (r/w)
    volatile unsigned int dir;      // (r/w) (reset-interrupt) 1 = Input
    volatile unsigned int edgsel;   // (r/w) (reset-interrupt) 1 = positiv
    volatile unsigned int ir_stat;  // (r)
} port_bi_regs_t;

#endif


Konfiguration und Instanziierung


Bei der Instanziierung eines IO-Moduls gibt es drei Parameter, die man einstellen muss: BASE_ADR , PORT_WIDTH und OD_OUTPUT. BASE_ADR gibt den Offset der Adresse des Moduls zur Basisadresse der Peripherieregister an. Der Wert besteht aus den oberen sieben Bit der zehn Bit-Adresse eines Moduls (die unteren drei Bit werden nur modulintern benutzt). PORT_WIDTH bezeichnet die Breite des jeweiligen Ports, sie kann von 1 Bit bis 18 Bit eingestellt werden. OD_OUTPUT verändert den Treiber der Ausgangssignale. Ist der Haken gesetzt, dann kann der Ausgang die Leitung nur auf LOW Pegel ziehen. Es muss ein Pullup Widerstand an dem Signal vorgesehen werden, um einen HIGH Pegel zu erhalten. Ist der Haken nicht gesetzt, dann erzeugt der Ausgang einen HIGH und einen LOW Pegel und ist nur hochohmig, wenn der Ausgang nicht freigegeben ist.


Die Interruptleitungen des Moduls müssen an die gewünschten Eingänge des Interruptkontrollers angeschlossen werden und die IO-Pins an die Ein-/Ausgänge des Top Level Moduls. Diese müssen dann noch den Pins des FPGA zugeordnet werden (z.B. durch jConfig in der .ucf-Datei des ISE-Projekts).




SpartanMC