PUERTO SERIE

Anuncio
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
PUERTO SERIE
En el interior de puerto serie hay un chip para la entrada y salida de caracteres y para la conversión de
palabras de datos en las correspondientes señales del puerto serie: lo que se denomina
UART(Universal Asynchronus Receiver Transmitter-Emisor y Receptor Asíncrono Universal; su
abreviatura SIO(Serial Input/Output). Este chip lleva el nombre 8250. A continuación se detallan los
tipos de UARTS(para PC s):
8250
8250ª
8250B
16450
16550
16550ª
16650
16750
Primera UART en esta serie. No contiene el scratch register.
Esta UART es mas rápida desde el lado del BUS. Utiliza el mismo software que la 16450. Es una version
mejorada de la 8250.
Es muy similar a la 8250.
Usada en AT's (Velocidad del BUS mejorada con respecto a las 8250's). Opera bien a 38.4KBPS. Todavía se
puede encontrar actualmente.
Esta fué la primera generación de buffered UART. Tiene un buffer de 16 bytes, Sin embargo no funcionó y se
reemplazó con la 16550A.
Es la UART mas comúnmente utilizada para comunicaciones de alta velocidad. Se aseguró que los buffers
FIFO funcionan en esta UART.
Generación muy reciente de UART. Contiene una FIFO de 32 bytes, Caracteres de de X-On / X-Off
programables y soporta power management.
Producida por Texas Instruments. Contiene una FIFO de 64 bytes.
El UART dispone de 10 registros accesibles desde el exterior(vía software) y de registros adicionales
accesibles sólo internamente, tales como el Receiver Shift Register y el Transmitter Shift Register,
fundamentales en la emisión y recepción de caracteres. Si el UART recibe un carácter , los diferentes
bits que se van recibiendo se amontonan primero en el Receiver Shift Register hasta que se completa
una palabra de datos. Si no aparece ningún fallo, el Byte es transferido al Receiver Data Register desde
donde puede ser leído vía software.
En sentido contrario, el software escribe primero la palabra de datos a enviar en el Transmitter Holding
Register. De ahí el UART lo traslada al registro interno Transmitter Shift Register para desde ahí
transmitir los diferentes bits uno detrás de otro a través de la línea.
Tabla de los Registros
Base Address DLAB
=0
+0
=0
=1
=0
+1
=1
Read/Write
Write
Read
Read/Write
Read/Write
Abr.
THR
RBR
DLL
IER
Register Name
Transmitter Holding Buffer
Receiver Buffer
Divisor Latch Low Byte
Interrupt Enable Register
+3
-
Divisor Latch High Byte
DLM
Read
IIR Interrupt Identification Register
Write
FCR FIFO Control Register
Read/Write LCR Line Control Register
+4
-
Read/Write
+5
+6
+7
-
+2
Read/Write
Modem Control Register
MCR
Read
LSR Line Status Register
Read
MSR Modem Status Register
Read/Write Scratch Register
1
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
Programando (PC's)
Basado en Polling o en Interrupt´s ?
Cuando escribe un programa de comunicaciones, la comunicación entre el software y el UART puede
darse tanto en modo polling como en modo interrupción.
En modo polling es responsabilidad del software consultar a través del Line Control Register el estado
del UART a espacios de tiempo regulares. Sólo así puede determinar si se ha recibido un nuevo
carácter o si el último carácter enviado se encuentra realmente en camino. Es decir que se consulta
primero el Line Status Register para saber si hay algún carácter disponible en el RBR. Si es así, se lee
el carácter y a continuación se inicia el proceso de nuevo. Si todavía no hay caracteres preparados en el
buffer interno, el UART, inmediatamente después de la lectura del carácter del RBR, activará de nuevo
el bit correspondiente del Line Status Register de modo que este carácter sea automáticamente
recogido en el próximo bucle. Desventaja de todos los procedimientos polling: la CPU está todo el
tiempo ocupada con el dispositivo y los caracteres comparados con la velocidad de la CPU, son
enviados y recibidos de manera muy lenta. Teniendo velocidades máximas de aproximadamente 34.8
KBPS antes de comenzar a perder datos. Algunas Pentium nuevas podrían obtener mejores
velocidades.Ventaja, los correspondientes módulos de programa son sencillos de contruir.
La otra opción es utilizar un manejador de interrupciones. Esto nos permite soportar fácilmente
velocidades de 115.2K BPS, aún con computadoras de bajas prestaciones.
Pero no debemos descartar totalmente el método de hacer el poll a la UART. Es un buen método de
diagnóstico. Si Ud. no tiene conocimiento de la dirección de su tarjeta, ó cual IRQ está utilizando,
podría “polear” la UART a diferentes direcciones para encontrar en que puerto tiene un módem
conectado. Luego de conocer esa información, Ud. Puede armar e instalar una rutina de interrupciones
para los IRQs comunes y habilitando un IRQ a la vez, usando el “Programmable Interrupt Controller” ,
podrá encontrar su IRQ, Y sin necesidad de usar un destornillador !
Acceso a los registros
Son accesib les desde diferentes puertos que se orientan en la dirección de base del puerto serie. Esta
dirección de base puede, teóricamente escogerse a voluntad, pero en la práctica:
Nombre
COM 1
Address
3F8
COM 2
COM 3
COM 4
2F8
3E8
2E8
Standard Port Addresses
En la tabla se muestran los “Standard port addresses”. Ellos deberían funcionar para la mayoría de las PC's.
Para tener la certeza de no pasar por alto al puerto serie, lo mejor es no fijar las direcciones de puerto
desde un principio en los programas y consultar una de las cuatro variables del BIOS en las que se
encuentran las direcciones de base de los cuatro como máximo puertos serie que puede soportar la
BIOS, obteniéndose con seguridad la dirección actual del puerto serie deseado.
Si observamos los registros del UART existen dos direcciones de puerto (puerto base +0 y puerto base
+1) son ocupadas por varios registros. Para poder diferenciar entre los distintos registros al acceder al
puerto correspondiente se utiliza el bit más significativo en el Line Control Register.
2
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
“Antes de acceder a uno de los registros del primer o segundo puerto serie, cargue este bit con el valor
indicado en la tabla.”
Inicialización del UART
Para establecer conexión con otro puerto serie, el UART primero debe ser inicializado, es decir
teniendo en cuenta los diferentes parámetros de comunicación: el ratio de baudios(velocidades de las
comunicaciones medidas en bits por segundo), la longitud de la palabra de datos y el número de stop
bit. Se recomienda además efectuar un acceso de lectura al Receiver Data Register, debido a que si
algún programa anterior a dejado algún carácter, existe la posibilidad de que se interprete por error este
carácter como el primero de la conexión que se está a punto de establecer. Si por el contrario no existe
ningún carácter preparado para ser llamado, el acceso de lectura no tiene ningún efecto por lo que no
puede cometerse ningún error.
Al configurar los diferentes parámetros de la comunicación se debe empezar por el ratio de baudios
pues al escribir los distintos registros, el UART inicializa el resto de parámetros. Si se configuran estos
registros antes de indicar el ratio de baudios, tendrán que volverse a configurar de nuevo.
Si observamos el DLAB(divisor Latch Access Bit) en la tabla de registros cuando el mismo es puesto
en “0” o en “1” algunos de los registros cambian. Ello se debe a que la UART puede tener 12 registers
(incluyendo el scratch register), pero solamente 8 port addresses. Cuando DLAB se pone en '1' por
medio del “line control register”, dos registros se hacen disponibles (DLL y DLM) desde los cuales Ud
puede colocar la velocidad de las comunicaciones medidas en bits por segundo.
La velocidad deseada no se entra directamente, sino como un cociente con respecto a la frecuencia del
UART(que tiene un cristal que oscila aproximadamente a 1.8432 MHZ, también incorpora un
Contador-Divisor por 16 que divide la señal del clock por 16). El ratio de baudios comunica al UART
cuán rápido debe generar los diferentes bits con respecto a su frecuencia de reloj, la fórmula sería:
Valor del registro = 1.8432 MHz / (16 * ratio de baudios)
La igualdad expresa que el UART debe dividir la duración de un pulso por 16 y tras N(ratio de
baudios) de estos pulsos, enviar el siguiente bit a la línea.
Como el valor del registro se obtiene, con esta fórmula, un valor de 16 bits, cuyo byte menos
significativo debe escribirse en DLM. Procediendo de esta manera se puede escoger cualquier ratio de
baudios comprendiendo de esta manera se puede escoger cualquier ratio de baudios comprendido entre
1,75 baudios (valor del registro = =FFFFh) y 115200 baudios (valor del registro = 1).
El ratio de transmisión más elevado que puede conseguirse es 115200 baudios, es decir 115 Kilobit por
segundo. Tener en cuenta que por cada palabra de datos de 8 bits deben transmitirse un mínimo de dos
bits adicionales (1 bit de inicio y un stop bit), con lo que el ratio de transmisión de datos real queda en
1,4Kbyte por segundo.
Suponiendo que tenemos la señal del reloj a 1.8432 MHZ, tendríamos un máximo de 115,200 hertz
haciendo que la UART tenga la capacidad de transmitir y recibir a 115,200 Bits Por Segundo (BPS).
Esto debería ser adecuado para los modems rápidos actuales, pero algunos no pueden comunicarse a
esa velocidad. Por ello la UART se creó con un generador de velocidad programable (Programmable
Baud Rate Generator) que es controlado por dos registros.
Por ejemplo, si queremos comunicarnos solamente a 2400 BPS, deberíamos dividir 115,200 por 48
para obtener el reloj de 2400 Hertz. El "Divisor", en este caso 48, es almacenado en los dos registros
controlados por el "Divisor Latch Access Bit" (DLAB). Este divisor puede ser cualquier número que
pueda ser almacenado en 16 bits (Por Ej.: 0 a 65535). LA UART solo tiene un bus de datos de 8 bits,
Por ello es que aquí necesitamos utilizar los dos registros. El primer registro (Base + 0), cuando DLAB
= 1, almacena el "Divisor latch low byte" mientras que el segundo registro (base + 1 cuando DLAB =
1) almacena el "Divisor latch high byte."
3
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
En la práctica se opera con valores muy concretos, que se especifican en la siguiente tabla. En la
misma también se indican los valores de registro que deben introducirse en DLL y DLM para obtener
el ratio de baudios deseado.
Velocidad (BPS)
Divisor (Dec)
Divisor Latch High Byte
Divisor Latch Low Byte
50
300
600
2304
384
192
09h
01h
00h
00h
80h
C0h
2400
4800
9600
48
24
12
00h
00h
00h
30h
18h
0Ch
19200
38400
57600
6
3
2
00h
00h
00h
06h
03h
02h
115200
1
00h
01h
Divisores de Baud rate comunmente usados
El resto de parámetros (longitud de palabra, el número de stop bit y la utilización de bits de paridad se
configuran a través del Line Control Register(LRC) que se encuentra en la dirección relativa 3 con
respecto a la dirección de base del puerto serie. Este registro se puede escribir para llevar a cabo
nuevas reconfiguraciones, pero también se puede leer si se quiere averiguar la configuración actual.
Line Control Register (LCR)
Bit 7
1
0
Divisor Latch Access Bit
Access to Receiver buffer, Transmitter buffer & Interrupt Enable Register
Bit 6
Set Break Enable
Bits 3, 4 And Bit 5 Bit 4 Bit 3
5
X
X
0
0
0
1
Bit 2
1
1
1
1
1
1
Length of Stop Bit
0
One Stop Bit
Odd Parity
Even Parity
High Parity (Sticky)
Low Parity (Sticky)
Bit 1
2 Stop bits for words of length 6,7 or 8 bits or 1.5 Stop Bits for Word
lengths of 5 bits.
Bit 0 Word Length
0
0
1
0
1
0
5 Bits
6 Bits
7 Bits
1
1
8 Bits
1
Bits 0 And 1
0
1
0
Parity Select
No Parity
Line Control Register
El Line Control register setea los parámetros básicos para las comunicaciones.
4
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
Por ejemplo: a través del bit 5 se puede activar la generación de un bit de paridad constante, cuyo
contenido se manifiesta independiente del número de unos en la palabra de datos actual. En la práctica
esta posibilidad no se utiliza, al igual que raramente se usa la generación de paridad normal y más
frecuentemente se recurre a protocolos de software de más alto nivel.
El bit 6 se utiliza cuando se quiere enviar al contrario una especie de alarma, Esta posibilidad la
utilizan algunos programas de transmisión cuando emisor y receptor deben sincronizarse de nuevo a
nivel de su protocolo de software o cuando la actual transferencia de un bloque de datos grande debe
ser interrumpido por algún motivo. Para ello la línea mientras no se vuelva a liberar el bit 6 permanece
en 0 lógico. Esto se denomina “spacing condition” situación opuesta al ”marking condition” (1 lógico)
que se utiliza cuando no se va a transmitir ningún carácter. El UART al otro extremo de la conexión
reconoce la situación y pone un flag determinado en su registro de estado. Consultando este registro el
receptor puede estar alerta con respecto a dicha alarma. De esta manera se puede transmitir una
información (información de alarma) aún cuando la transmisión de caracteres aislados o de bloques de
datos parece desplomarse o cuando debe interrumpirse espontáneamente.
El bit 7 personifica al bit(DLAB), que se usa para acceder al registro y que se bifurca en las
direcciones 0 y 1 relativas al puerto base de la tarjeta. “Primero se debe leer el contenido de este
registro para no modificar los parámetros de comunicación en los otros bits. Es decir borrar o activar el
bit 7 y por último escribir el byte así obtenido de nuevo en el registro.
Estado actual del UART
Las informaciones de estado sobre la emisión y recepción de caracteres y el estado de la línea de
transmisión se consultan a través del Line Status Register(LSR).
Line Status Register (LSR)
Bit
Notes
Bit 7
Bit 6
Bit 5
Error in Received FIFO
Empty Data Holding Registers
Empty Transmitter Holding Register
Bit 4
Bit 3
Bit 2
Break Interrupt
Framing Error
Parity Error
Bit 1
Bit 0
Overrun Error
Data Ready
El bit 0 muestra si un carácter recibido se encuentra en el registro de recepción(RBR). Este bit se
inicializa automáticamente tan pronto como el carácter recibido es leído del registro. Si esto no sucede
de manera rápida, puede suceder que bajo ciertas circunstancias haya un nuevo carácter preparado
antes que el último haya podido ser leído. En este caso el carácter anterior sería sobreescrito y se
perdería. Esto se indica a través del bit 1 del LSR.
Los bit 2 y 3 se emplean para errores de paridad y los “Overrun Errors”, que aparecen cuando no se
respeta el protocolo, en lo que respecta al número de bits de datos, stop bit o bit de paridad en la
recepción de un carácter, normalmente debido a un fallo de la línea.
“El UART muestra todos los errores pero sin tomar medidas al respecto, pues corresponde al software
de comunicación desarrollar un protocolo y unos mecanismos capaces de avisar a emisor y receptor
5
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
sobre transmisiones defectuosas y provocar la repetición de la transmisión de los datos
correspondientes.”
Cuando el emisor activa una alarma a través del bit 6 del Line Control Register, esta se refleja en el bit
4 del LSR del receptor con lo que éste puede reaccionar inmediatamente.
Información sobre el estado actual de la emisión la suministran los bits 5 y 6 del LSR.
Registros de emisión : Transmitter Holding Register(THR) y el Transmitter Shift Register (TSR).
Bit 5 = 0 >>>> THR contiene un byte que se ha de transmitir
= 1 >>>> THR está vacío
Bit 6 = 0 >>>> TSR aún contiene un byte que se está enviando
= 1 >>>> TSR está vacío
Modo Interrupción
Si la UART debe ser alimentada con caracteres vía interrupciones, lo que significa que la lectura de los
caracteres que van llegando se realiza mediante la ayuda de las interrupciones, se requieren para ello
de dos registros de interrupción:
Interrupt Enable Register (IER)
Bit
Bit 7
Notes
Reserved
Bit 6
Bit 5
Bit 4
Reserved
Enables Low Power Mode (16750)
Enables Sleep Mode (16750)
Bit 3
Bit 2
Bit 1
Enable Modem Status Interrupt
Enable Receiver Line Status Interrupt
Enable Transmitter Holding Register Empty Interrupt
Bit 0
Enable Received Data Available Interrupt
Interrupt Enable Register
El IER determina las situaciones en que las interrupciones deben ser llevadas a cabo.
El Interrupt Enable Register es uno de los más fáciles de comprender. Colocando el Bit 0 en alto,
habilita el “Received Data Available Interrupt” que genera un interrupt cuando el registro receptor
/FIFO contiene datos a ser leídos por la CPU.
El Bit 1 habilita el “Transmit Holding Register Empty Interrupt”. Este interrumpe la CPU cuando el
buffer de transmisión está vacío. El Bit 2 habilita el “receiver line status interrupt”. La UART pondrá
un interrupt cuando cambia el estado de la línea receptora. Similarmente el bit 3 habilita el “modem
status interrupt”. Los Bits 4 to 7 son reservados.
6
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
Interrupt Identification Register (IIR)
Bit
Bits 6 and 7
Notes
Bit 6
Bit 7
0
0
1
0
1
1
No FIFO
FIFO Enabled but Unusable
FIFO Enabled
Bit 5
Bit 4
Bit 3
64 Byte Fifo Enabled (16750 only)
Reserved
0
Reserved on 8250, 16450
Bits 1 and 2
1
Bit 2
0
16550 Time-out Interrupt Pending
Bit 1
0
Modem Status Interrupt
0
1
1
1
0
1
0
1
Interrupt Pending
No Interrupt Pending
Bit 0
Transmitter Holding Register Empty Interrupt
Received Data Available Interrupt
Receiver Line Status Interrupt
Interrupt Identification Register
El IIR indica al administrador de interrupciones del puerto serie al llamarlo con que objeto se le ha
requerido.
Los administradores de interrupciones deben estar disponible vía software. Para que el administrador
pueda ser llamado, su dirección debe estar contenida en el vector de interrupciones existente para los
puertos serie. Cuando conocemos el IRQ, el próximo paso es encontrar el “interrupt vector” o interrup
de software como a veces se lo llama. Básicamente cualquier procesador 8086 tiene un set de 256
vectoresde interrupción numerados de 0 a 255. Cada uno de esos vectores contiene un código de 4
bytes que es una dirección (o puntero ) a la “Interrupt Service Routine” (ISR).
La tabla a continuación muestra solamente los interrupts asociados con IRQ's. Los otros 240 no son de
interés cuando programamos en comunicaciones del tipo RS-232.
Por ejemplo, si utilizamos el COM3 que tiene un IRQ de 4, entonces el “interrupt vector” sería 0C en
hex.
De todas maneras, antes de proceder con la implantación de la rutina ó servicio para administrar la
interrupción, deberíamos resguardar las anteriores direcciones de los vectores para poder restaurarlos
al finalizar el programa.
7
UTN – FRC
Trabajo Práctico
COMUNICACIONES
INT (Hex)
08
IRQ
0
Common Uses
System Timer
09
0A
0B
1
2
3
Keyboard
Redirected
Serial Comms. COM2/COM4
0C
0D
0E
4
5
6
Serial Comms. COM1/COM3
Reserved/Sound Card
Floppy Disk Controller
0F
70
71
7
8
9
Parallel Comms.
Real Time Clock
Reserved
72
73
74
10
11
12
Reserved
Reserved
PS/2 Mouse
75
76
77
13
14
15
Maths Co-Processor
Hard Disk Drive
Reserved
2004
Interrupt Vectors (Sólo para el Hardware)
A través del IER se pueden configurar de modo selectivo los eventos que la llamada al administrador
de interrupciones del puerto serie debe conllevar. Por ejemplo: activar el bit 0 cuando se trate de la
recepción de caracteres a través del administrador de interrupciones y por tanto tenga que llamarlo tan
pronto como un carácter se encuentre en el RBR. En cambio para enviar un carácter se activará
también el bit 1. Con ello se producirá una interrupción cada vez que el Transmitter Holding Register
quede vacío.
“Antes de llamar al administrador de interrupciones serie primero siempre se tiene que consultar el
IIR. Sobre todo inspeccionar primero el bit 0 de este registro pues indica si el puerto serie realmente ha
iniciado una interrupción, de ser así, ya se puede llamar al administrador de interrupciones.”
Si varios puertos serie utilizan la misma interrupción, primero se debe comprobar cuál de todos los
puertos serie ha llamado a la interrupción en primer lugar. Para ello hay que consultar uno tras otro los
IIR de los puertos serie conocidos y detenerse en aquel puerto para el que el bit 0 del IRR está activo,
que sería el puerto buscado.
Además, los bit 1 y 2 de este registro suministran información acerca de porqué motivo se ha iniciado
la interrupción del UART, para que pueda reaccionar consecuentemente.
El IIR es un registro de solo lectura. Los Bits 6 y 7 dan los estados del buffer FIFO. Cuando ambos
bits son '0' no hay buffers FIFO activos. Si el bit 7 está activo pero el bit 6 no está activo, entonces la
UART tiene sus buffer´s habilitados pero no pueden ser usados. Esto ocurre en la UART 16550 donde
una falla en el buffer FIFO hace la FIFO inútil. Si ambos bits están en '1', entonces los buffers FIFO
buffers están habilitados y totalmente operacionales.
Los Bits 4 y 5 son reservados. El Bit 3 Muestra el estado de la interrupción de time-out en una 16550 o
superior.
Antes de que el UART comience a generar interrupciones en las situaciones deseadas, no sólo debe
activarse el IER sino también un bit del Modem Control Register:
8
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
Modem Control Register (MCR)
Bit
Notes
Bit 7
Bit 6
Bit 5
Reserved
Reserved
Autoflow Control Enabled (16750 only)
Bit 4
Bit 3
Bit 2
LoopBack Mode
Aux Output 2
Aux Output 1
Bit 1
Bit 0
Force Request to Send
Force Data Terminal Ready
.
Así como el Line Status Register y el Line Control Register se ocupan de controlar y gobernar la
conexión entre dos puertos serie, el Modem Control Register y :
Modem Status Register (MSR)
Bit
Bit 7
Notes
Carrier Detect
Bit 6
Bit 5
Bit 4
Ring Indicator
Data Set Ready
Clear To Send
Bit 3
Bit 2
Bit 1
Delta Data Carrier Detect
Trailing Edge Ring Indicator
Delta Data Set Ready
Bit 0
Delta Clear to Send
Se responsabilizan de vigilar y gobernar la conexión entre el puerto serie y uno de los modems
conectados.
El Modem Control Register es un registro de lectura/escritura.en el mismo se halla un flag(bit 3) con el
que se puede activar y desactivar la generación de interrupciones a través de la UART.
El Bit 0 del “modem status register” muestra “delta clear to send”, delta significa que ocurrió un
cambio, por lo que “delta clear to send” significa que existió un cambio en la línea “clear to send”
desde la última vez que se leyó el registro. Lo mismo para los bits 1 y 3. El Bit 2 es el “Trailing Edge
Ring Indicator” que indica que existió un cambio desde bajo a alto en la línea “Ring Indicator line”.
Los Bits 4 al 7 muestran el estado actual de las líneas al momento de la lectura.
La comunicación entre el puerto serie y el modem se da a través de cuatro líneas, DTR(Dara Terminal
Ready) y RTS(Ready To Send), que van del PC al modem.
Estas líneas se pueden gobernar mediante los bit 0 y 1 del Modem Control Register.
Según el protocolo RS-232, el PC primero tiene que poner el flag DTR a 1, con lo que la línea DTR se
pone en 0 lógico y el modem reconoce con ello que el Pc está preparado. Acto seguido el PC debe
poner el flag RTS también en 1, con lo que la línea RTS se pone en 0 lógico y el modem se sitúa en
disposición de recibir la deseada transmisión de datos. En ambos casos el modem debe responder con
la correspondiente señal de saludo....
9
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
Recepción y Transmisión
La falta de buffer habría limitado el funcionamiento del chip en ratios de baudios elevados. Ya que era
frecuente que un carácter recién llegado al Receiver Data Register fuera eliminado por la sobrescritura
del siguiente carácter dándose así un Overrun Error, teniendose que reducirse el ratio de baudios, de
modo que funcionase la comunicación entre el emisor y el receptor.
A partir del 16550A(UART) se disponen de buffer: Receiver Buffer Register(recepción) y el
Transmitter Holding Register(envío). Ambos buffer trabajan bajo el principio FIFO(First in first out).
El de envío juega un papel secundario pues el ordenador, al enviar, puede determinar por sí mismo la
cadencia del envío, con lo que apenas existe la posibilidad de autoexigirse en exceso. El buffer de
recepción representa una gran ayuda, aunque vía software se tendrá que realizar la inicialización del
UART y la estructuración de la rutina para la lectura de caracteres.
En el modo de funcionamiento por Polling, se consulta primero el Line Status Register para saber si
hay algún carácter disponible en el RBR. Si es así, se lee el carácter y a continuación se inicia el
proceso de nuevo. Si todavía no hay caracteres preparados en el buffer interno, el UART,
inmediatamente después de la lectura del carácter del RBR, activará de nuevo el bit correspondiente
del Line Status Register de modo que este carácter sea automáticamente recogido en el próximo bucle.
Es un bucle de este tipo lo primero que falta en la mayoría de administradores de interrupciones de
puertos serie, pues, mientras el UART no tiene ningún carácter en un buffer interno, es suficiente con
leer una vez el RBR al llamar a la interrupción y entonces esperar a la siguiente llamada a una
interrupción para recibir el siguiente carácter. Al instalar el buffer tiene que implementarse en cambio
en el administrador de interrupciones un bucle en cuyo proceso continuamente se lee un carácter del
RBR hasta que el Line Status Register indica que ya no hay más caracteres en el RBR para ser leídos.
En este momento se han leído todos los caracteres del buffer interno pues por su parte el UART habría
empujado el resto de caracteres que todavía se encontrasen en el buffer, tras la lectura de sus
precedentes, hacia el RBR.
Para continuar siendo compatible con sus antecesores el 16550 desactiva su buffer interno mientras no
se le diga explícitamente lo contrario. Para ello existe un nuevo registro el Interrupt ID Register. Mien
tras que el Interrupt ID Register sólo puede ser leído, el nuevo registro del 16550 para el
funcionamiento en FIFO sólo puede ser escrito. Con ello es posible dividir la dirección entre uno y
otro registro con lo que en función del tipo de acceso, el UART diferencia a qué registro se quiere
acceder.
First In / First Out Control Register (FCR)
Bit
Notes
Bits 6 and 7 Bit 7
0
0
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Bit 6
0
1
Interrupt Trigger Level
1 Byte
4 Bytes
1
0
8 Bytes
1
1
14 Bytes
Enable 64 Byte FIFO (16750 only)
Reserved
DMA Mode Select. Change status of RXRDY & TXRDY pins from mode 1 to mode
2.
Clear Transmit FIFO
Clear Receive FIFO
Enable FIFO's
El registro FIFO es de solo escritura. Se lo utiliza para controlar los buffer´s FIFO.
10
UTN – FRC
Trabajo Práctico
COMUNICACIONES
2004
A través del bit 0 de este registro se activan los buffer tipo FIFO. Si en algún momento se necesita
borrar uno de los dos buffer, basta con escribir el valor 1 en el bit 1(buffer de recepción) o en el bit
2(buffer de emisión). Para ello no olvide poner también el bit o pues de lo contrario el buffer FIFO se
activará simultáneamente.
Los bits 6 y 7 para configurar el número de caracteres a partir de cuya recepción se iniciará una
interrupción siempre que el UART esté configurado para generar interrupciones a través del Interrupt
Enable Register. Escogiendo los valores 4,8 o 14 en estos bits se motivará que el UART no envíe una
interrupción cada vez que se reciba un carácter. Esto es importante pues, en términos de medida de
procesador, la ejecución de una interrupción conlleva mucho tiempo, por lo que toda reducción del
número de éstas es positiva. El bucle de consulta dentro de la rutina de la interrupción se ocupa de que
realmente se lean todos los caracteres del buffer y no sólo el primero.
Pero ¿Qué sucede cuando el lado opuesto envía tres caracteres configurando con ello por primera
vez la transmisión, porque estos tres caracteres le dicen al receptor “ahora me devuelves los caracteres
y la información”? En ciertas circunstancias puede suceder que al receptor no le lleguen estos tres
caracteres porque el buffer todavía no tiene los cuatro, ocho o catorce caracteres mínimos necesarios
antes de que sea lanzada una interrupción y de esta manera el emisor podría estar esperando
eternamente una respuesta del receptor. Para que esto no suceda el UART provoca siempre una
interrupción cuando el buffer no está lleno pero ha transcurrido el tiempo suficiente para
la transmisión de tres caracteres y no se ha recibido ninguno. Este “Time Out” le es indicado al
administrador de interrupciones a través de un nuevo bit adicional en el Interrupt ID register. Este bit
básicamente puede ser ignorado pues el UART continúa teniendo como argumento para lanzar una
interrupción el que haya caracteres disponibles en el RBR.
Scratch Register
El “scratch register” no se usa para comunicaciones.
11
Descargar