Tema 08 - Comunicaciones Seriales
Tema 08 - Comunicaciones Seriales
Tema 08 - Comunicaciones Seriales
Comunicaciones seriales
La línea que transmite los datos en serie está inicialmente en estado alto. Al
comenzar la transferencia, se envía un bit a 0 ó bit de inicio. Tras él irán los 8 bits de
datos a transmitir (en ocasiones son 7, 6 ó 5): estos bits están espaciados con un
intervalo temporal fijo y preciso, ligado a la velocidad de transmisión que se esté
empleando. Tras ellos podría venir o no un bit de paridad generado automáticamente
174 Microprocesadores de 16 bits y tecnología PC
por la UART. Al final, aparecerá un bit (a veces un bit y medio ó dos bits) a 1, que
son los bits de parada o bits de stop. Lo de medio bit significa que la señal
correspondiente en el tiempo a un bit dura la mitad; realmente, en comunicaciones se
utiliza el término baudio para hacer referencia a las velocidades, y normalmente un
baudio equivale a un bit. La presencia de bits de inicio y parada permite sincronizar la
estación emisora con la receptora, haciendo que los relojes de ambas vayan a la par.
A la hora de transmitir los bytes de datos unos tras otros, existe flexibilidad en los
tiempos, de ahí que este tipo de comunicaciones se consideren asíncronas. La
transmisión de los 8 bits de datos de un byte realmente es síncrona, pero las
comunicaciones en serie siempre han sido consideradas asíncronas.
Para una transmisión en serie básica bastan tres hilos. Sin embargo, el software
que controla el puerto serie a través de la interfaz RS-232-C podría requerir más
señales de control para establecer la comunicación, al igual que para controlar un
modem telefónico pueden hacer falta más líneas (de control, no telefónicas...).
Bromas aparte, sobre comunicaciones en serie existe todo un mundo; acerca de este
tema se han escrito muchos libros completos. Lógicamente, aquí no vamos a dar
ningún curso de comunicaciones en serie. Sin embargo, los menos introducidos en la
materia no deben temer: ¿qué mejor manera de aprender sobre las comunicaciones en
serie que examinar cómo funciona un chip que las soporta?. Desde luego, también se
podría partir desde el punto de vista contrario, pero como entendido en sistemas
digitales, el lector puede que tenga menos problemas con este interesante enfoque.
El conector serial
Para poder usar el puerto serial, es necesario conocer las conexiones eléctricas del
mismo para poder establecer comunicación hardware con el dispositivo externo.
El conector de puerto serial del PC es normalmente un conector de 9 pines (DB-9
macho) o de 25 pines (DB-25 macho). La razón de esto es que, IBM tenia planes de
expandir el puerto serial con señales especiales (en el conector DB-25), cosa que hizo
con la serie PS/2. Lamentablemente, esta expansión no se normalizo, pero las
posibles mejoras que iban a introducirse han sido cubiertas con el chip 16550.
Chasis Ground 1
14
Transmit Data 2
15
Receive Data 3
16
Ready To Send 4
17
Clear To Send 5 Carrier Detect 1
18 6 Data Set Ready
Data Set Ready 6 Receive Data 2
19 7 Ready To Send
Signal Ground 7 Transmit Data 3
20 Data Terminal Ready 8 Clear To Send
Carrier Detect 8 Data Terminal Ready 4
21 9 Ring Indicator
9 Signal Ground 5
22 Ring Indicator
10
23
11
24
12
25
13
Las conexiones a efectuar dependen del tipo de comunicación deseada. Por ejemplo,
si se desea conectar el puerto serial a módem externo, con un conector DB-9, el
cableado es así
Conector Conector
Computador DB-9 Computador DB-9
(DB-25) (DB-25)
3(2) TX -> RX 2(3)
2(3) RX <- TX 3(2)
5(7) Ground 5(7)
este tipo de conexión es muy útil para interconexiones simples, con hand-shaking
(protocolo de manejo) por software.
La otra alternativa es usar la configuración null módem, la cual aprovecha todos los
terminales de control del puerto
Conector
Conector
Computador DB-9
Computador DB-9
(DB-25)
(DB-25)
1 Cable Ground
3(2) TX -> RX 2(3)
2(3) RX <- TX 3(2)
5(7) Ground 5(7)
6 y 8(6 y 5) Carrier Detect 4(20)
4(20) Data Terminal Ready 6 y 8(5 y 6)
TX : Transmit Data
Es la línea de salida de datos del puerto.
RX : Receive Data
Es la línea de recepción de datos del puerto.
SG : Signal Ground
Es la referencia común para todas las señales.
RI : Ring Inidicator
Es una señal de entrada. La usan los dispositivos externos (módem en este caso) para
indicar que se esta solicitando comunicación (llamada telefónica externa). Cuando la
computadora recibe esta señal, normalmente se envía una interrupción para activar el
programa o rutina para contestar la llamada.
A continuación se listan las direcciones E/S y líneas de interrupción para los puertos
estándar del PC (esquema de direcciones basado en USART 8250).
1 03F8h a 03FFh 4
2 02F8h a 02FFh 3
3 03E8h a 03EFh 4 (o 10)
4 02E8h a 02EFh 3 (u 11)
El estándar RS-232
Una vez hecha la discusión técnica del puerto serial, a nivel físico y lógico, se hace
necesario extender un poco la definición del mismo, a nivel del PC.
Aunque no es critico el entender en gran detalle el estándar de comunicaciones serie
sincronas RS-232, para cubrir la meta (de uso) es importante comprenderlo lo
suficiente para ver cómo y por qué aparecen tantos problemas al usar los puertos
serie.
La configuración de la mayoría de los puertos serie se basa en el estándar RS-232
usando un conector de 25 pines (DB-25) en cada extremo. (El IBM AT usa un
conector de 9 pines DB-9.) Sin embargo, una gran cantidad de los puertos serie no
emplea todas las señales especificadas en el estándar RS-232. Algunas de estas
señales no se usan por no tener utilidad en la aplicación prevista. Otras no se
emplean debido a que el fabricante prefiere ofrecer un conjunto mínimo, en lugar de
suministrar soporte completo para RS-232.
La existencia de tantas señales se debe al hecho de que el puerto serie se diseño
inicialmente para soportar un módem. Por ello, cuando se usa con otros dispositivos,
muchas de esas señales no sirven de nada. Esas señales se utilizan normalmente para
establecer un protocolo de hardware entre el módem y la computadora, de forma que
ésta:
• No envíe información antes de que pueda transmitirla.
• No lea información del módem antes de que esté lista
Un error de configuración se produce si los relojes internos que controlan los dos
puertos son muy diferentes el uno del otro. Como puede imaginar, el puerto serie,
una vez que ha detectado el bit inicial, muestra el registro de entrada una vez cada
ciclo de reloj para leer los siguientes bits. La longitud de cada ciclo viene
determinada por la velocidad de transmisión. Sin embargo, el tiempo que cada bit
permanece en el registro viene determinado por el reloj que controla el sistema. Si la
velocidad del reloj de la computadora que recibe no está suficientemente cerca de la
del que envía, puede sobre-escribirse un bit, dando un error de configuración.
Dialogo Hardware
La forma adecuada de transmitir datos a través de un puerto serie es controlar el
estado de la señal línea de control del puerto receptor. No debe enviar datos hasta
que la señal línea de control indique que es seguro hacerlo. De esta forma, cuando se
usa el dialogo hardware, la rutina de transmisión (en pseudo-codigo) tiene el siguiente
aspecto:
1. Mientras (no CTS) esperar;
2. Enviar(byte)
3. Si quedan datos, ir al paso 1
Si se tiene un cable con las conexiones adecuadas, y en cada extremo el hardware
adecuado para soportar el estándar RS-232, debe usar sin dudas el diálogo hardware.
Sin embargo, en ocasiones puede ser difícil hacerlo.
Data Terminal Ready. Línea de salida que puede activarse (poner a 0) escribiendo un 1 en
MCR(0), y desactivarse escribiendo un 0 en dicho bit o ante la activación del pin MR. Con -
DTR DTR activo se indica al DCE que el 8250 puede recibir datos. En algunas circunstancias, esta
señal se usa como LED de 'power on'. Si está inactivo, el DCE desconecta el modem del
circuito de telecomunicaciones.
Request To Send. Línea de salida que habilita el modem. Se activa (poner a 0) escribiendo
un 1 en MCR(1). Esta señal se pone en alto en respuesta a MR. -RTS indica al DCE que el
RTS
8250 tiene un dato listo para transmitir. En la modalidad half-duplex, esta señal se utiliza
para controlar la dirección de la línea.
Esta línea de salida contiene una señal de reloj 16 veces mayor que la frecuencia usada para
transmitir. Equivale a la frecuencia de entrada en el oscilador dividida por el BRG. La
BAUDOUT
estación receptora podría emplear esta señal conectándola a RCLK (para compartir el mismo
reloj).
Estas dos salidas de propósito general se pueden activar (poner a 0) escribiendo un 1 en
OUTx MCR(2) y MCR(3). Son desactivadas por la señal MR. En el modo lazo (LOOP o bucle),
están también inactivas.
Ring Indicator. Esta línea de entrada indica si el modem ha detectado que llaman por la línea
y puede consultarse en MSR(6). El bit TERI (MSR(2)) indica si esta línea ha cambiado
desde la última lectura del MSR. Si las interrupciones están habilitadas (IER(3) activo) esta
RI patilla provoca una interrupción al activarse. -RI permanece activo durante el mismo
intervalo de tiempo que la zona activa del ciclo de llamada e inactivo en los intervalos de la
zona inactiva (o cuando el DCE no detecta la llamada). El circuito no se corta por culpa de -
DTR.
Data Carrier Detect. Línea de entrada que indica si el modem ha detectado portadora. Se
puede consultar su estado lógico en MSR(7). El bit MSR(3) indica si esta línea ha cambiado
DCD
desde la última lectura del MSR. Esta línea no tiene efecto sobre el receptor. Si las
interrupciones están permitidas, una interrupción será generada ante el cambio de esta línea.
Master Reset. Esta línea de entrada lleva el 8250 a un estado inactivo interrumpiendo su
posible actividad. El MCR y las salidas ligadas al mismo son borradas. El LSR es borrado en
MR
todos sus bits salvo THRE y TEMT (que son activados). El 8250 permanece en este estado
hasta volver a ser programado.
Interrupt Request. Línea de salida que se activa cuando se produce una interrupción de
alguno de estos tipos y está permitida: Recepción de banderín de error, dato recibido
INTRPT
disponible, registro de retención de transmisión vacío, y estado del modem. Esta línea se
desactiva con el apropiado servicio de la interrupción o ante MR.
Serial Data Input. Es la línea de entrada de datos desde el modem. En el modo lazo (LOOP o
SIN
bucle) están inhibidas las entradas en SIN.
Chip Select. Estas entradas actúan como líneas de habilitación para las señales de escritura
CS0..2
(DOSTR, -DOSTR) y lectura (DISTR, -DISTR).
Chip Select Out. Esta línea de salida se activa cuando el chip ha sido seleccionado con
CSOUT
CS0..2. No comenzará transferencia de datos alguna hasta que CSOUT se active.
Driver Disable. Esta salida está inactiva cuando la CPU lee datos del 8250. Una salida activa
DDIS
puede emplearse para inhibir un transceiver externo cuando la CPU está leyendo datos.
Address Strobe. Cuando esta línea de entrada está activa se enclavan las líneas A0..A2 y
CS0..2; esto puede ser necesario si los pines de selección de registro no son estables durante
ADS
la duración de la operación de lectura o escritura (modo multiplexado). Si esto no es preciso,
esta señal se puede mantener inactiva (modo no-multiplexado).
Esta línea se corresponde con la entrada de reloj para la sección receptora, equivalente a 16
RCLK veces la frecuencia empleada en la transmisión y puede proceder del BAUDOUT de la
estación remota o de un reloj externo.
Break Stick
DLAB control Parity
EPS PEN STB WLS1 WLS0
7 6 5 4 3 2 1 0
Este registro controla el formato del carácter de datos. Los bits WLS seleccionan el
tamaño del dato empleado. STB indica el número de bits de stop, que pueden ser 1
(STB=0) ó 2 (STB=1), al trabajar con datos de 5 bits STB=1 implica 1.5 bits de stop.
PEN (Parity Enable) permite habilitar o no la generación de bit de paridad, EPS
(Even Parity Select) selecciona paridad par si está a 1 (o impar en caso contrario).
Stick Parity permite forzar el bit de paridad a un estado conocido según el valor de
EPS. Cuando Break Control es puesto a 1, la salida SOUT se pone en estado espacio
(a 0), sólo afecta a SOUT y no a la lógica de transmisión. Esto permite a la CPU
alertar a un terminal del sistema sin transmitir caracteres erróneos o extraños si se
siguen estas fases: 1) cargar un carácter 0 en respuesta a THRE, 2) activar Break
Control en respuesta al próximo THRE, 3) esperar a que el transmisor esté inactivo
(TEMT=1) y bajar Break Control. Durante el Break, el transmisor puede usarse como
un preciso temporizador de carácter.
El bit DLAB (Divisor Latch Access Bit) puesto a 1 permite acceder a los Latches
divisores DLL y DLM del BRG en lectura y escritura. Para acceder al RBR, THR y al
IER debe ser puesto a 0.
0 TEMT THRE BI FE PE OE DR
7 6 5 4 3 2 1 0
THRE indica que el 8250 puede aceptar un nuevo carácter para la transmisión: este
bit se activa cuando el THR queda libre y se desactiva escribiendo un nuevo carácter
en el THR. Se puede producir, si está habilitada; la interrupción THRE (prioridad 3);
INTRPT se borra leyendo el IIR. El 8250 emplea un registro interno para ir
desplazando los bit y mandarles en serie (el Transmitter Shift Register), dicho registro
se carga desde el THR. Cuando ambos registros (THR y el Transmitter Shift) están
vacíos, TEMT se activa; volverá a desactivarse cuando se deje otro dato en el THR
hasta que el último bit salga por SOUT.
Request To Send
Este es el registro de contro para modems. Las líneas de salida DTR, RTS, OUT1 y
OUT2 están directamente controladas por estos bits; como se activan a nivel bajo, son
puestas a 0 escribiendo un 1 en estos bits y viceversa. Estas líneas sirven para
establecer diversos protocolos de comunicaciones.
Además de la información de estado del modem, los 4 bits bajos (DDCD, TERI,
DDSR, DCTS) indican si la línea correspondiente, en los 4 bits superiores, ha
cambiado de estado desde la última lectura del MSR; en el caso de TERI sólo indica
transiciones bajo-<alto en -RI (y no las de sentido contrario). La línea CTS del
modem indica si está listo para recibir datos del 8250 a través de SOUT (en el modo
lazo este bit equivale al bit RTS del MCR). La línea DSR del modem indica que está
listo para dar datos al 8250 (en el modo lazo -o LOOP- equivale al bit DTR del
MCR). RI y DCD indican el estado de ambas líneas (en el modo lazo se corresponden
con OUT1 y OUT2 respectivamente). Al leer el MSR, se borran los 4 bits inferiores
(que en una lectura posterior estarían a 0) pero no los bits de estado (los 4 más
significativos).
Los bits de estado (DCD, RI, DSR y CTS) reflejan siempre la situación de los pines
físicos respectivos (estado del modem). Si DDCD, TERI, DDSR ó DCTS están a 1 y
se produce un cambio de estado durante la lectura, dicho cambio no será reflejado en
el MSR; pero si están a 0 el cambio será reflejado después de la lectura. Tanto en el
LSR como en el MSR, la asignación de bits de estado está inhibida durante la lectura
del registro: si se produce un cambio de estado durante la lectura, el bit
correspondiente será activado después de la misma; pero si el bit ya estaba activado y
la misma condición se produce, el bit será borrado tras la lectura en lugar de volver a
ser activado.
La información que indica que hay una interrupción pendiente y el tipo de la misma
es almacenada en el IIR. El IIR indica la interrupción de mayor prioridad pendiente.
No serán reconocidas otras interrupciones hasta que la CPU envíe la señal de
reconocimiento apropiada. En el registro IIR, el bit 0 indica si hay una interrupción
pendiente (bit 0=0) o si no la hay (bit 0=1), esto permite tratar las interrupciones en
modo polled consultando este bit. Los bits 1 y 2 indican el tipo de interrupción. Los
restantes están a 0 en el 8250, pero el 16550 utiliza alguno más.
7 6 5 4 3 2 1 0
El bit 0 debe estar a 1 para escribir los bits 1 ó 2. Cuando el bit 1 ó el 2 son activados,
la cola afectada es borrada y el bit es devuelto a 0. Los registros de desplazamiento de
la transmisión y la recepción, en cada caso, no resultan afectados.
Cuando el transmisor está inactivo, tanto THRE como TEMT están activos. El primer
carácter escrito provoca que THRE baje; tras completarse la transferencia vuelve a
subir aunque TEMT permanecerá bajo mientras dure la transferencia en serie del
carácter a través de TSR. Si un segundo carácter es escrito en THR, THRE vuelve a
bajar y permanecerá bajo hasta que el TSR termine la transmisión, porque no es
posible volcar el contenido de THR en TSR hasta que este último no acabe con el
carácter que estaba transmitiendo. Cuando el último carácter ha sido transmitido fuera
del TSR, TEMT vuelve a activarse y THRE también lo hará tras un cierto tiempo (el
que tarda en escribirse THR en TSR).
En la recepción, los datos en serie asíncronos entran por la patilla SIN. El estado
inactivo de la línea se considera el '1' lógico. Un circuito de detección de bit de inicio
está continuamente buscando una transición alto-<bajo que interrumpa el estado
inactivo. Cuando la detecta, se resetea un contador interno y cuenta 7½ pulsos de
reloj (tener en cuenta que la frecuencia base es dividida por 16), posicionándose en el
centro del bit de inicio. El bit de inicio se considera válido si SIN continúa aún bajo
en ese momento. La validación del bit de inicio evita que un ruido espúreo en la línea
sea confundido con un nuevo carácter.
El LCR tiene toda la información necesaria para la recepción: tamaño del carácter (5-
8 bits), número de bits de stop, si hay paridad o no... la información de estado que se
genere será depositada en el LSR. Cuando un carácter es transmitido desde el
Registro de Desplazamiento de la Recepción (RSR) al Registro Buffer de Recepción
(RBR), el bit DR del LSR se activa. La CPU lee entonces el RBR, lo que hace bajar
de nuevo DR. Si el carácter no es leído antes de que el siguiente carácter que se está
formando pase del RSR al RBR, el bit OE (overrun) del LSR se activa. También se
puede activar PE en el LSR si hay un error de paridad. Finalmente, la circuitería que
chequea la validez del bit de stop podría activar el bit FE del LSR en caso de error.
El centro del bit de inicio se define como 7½ pulsos de reloj; si los datos que entran
por SIN constituyen una onda cuadrada simétrica, el centro de las celdas que
contienen los bits se desviará a lo sumo un ±3.125% del centro real, lo que deja un
margen de error del 46.875%; el bit de inicio puede comenzar, como mucho, 1 ciclo
de reloj (de los 16) antes de ser detectado.
INIT
Esta función establece la rata de baudios(baud rate), el número de bits de parada
(stop), paridad y longitud del carácter en un puerto serial especifico. Esta retorna el
contenido del registro de estado de línea y el registro de estado de modem del puerto
especificado.
Retorna:
AH = Estado de línea
AL = Estado del módem
01 paridad impar
2 0 1 bit de parada
1 2 bits de parada
REGISTRO AH
7 1 Timeout Error
6 1 Transmit Shitf Register Empty
5 1 Transmit Hold Register Empty
4 1 Break Received
3 1 Character framing Error
2 1 Parity Error
1 1 Overrun Error
0 1 Data Set Ready
REGISTRO AL
Ejemplo:
XMIT
Esta función transmite un byte de datos a través del puerto serial definido por el
registro DX.
Retorna:
AH = Estado de línea
AL = Estado de modem
AX (alterado)
RECV
Esta función lee un byte de datos del puerto definido por DX.
STATUS
Esta función proporciona el estado del puerto serial definido en DX.
Retorna:
AH = Estado de línea
AL = Estado del modem
AX (alterado)
EXTENDED_INIT
Esta función ajusta el operación del puerto serial (paridad, parada, datos y velocidad)
en el puerto serial definido. Esta función proporciona más opciones que la función
INIT, pero requiere muchísimos más datos en varios registros.
Definiciones:
AL = BREAK
00h = No break
01h = Break
BH = PARIDAD
00h = Sin paridad
01h = Paridad impar
02h = Paridad par
03h = Engancha en paridad impar
04h = Engancha en paridad par
BL = PARADA
00h = 1 bit de parada
01h = 2 bits de parada si el dato es de 6, 7, u 8 bits
1,5 bits de parada si el dato es de 5 bits
CH = DATOS
00h = 5 bits
01h = 6 bits
02h = 7 bits
03h = 8 bits
CL = BAUDIOS
00h = 110 baudios
01h = 150 baudios
#include <dos.h>
#include <conio.h>
void error()
{
printf ("\r ¡¡Fallo del puerto serie!!\n");
exit (2);
}
void main()
{
unsigned com, base, divisor, dato, entrada, lsr;
if (dato!=entrada) error();
printf ("\rEnviado y recibido byte %d",dato);
}
if (!kbhit())
printf("\rAutodiagnóstico del 8250 en COM%d superado.\n", com);
else
{ getch(); printf("\rTecla pulsada - prueba abortada.\n");}
}
Ejercicios propuestos
2. Diseñe un dispositivo que permita compartir un puerto serial con dos equipos.
Para ellos, deberá hacer un conmutador de puertos, controlado totalmente por
software, que gestione la negociación entre el equipo maestro y los dos
remotos.