    Die seriellen Schnittstellen (ASCI und CSI/O) des HD64180

    Gerald Schröder

    Der HD64180 stellt drei serielle Schnittstellen zur Verfügung. Bei zweien
    handelt es sich um "Asynchronous Serial Connection Interfaces" (wie
    RS-232/V24) und die dritte heißt "C1ocked Serial Input/Output".

    Aschronous Serial Communication Interfces

    Aufgabe dieser beiden Scbnittstellen ist die serielle Verbindung zu einem
    Modem, Termial, (RS-232-)Drucker o.Ä. Zusätzlich gibt es einen "Multipro-
    zessor-Modus", mit dem sich leicht ein System mit mehreren HD64180s auf-
    bauen ließe, wobei die ASCIs dann als (Verbindung zum) System-Bus dienen
    würden.

    Jeder Kanal belegt 5 Ports: einen zum Lesen und einen zum Scbreiben der
    Daten, einen für den Status (Zustand) des Kanals, zwei für die Einstellung
    des Kanals (Baudrate usw.) und einige Zusatz-Informationen. Die Kanäle
    unterscheiden sich in einigen Features, was ich aber jeweils anmerken
    werde.

    Die einzelnen Ports (Kanal 0 und Kanal 1):

    Name	Port  Bezeichnung
    CNTLA0	0     Control Register A Channel 0
    CNTLB0	2     Control Register B Channel 0
    STAT0	4     Status Register Channel 0
    TDR0	6     Transmit Data Register Channel 0
    RDR0	8     Receive Data Register Channel 0
    CRTLA1	1     Control Register A Channel 1
    CRTLB1	3     Control Register B Channel 1
    STAT1	5     Status Register Channel 1
    TDR1	7     Transmit Data Register Channel 1
    RDR1	9     Receive Data Register Channel 1

    Die einzelnen Bits der Ports:

    CNTLA  (Control A)

    7    6    5    4                3            2      1      0
    MPE  RE   TE   Kanal 0: RTS=*   Read: MPBR   MOD2   MOD1   MOD0
                   Kanal 1: CKA1D   Write: EFR

    MPE   = Multiprocessor Mode Enable
    RE    = Receiver Enable
    TE    = Transmitter Enable
    RTSO* = Request To Send Channel 0 (aktiv Low, nur Kanal 0!)
    CKA1D = Asynchronous Clock Channel 1 Disable (nur Kanal 1!)
    MPBR  = Multiprocessor Bit Receive (nur beim Lesen!)
    EFR   = Error Flag Reset (rur beim Schreiben!)
    MODx  = ASCII Data Format Mode

    Anmerkung: Bit 4 (D4) hat bei Kanal 0 eine andere Bedeutung als bei Kanal
    1. Bit 3 (D3) bedeutet beim Schreiben etwas anderes als beim Lesen.

    CNTLB  (Control B)
    7     6    5          4    3    2    1    0
    MPBT  MP   Read: CTS* PEO  DR   SS2  SS1  SS0
               Write: PS

    MPBT  = Multiprocessor Bit Transmit
    MP    = Multiprocessor Mode
    CTS   = Clear To Send (nur beim Lesen!)
    PS    = Prescale (nur beim Scbreiben!)
    PEO   = Parity Evea/Odd
    DR    = Divide Ratio
    SSx   = Source/Speed Select

    STAT (Status)
    7     6     5   4   3    2               1
    RDRF  OVRN  PE  FE  RIE  Kanal 0: DCD0*  TDRE  TIE
                             Kanal 1: CTS1E

    RDRF  = Receive Data Register Full (nur lesbar)
    OVRN  = Overrun Error (nur lesbar)
    PE    = Parity Error (nur lesbar)
    FE    = Framing Error (nur lesbar)
    RIE   = Receive Interrupt Enable
    DCD0* = Data Carrier Detect (aktiv Low, nur lesbar, nur Kanal 0!)
    CTS1E = Clear To Send Channel 1 Enable (nur Kanal 1!)
    TDRE  = Transmit Data Register Empty (nur lesbar)
    TIE   = Transmit Interrupt Enable

    Einstellung der Kanäle

    Über CNTLB wird die Baudrate, der Multiprozessor-Mode und die Parität
    festgelegt. D0 bis D3 und D5 sind für die Baudrate zuständig. Sie legen
    fest, durch welche Werte die Taktfrequenz geteilt wird.

    D5  1.Teiler  D3  2.Teiler  D2 D1 D0  3.Teiler
    0   10        0   16        0  0  0    1
    1   20        1   64        0  0  1    2
                                0  1  0    4
                                0  1  1    8
                                1  0  0   16
                                1  0  1   32
                                1  1  0   64
                                1  1  1   externer Takt

    Der externe Takt wird von den Pins CKA0 (gemultiplext mit DREQ0*) bzw.
    CKA1 (gemultiplext mit TENDt) abgenommen, wobei sich die Baudrate aus dem
    externen Takt geteilt durcb 16 oder 64 (abhängig von D3) eribt. Dies ist
    der Reset-Zustand. Falls die Baudrate vom System-Takt abgeleitet wird, wird
    der resultierende Takt über CKA0/1 ausgegeben!

    Zwei Rechenbeispiele (bei einem Systemtakt von 9,216 MHz):
    19200 Baud: 19200 = 9.316.000 DIV 30 DIV 16 DIV  1 => D5-D0 = 1x0000
      300 Baud:   300 = 9.216.000 DIV 30 DIV 64 DIV 16 => D5-D0 = 1x1100

    D4 ist für die Art der Parität zuständig, falls Paritäts-Prüfung gewünscht
    wird: D4=0: gerade Parität (EVEN);  D4=1: ungerade Parität (ODD).

    Zu guter Letzt D6 und D7, die für den Multiprozessor-Modus zuständig sind:
    Wenn D6=1, dann wird statt des Paritäts-Bits ein Multiprozessor-Bit gesen-
    det/empfangen. Wenn D7=1, wird beim Seden das Multiprozessor-Bit auf 1
    gesetzt. Das könnte z.B. bedeuten; "Achtung, an alle anderen Prozessoren,
    es kommt was für alle!"

    Weitere Einstellungen erfolen über CNTLA. Mit D2 bis D0 wird das Daten-
    format festgelegt:

    Bit    bedeutet
    D2=0   7-Bit-Daten
      =1   8-Bit-Daten
    D1=0   keine Parität
      =1   Paritt
    D0=0   1 Stopit
      =1   2 Stop-Bits

    Wenn D3 mit 0 beschrieben wird, werden alle Fehlermeldungen für diesen
    Kanal (im Register STAT0/1) gelöscht. Mit D4 kann bei Kanal 0 der Pin RTS0*
    gesetzt/gelöscht werden (Request to Send = Gegenseite darf senden). Bei
    Kanal 1 hingegen erfolgt hier die Auswahl, ob der Pin CKA1/TEND0* als Takt-
    eingang (CKA1, D4=0) oder als Kennung für das Ende eines Blocktransfers
    (TEND0,  D4=1) benutzt wird.

    Mit D5 wird der Sender ein/ausgeschaltet, mit D6 der Empfänger. D7 hat nur
    i Multiprozessor-Modus  eine Funktion. Wenn n D7=1, werden nur Daten  mit
    gesetztem MPB-Bit (s. D7 in CNTLB) angenommen, z.B. im Modus: "Empfange
    nur Daten für alle Prozessoren!". Bei D7=0 werden alle Daten angenomme. So
    ist folgende Kommunikation denkbar: Der Master-Prozessor sendet an alle
    Prozessare durch gesetztes MPB-Bit gekennzeichnet, welche beiden Przes-
    soren sich unterhalten dürfen. Diese schalten dann D7 auf 0 und wickeln
    ihre Kommunikation ohne MPB-Bit ab. Dann schalten  sie D7 auf 1 und der
    Master-Prozessor wird benachrichtigt, die Sache wieder zu übernehen.

    Zu guter Letzt noch die Einstellungen, die über das Status-Register STAT
    vorgenommen werden. D0 legt fest, ob ein Interrupt erfolgt, wenn der Kanal
    sedebereit ist. Wenn D3=1, wird auch ein Interrupt ausgelöst, wenn ein
    Zeichen emfangen wurde oder ein Fehler auftrat. Bei Kanal 1 kann über D2
    ausgewählt werden, ob der Pin CTS1*/RXS als CTS* (D2=1, Clear TO Send =
    HD64180 darf senden oder als Daten-Epfangs-Pin für CSI/0  (D2=0) dient.

    Senden/Empfangen

    Der Stats des Kanals kann über STAT befragt werden. D1=1 bedetet, daß
    Daten gesedet werden dürfen. Wenn dann ein Byte in das Sende-Register
    TDR geschrieben wird, geht D1 auf 0, bis das Zeichen gesendet wurde.

    D7=1 bedeutet, daß ein Zeichen empfangen wurde und jetzt aus dem Empfangs-
    Register RDR gelesen werden kann oder daß bei Empfangen ein Fehler auf-
    getreten ist. Nach dem Lesen des Bytes aus RDR wird D7 gelöscht. Folgende
    Fehler werden erkannt:
    D6  Overrun  (letztes Byte wurde nicht schnell genug aus RDR geholt)
    D5  Parity   (das Paritäts-Bit des Zeichens warfalsch)
    D4  Framing  (das/die Stop-Bits stimmten nicht)

    Falls ein Febler auftrat, muß dieser gelöscht werden, indem D3 von CNTLLA
    mit 0 beschrieben wird. Achtung: dabei werden dann auch die anderen Ein-
    stellungen von CNTLA  geändert!

    Über D2 aus STAT kann bei Kanal 0 noch der Zustand des Signals "Data
    Carrier Detect" abgefragt werden. D2 wird auf 1 gesetzt, wenn das Signal am
    Pin DCD0* irgendwann mal HIGH war oder noch ist. D2 wird nach dem Lesen auf
    0 gesetzt, wenn inzwischen DCD0*=0 ist. Solange D2=1, wird nichts empfan-
    gen. Diese Verbindung ist nur bei bestimmten Modems sinnvoll.

    Über D3 aus CTNLA kann das Multiprozessor-Bit des letzten empfangenen
    Bytes abgefragt werden. D5 aus CNTLA gibt Ausunft über den Zustand des
    Pins CTS*. Für Kanal 0 gilt, daß der Kanal erst sendebereit wird STA0,
    D1=1), wenn der Pin CTS0*=0. CTS1 kann nur abgefragt werden und hat nur
    einen Einfluß auf die Sedebereitschaft, wenn D2 aus STAT1 auf 1 gesetzt wurde (CTS1E = CTS-Enable Kanal 1).

    Clocked Serial Input Output

    Diese Schnittstelle dient zur Verbindung mehrerer Prozessoren, wobei die
    anderen Prozessoren nicht unbedigt HD6480s sein mssen. Aber sie müssen
    über eine gemeinsame (sychronisierte) Taktauelle verfügen und die Sende-/
    Empfangs-Operation muß in beiden Prozessoren gleichzeitig beginnen!

    Der HD64180 kann nicht gleichzeitig empfangen und seden. Es gibt nur ein
    Sede/Empfangregister: TRDR (Transmit/Receive Data Register), Port 0Bh.
    Es sind auch nur einige Einstellungen möglich, so daß nur ein Kontroll-
    Regiser nötig ist: CNTR (Control), Port 0Ah. Der Aufbau dieses Registers:

    CNTR  (Control)

    7    6    5    4    3    2    1    1
    --------------------------------------
    EF   EIE  RE   TE   -    SS2  SS1  SS0

    EF  = End Flag  (nur lesbar)
    EIE = End Interrupt Enable
    RE  = Receive Eable
    TE  = Transit Enable
    SSx = Speed Select

    Einstellungen

    Es kann nur die Baudrate eingestellt werden. Wenn die Baudrate neu gesetzt
    wird, sollte nicht gleicheitig ein Sende-/Empfaggs-Zyklus (s.u. gestartet
    werden. Der  System-Takt wird durch die folenden Werte geteilt (bier für
    9.216 MHz):

    SS2 SS1 SS0 Teiler  ergibt Baudrate
    -----------------------------------
    0   0   0     20      460800
    0   0   1     40      230400
    0   1   0     80      115200
    0   1   1    160       57600
    1   0   0    320       28800
    1   0   1    640       14400
    1   1   0   1280        7200
    1   1   1   externer Takt  (kleiner als 460800)

    Bei 111 wird der extere Takt über den Pin CKS eingelesen; asonsten
    wid der resultierende Takt hier ausgegeben.

    Empfangen/Senden

    Zuerst muß abgefragt werden, ob der Sender gerade aktiv ist. Erst wenn D7
    aus CNTR gesetzt ist, kann die Operation beginnen. Zum Senden wird  das
    Byte in TRDR geschrieben und dann D4 in CNTR gesetzt. Gleichzeitig wird
    die Bauarate (wieder) gesetzt. Sie sollte aber nicht verändert werden, da
    es sonst Sende-Probleme geben kann. Die Operation ist erst beendet, wenn D7
    wieder auf 1 geht. Falls D6 gesetzt wurde, wird dann ein Interrupt ausge-
    löst.

    Beim Empfangen wird D5 gesetzt (zusammen mit der Baudrate). Nun beginnt
    der Empfangs-Vorgang, der immer gleich lang dauert. Wenn D7 wieder auf 1
    geht, kann das Byte aus TRDR gelesen werden. Wenn vor dem  Empfangen  D6
    gesetzt wurde, wird ein Interrupt ausgelöst, sobald D7 auf 1 springt. Es
    ist zu beachten, daß der Empfangs-Pin (RXS) mit CTS* für Kanal 1 gemulti-
    plext ist. Vor dem Empfang muß also über D2 von STAT1 die Funktion "Pin
    RXS/CTS1* als RXS* ausgewählt werden.