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