La liaison série des PC

      Le principe

      Le but de la liaison série est de pouvoir communiquer entre deux entités (PC ou autres) avec le moins de fils possibles. Tous les bits et octets de données qui doivent circuler le font les uns après les autres. Dans ce cas, il ne faut plus qu'un seul fil.

      Autrement, il fallait un fil pour chaque bit, c'est ce qui se passe dans la liaison parallèle. Les 8 bits circulent en même temps.

      Avec la liaison série, il y a un gain de fil particulièrement appréciable si les distances à cabler sont grandes.

      La liaison parallèle La liaison série
      La liaison parallèle
      La liaison série

 

      Comment passe l'information ?

      Les bits d'un octet passent les uns après les autres. Les octets aussi. Afin que le récepteur fasse la distinction entre deux octets, l'échange est standardisé avec des marqueurs de début et de fin de transmission entre chaque octet.

      Le terme "octet" (8 bits) est à mettre en guillemets parce qu'avec la liaison série, les données échangées peuvent tenir sur 5, 6 ,7 ou 8 octets. Mais tant pis, je continuerai à dire "octet".

      La transmission d'un octet commence par un bit START (actif à l'état bas). Suivent ensuite les bits de l'octet. Ces bits peuvent être suivis d'un bit de controle qui est en général un bit de parité (paire ou impaire). Le tout se termine par 1, 1.5 ou 2 bit de STOP.

      Exemple : transmission de la lettre 'A' ( = 0x41 en hexa ou 01000001 en binaire )
           Transmission de l'octet 01000001

      La ligne est au repos à l'état haut. La parité est ici '?' parce qu'elle peut être paire ou impaire. Notez que l'on commence ici par le bit 0 pour finir par le bit 7. Dans d'autres protocoles série, il est possible de commencer par la fin. C'est le cas pour les cartes à puces par exemple. Il existe des cartes à convention directe et d'autres à convention indirecte.

      Et ainsi de suite pour tous les autres octets ..

 

      Le câblage

      Voici quelques schémas que j'avais récupéré sur un site. Ils se passent de commentaires si ce n'est que : DTE = Data Terminal Equipment (ordinateur) et DCE = Data Communication Equipment (modem, infrarouge, etc...).



 

      L ' UART 8250

      La liaison série est assurée sur les PC par l'UART 8250. Pour simplifier, c'est une puce qui se charge de transmettre ou de recevoir les données du port série.


      © Emmanuel Viennet

      De plus, voici un tableau répertoriant les différents registres de l'UART 8250 :

      Adresse
      Registre
      DLAB
      A2
      A1
      A0
      0
      0
      0
      0
      RBR : Receive Buffer (registre de réception)
      0
      0
      0
      0
      THR : Transmit Holding Register (registre de transmission)
      1
      0
      0
      0
      DLL : Divisor Latch LSB (poids faible diviseur horloge)
      1
      0
      0
      1
      DLM : Divisor Latch MSB (poids fort diviseur horloge)
      0
      0
      0
      1
      IER : Interrupt Enable Register
      ?
      0
      1
      0
      IIR : Interrupt Identification Register
      ?
      0
      1
      1
      LCR : Line Control Register
      ?
      1
      0
      0
      MCR : Modem Control Register
      ?
      1
      0
      1
      LSR : Line Status Register
      ?
      1
      1
      0
      MSR : Modem Status Register
      ?
      1
      1
      1
      ---

      Sur une carte-mère, l'UART a une adresse : souvent 3F8h pour le COM1. A cette adresse, vous ajoutez A2A1A0b et vous avez l'adresse du registre correspondant. Par exemple, pour accéder à LCR, l'adresse est 3F8h + 011b = 3FBh et pour écrire la valeur 0 dans ce registre :

      ; en ASM
      mov al,0
      mov dx,3FBh
      out dx,al
      /* en C */
      outportb(0,0x3FB);

      Astuces : RBR et THR ont la même adresse mais selon que l'on lit ou on écrit, on accède à RBR (lecture) ou THR (écriture). DLAB est une astuce pour accéder à 10 registres sur 3 bits. DLAB est en fait le bit 7 du registre LCR.

      DLM & DLL : diviseur d'horloge
       

      L'UART 8250 est cadendé par une horloge de 1.8432 MHz. Le 8250 divise cette fréquence par 16 de manière interne. On peut ensuite diviser cette seconde fréquence par un diviseur codé sur 16 bits et contenu dans DLM-DLL.

      bauds rate
      diviseur
      300
      0180h
      4800
      0018h
      9600
      000Ch
      115200
      0000h

      Ce sont les valeurs les plus courantes mais libre à vous de mettre diviseur plus folklorique si il est adapté. Par exemple, pour logger les communications entre un Nokia et une carte SIM, il peut être nécessaire de fixer la vitesse de transmission à 8800 bds avec le diviseur 000Dh.


      IER : entrées/sorties avec interruption
       
    • b0 : interruption lorsque une donnée est reçue dans RBR (RBR plein).
    • b1 : interruption lorsque la donnée de THR est émise (THR vide).
    • b2 : interruption lorsque 1 des 4 bits de poids faible de LSR passe à 1.
    • b3 : interruption sur l'état du modem.

      Si on ne veut pas gérer les interruptions, IER = 0


    • <
      IIR : Son contenu permet d'dentifier la source de l'interruption.

      LCR : contrôle de la ligne
       
    • b1-b0 : spédifient le nombre de bits de la donnée à émettre. 5+(b1b0)b bits.
    • b2 : précise le nombre de bit de STOP. b2=0 : 1STOP / b2=1 : 2STOP
    • b3 : spécifie la présence (si 1) ou l'absence (si 0) du bit de contrôle (parité).
    • b4 : précise si la parité est paire (si 1) ou impaire (si 0).
    • b5 b6 : normalement à 0
    • b7 : DLAB (cf astuces plus haut)

    • MCR : contrôle du modem
       
    • b0 : commande le niveau de DTR qui informe le modem que le PC est prêt à communiquer.
    • b1 : commande le niveau de RTS qui demande au modem d'émettre.

    • LSR : état de la ligne
       
    • b0 : passe à 1 si on vient de recevoir une donnée
    • b1 : b1=1 si erreur d'écrasement (la valeur de RBR n'a pas été lue et est écrasée par une nouvelle donnée).
    • b2 : erreur de parité.
    • b3 : erreur de format (valeur du bit de STOP invalide).
    • b4 : problème de l'émetteur.
    • b5 : contenu de THR transféré vers le registre à décalage (prête à être envoyée). On peut mettre une nouvelle valeur dans THR.
    • b6 : donnée envoyée (registre à décalage vide).

      b1, b2, b3 et b4 sont remis à 0 quand on lit LSR.


    • MSR : état de fonctionnement du modem.