Story Transcript
TUTORIAL DE ENTRADA/SALIDA 1.- Introducción Los dispositivos o puertos de entrada/salida permiten realizar transferencias de información entre el exterior y el microprocesador. Existen dos modos de transferencia:
paralelo: el puerto utiliza un conjunto de líneas, tantas como bits a transmitir simultáneamente, por las que cada una pasa un bit en un intervalo de tiempo.
Serie: el puerto utiliza una única línea por la que, en intervalos de tiempo diferentes, se transmiten, uno a uno, todos los bits del dato.
Téngase en cuenta que las transferencias entre el microprocesador y el puerto concreto, que se realizan a través del bus de datos, son, siempre, de tipo paralelo.
1
2.- Dispositivos o puertos de entrada/salida con transferencia en paralelo. Un puerto de entrada/salida en su forma más básica es un simple registro o latch. OC I0
I1
I2
D Q
O0
Q
O1
D
D O2
Q I3
LATCH 74LS373
I4
I5
I6
I7 G
D Q
O3
Q
O4
Q
O5
Q
O6
Q
O7
D
D
D
D
Una configuración de este dispositivo como puerto de salida se muestra a continuación:
BUS DE DIRECCIONES
Decodificador de direcciones
G
OC
LATCH 373
BUS DE DATOS
En la figura anterior, el latch siempre muestra su contenido en la salida, puesto que el pin /OC =0. A su vez, las salidas del latch se conectan con diodes LEDS que permiten visualizar su contenido, de forma que un 1 en alguna salida del LATCH provoca que el LED asoicado se ilumine, mientras que un 0, lo apaga. Las entradas del latch se conectan al bus de datos del sistema (que se ha 2
supuesto de 8 bits). Por otro lado, la entrada de habilitación, G, se conecta, a través del sistema de decodificación, al bus de direcciones del microprocesador, por lo que para una dirección de memoria concreta, el latch se habilitará y almacenará el contenido del bus de datos. Desde el punto de vista del programador, el encendido o apagado de los LEDs, sólo es cuestión de una escritura en una posición de memoria. Ejemplo: Supongamos un microprocesador genérico para el que se le ha asignado la dirección de memoria $RES al registro concreto. La secuencia de instrucciones necesarias para encender de forma progresiva cada uno de los LEDS sería: BUCLE:
MUEVE MUEVE MUEVE MUEVE MUEVE MUEVE MUEVE MUEVE SALTO
#$80,$RES #$40,$RES #$20,$RES #$10,$RES #$08,$RES #$04,$RES #$02,$RES #$01,$RES BUCLE
PROBLEMA: La rapidez con la que se ejecuta ese código provocaría que se vean todos lo LEDs encendidos. (El ojo humano no distingue frecuencias superiores a 30Hz)
Una configuración del mismo registro, pero como puerto de entrada, se representa en la siguiente figura. R
BUS DE DIRECCIONES
Decodificador de direcciones
5v
OC
5v
G
LATCH 373
5v
BUS DE DATOS
Puesto que la entrada G está a 1 lógico, el LATCH, permanentemente, almacena el contenido de sus entradas. A su vez, las entradas del registro están conectadas a pulsadores mecánicos que disponen de una resistencia de pull-up. Si un pulsador está presionado, el latch se carga con un 0 lógico, sino, con un 1 lógico. Las salidas del latch se conectan al bus de datos del microprocesador (que hemos 3
supuesto igualmente de 8 bits), para lo que se necesita la alta impedancia, por lo que, ahora, la entrada OE, que controla la lectura del latch, se conecta al bus de dirección a través de un decodificador de dirección. Para evitar conflictos en el bus de datos, el decodificador dispone de un habilitador conectado a la señal de R que genera el microprocesador en todo acceso de lectura ya sea memoria o a entrada/salida. Desde el punto de vista del programador, la lectura de una dirección de memoria permitirá determinar si las teclas están pulsadas o no. Ejemplo: Se desea desarrollar un programa que permita realizar una acción si se pulsa el botón situado en la posición más significativa del bus. (Se supone un microprocesador genérico y que el registro está mapeado en la dirección de memoria $RES):
BUCLE:
Posicion:
CLR MUEVE
D0 #$FF, D1
MUEVE MUEVE AND
$RES,D0 D0,D2 #$80,D0
BNE MUEVE SALTA MUEVE AND BEQ JSR MUEVE SALTA
posicion D2,D1 BUCLE D1,D #$80,D0 BUCLE accion #$FF,D1 BUCLE
;D0,D1,D2 son registros internos del microprocesador. ;D1 es un registro que contiene el valor inicia FF que ;indica que ninguna tecla ha sido pulsada. ;Lectura del puerto. ;Se salva el contenido de D0 en D2 ;El registro D0 tiene un 0 si la tecla está pulsada y ≠0 ;en caso contrario.
;Comprueba el valor del bit más significativo
Este programa comprueba si la tecla ha sido pulsada o no y lo comprueba con el valor de pulsación de la última vez que accedió al puerto de entrada. PROBLEMA: Esta rutina no elimina los fenómenos físicos de los rebotes en los contactos.
Los puertos de entrada/salida suelen incluir alguna circuitería adicional con información de estado, que incluye: disponibilidad del periférico para la lectura de un dato o registro interno disponibilidad del periférico para la escritura de un dato Esto dá lugar a dos tipos de transferencias entre el microprocesador y el puerto: Incondicionales: el microprocesador no debe acceder al puerto de E/S para saber si este está disponible para la transferencia. Condicionales: el microprocesador debe acceder para determinar si el puerto está disponible para la transferencia. Ejemplos de transferencia incondicionales se han presentado con anterioridad en la lectura del teclado o la visualización de LEDs. Como ejemplo de transferencia condicional supongamos que un determinado sistema tiene que recibir información de otro. La información recibida es leída por el microprocesador a través de un puerto de E/S del tipo 74LS373. El sistema remoto pone un dato 4
nuevo en la entrada del latch cada cierto tiempo. La lectura del latch está condicionada a que el sistema remoto coloque un nuevo dato en él. Una lectura incondicional del latch, en la que no sabríamos si el sistema remoto a situado un nuevo dato, provocaría multiplicidades y pérdidas de datos. Para conseguir una transferencia condicional, debe utilizarse cierto hardware que informe al microprocesador de que el sistema remoto ha depositado un nuevo dato en el latch. En la siguiente figura se aprecian estos cambios. DATOS DEL DISPOSITIVO DE ENTRADA
LATCH
BUFFERS TRIESTADO BUS DE DATOS
D
1
ACTIVADOR DESDE EL DISPOSITIVO DE ENTRADA
Q
puerto1
puerto2
El dispositivo de entrada dispone de un bus por el que se transfiere los datos y una línea adicional que avisa de la existencia de un nuevo dato en el bus. El cambio del valor lógico de dicha línea (de 0 a 1) produce la carga del nuevo dato en el latch y la puesta a 1 del biestable D. Este biestable, puede considerarse como otro puerto de entrada/salida que se sitúa en una dirección de memoria (puerto1) diferente a la del latch (puerto2). Las direcciones puerto1 y puerto2 se obtienen mediante sendos decodificadores conectados al bus de direcciones. La salida del biestable se conecta a una línea del bus de datos (supongamos la línea 7) a través de un buffer triestado que se activa cuando el microprocesador hace una operación de lectura sobre la dirección puerto1. El latch coloca su contenido en el bus de datos cuando el microprocesador realiza una operación de lectura sobre la dirección de memoria puerto2, lo cual pone a 0 el contenido del biestable D. El microprocesador debe consultar el contenido del bit 7 de la posición de memoria puerto2 para determinar si existe un nuevo dato (si está a 1), o no (si está a 0). Si existe dato nuevo, se aplica lectura sobre la posición de memoria puerto1, lo cual borra el bit 7 de la posición puerto2. El siguiente programa ilustra todo este proceso. BUCLE:
MUEVE BEQ MUEVE SALTA
#$PUERTO1,D0 BUCLE #$PUERTO2,(A0)+ BUCLE
Uno de los principales problemas que plantea la transferencia paralelo es la velocidad a la que esta puede tener lugar. Si el dispositivo externo envía datos con mayor velocidad que la que el receptor es capaz de leer los datos, se puede dar el caso de pérdidas de información: OVERRUN. La solución de este problema se encuentra en el diálogo con el dispositivo externo. Este último sólo manda cuando el primero está disponible para recibir el dato. Este diálogo se denomina HANDSHAKE. Una posible solución para el caso del ejemplo anterior sería:
5
BUFFERS TRIESTADO
DATOS DEL DISPOSITIVO DE ENTRADA
LATCH
BUS DE DATOS
D
1
ACTIVADOR DESDE EL DISPOSITIVO DE ENTRADA
Q
puerto1
puerto2
BUSY (LINEA DE OCUPADO)
El emisor dispone de una entrada adicional, BUSY generada por el equipo que recibe los datos. La salida BUSY se obtiene de la salida del biestable D.(BUSY=Q). La lectura del latch por parte del microprocesador local pone a 0 el biestable y la línea BUSY que solicita al emisor un nuevo dato. El ejemplo más común de handshake en una transferencia en paralelo es la comunicación de un ordenador con la impresora, donde BUSY hace las veces de ACK, y el activador, de STROBE
Receptor
Emisor Bus de datos #Strobe #ACK BUS DE DATOS #Strobe #ACK
6
Muchas de las funciones de transferencia de entrada/salida paralelo vienen integradas en chips cuyas funciones pueden ser programadas dinámicamente por el microprocesador en función de las necesidades.
Un mismo componente puede integrar varios latches
integrar funciones de control de la transferencia paralela (protocolos handshake)
programar el modo de funcionamiento de cada uno de los bits de todos los puertos, esto es, si hacen función de entrada o salida.
Ejemplo: Interfaz periférico programable 8255 PA3 PA2 PA1 PA0 /RD /CS GND A1 A0 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 PB0 PB1 PB 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
8255
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
PA4 PA5 PA6 PA7 /WR RESET D0 D1 D2 D3 D4 D5 D6 D7 VCC PB7 PB 6 PB5 PB4 PB 3
Dispone de un bus de datos de 8 bits (D7-0), un bus de direcciones con dos líneas para la selección de los registros internos (A1-0), un bus de control (/CS,RESET,/WR,/RD) y tres puertos bidireccionales de 8 bits cuyas salidas son PA7-0,PB7-0,PC7-0. El microprocesador se conecta con este dispositivo mediante su bus de datos D0-7, el bus de direcciones, cuyas líneas de menor peso, A1,A0 se conectan directemente a las entradas del mismo nombre del 8255, mientras que las restantes líneas de direcciones del microprocesador se utilizan para la decodificación de las direcciones de memoria donde se haya ubicada este chip y que activan la entrada /CS del mismo. Además las líneas de entrada /RD y /WD distinguen si la transferencia se realiza desde al microprocesador al 8255 (escritura) o desde el 8255 al microprocesador (lectura). La línea de RESET inicializa el integrado y se conecta con la señal RESET general que inicializa todo el sistema.
7
Ejemplo de conexión: BUS DE DIRECCIONES A0-A15
Decodificador de direccion A15-2
/CS
A1 A0 /WR /RD
PA7-0 PB 7-0
/WR /RD
PC7-0
8255
BUS DE DATOS MICROPROCESADOR
El microprocesador ve en la memoria un total de cuatro direcciones consecutivas que provocan el acceso al dispositivo. Por ejemplo: si el decodificador de direcciones activa su salida para A152=$1000, entonces para las direcciones A15-0= $1000,$1001, $1002 y $1003, se accede a los registros internos del 8255.
A1 0 0 1 1
A0 0 1 0 1
Registro Puerto A Puerto B Puerto C Registro comando
de
Otro ejemplo: VIA 6522
8
Dispone de un bus de datos de 8 bits (D7-D0), un bus de direcciones con cuatro líneas (RS3-RS0) para seleccionar 16 registros internos, bus de control y dos puertos PA7-0 y PA7-0 entre otras funciones avanzadas. 3.- Dispositivos o puertos de entrada/salida con transferencia en serie La transferencia en paralelo permite una velocidad de transmisión mayor que la serie, por eso se utiliza en sistema que requieren un volumen de intercambio de información importante. La transferencia en paralelo tiene un gran coste (proporcional al número de bits a transmitir y la distancia entre emisor y receptor). Dos factores influyen en el coste:
el valor del enlace el valor de los drivers o circuitos que controlan los niveles de tensión en cada una de las líneas. A mayor longitud de cable, mayor resistencia y capacidad presenta este, por lo que el driver debe ser más potente.
Otro problema de la transferencia paralelo es el skewing, que aumenta cuando las longitudes de los cables son mayores. El skewing se realaciona con las diferencias entre los tiempos de propagación de las distintas señales por sus respectivos cables. A distancias cortas la transferencia paralelo es más ventajosa, pero cuando la distancia aumenta, el incremento en el coste e la instalación se hace tan grande que es razonable plantearse una pérdida de velocidad en beneficio de una bajada en el coste. La transferencia en paralelo se limita a sistemas cerrados en que las distancias no son muy grandes (p.ej.: la interconexión entre los distintos circuitos integrados de una placa) y la transferencia en serie se emplea para sistemas que están relativamente alejados. El interfaz serie es un circuito integrado que realiza transferencias de datos en paralelo con el procesador y las convierte en trasferencias serie con el exterior. El núcleo de un periférico serie es un registro de desplazamiento
9
Toda transferencia de información requiere de sincronización entre el receptor y el transmisor. El receptor de una transferencia en serie debe saber en qué instantes debe generar el desplazamiento del contenido de su registro de recepción para capturar, correctamente, los bits de información. (la clk de ambos periféricos debe ser la misma). Existen dos modalidades de transferencia en serie atendiendo al modo de sincronización:
síncrona asíncrona
En la transferencia seria síncrona el transmisor envía, en una línea adicional a la de datos, la señal de reloj de su registro de desplazamiento. El receptor recupera la señal de esta línea y la utiliza como reloj de su registro de desplazamiento. En esta técnica se requiere dos líneas como mínimo, lo que produce efectos de skewing y coste no deseados. Existen técnicas de comunicación síncrona que permiten eliminar una de las dos línea (autoreloj).
En el método por transferencia en serie asíncrona, el transmisor sólo envía los datos, por tanto la forma en que el receptor se sincroniza es bien diferente. Los sistemas involucrados en una transferencia serie asíncrona tienen que cumplir algunos requisitos para que ésta tenga lugar:
los relojes del transmisor y del receptor deben operar a la misma frecuencia(aunque esto no es posible por la existencia de tolerancias en los componentes). la hilera de bits transmitidos debe incluir alguna información de sincronización además de los bits de los datos (especie de Ready) los bits de sincronización activan el modo de recepción avisando que a partir de ellos se reciben, uno tras otro, los bits de datos Frecuentemente se necesitara intercalar bits de sincronismo entre los bits de los datos para conseguir resincronizar el reloj del receptor.
3.1 Transferencia seria asíncrona La transferencia en serie asíncrona está orientada al carácter. Esto es, cada byte que se deseatransmitir se va a rodear de cierta información que permite su sincronización y la posible detección de errores.
10
Si el transmisor está en reposo, es decir, no tiene nada que transmitir, su salida se mantiene a 1 lógico (MARK). Si el transmisor va a iniciar una transferencia, primero pone su salida a 0,(SPACE) durante el mismo tiempo que la duración de un bit de datos (Tbit). Esto se conoce como el bit de inicio o bit de start. A continuación, se envían de 5 a 8 bits de datos, comenzando por el menos significativo del grupo. Después del último bit del dato, y de manera opcional, se envía un bit de paridad que puede ser par, impar o fija (1 o 0 lógicos). Finalmente se envía un bit de stop cuya duración varía entre 1 y 2 Tbit y que se corresponde con un 1 lógico (MARK). Si el transmisor no tiene un nuevo byte que enviar, este pasa al estado de reposo y, su salida, a 1 lógico. Por contra, si existe un nuevo dato que transmitir, a continuación del bit de stop se envía el bit de start del siguiente byte. El formato asíncrono requiere, como mínimo, de 2 bits adicionales a los de datos para su sincronización y 1 bit opcional, como la paridad, para la detección de errores. Pero, ¿Cómo se sincroniza el receptor?. El receptor continuamente muestrea la entrada en busca de un bit de start. La frecuencia con la que realiza este muestreo es 16 veces superior a la frecuencia de la señal que debe servir como desplazamiento de su registro. O sea, el receptor, en el tiempo de duración de un bit (Tbit), muestrea su entrada 16 veces.
Si comienza la transmisión de un byte. La línea de salida del transmisor pasa de 1 lógico (reposo) a 0 lógico (bit de start) . Cuando el primer tick (o pulso de reloj) de muestreo del receptor detecta esta transición en su entrada, se activa un contador cuya misión consiste en esperar 8 ciclos de reloj o ticks. Transcurridos estos ciclos, el receptor vuelve a muestrear la entrada ( aproximadamente esto coincide con el punto medio del bit de start ). Si esta es 1, el receptor se reinicializa buscando una nueva transición de bajada ( asume que se ha recibido un falso bit de start ). Si la entrada es un 0, el receptor da como válida la llegada de un bit de start. Si se detecta un bit de start válido, se activa el mecanismo de sincronización, gracias a la habilitación de un contador módulo 16 por el que se obtiene, a partir de la señal de muestreo, el reloj de desplazamiento del registro de recepción.
11
Reposo LS B
Bit de Start
1º
8º
1º
16º
Entonces, ¿Para qué un bit de stop?. El bit de stop interviene en la función sincronizadora en el sentido de que permite asegurar una transición de MARK (bit de stop del carácter anterior) a SPACE (bit de start del carácter actual) cuando se transmiten datos de forma continuada. Un receptor asíncrono dispone, además de un registro de desplazamiento, un registro intermedio (RHR) del tipo paralelo-paralelo que hace de interfaz entre el registro de desplazamiento y el bus de datos del microprocesador. Esto hace que no sea tan crítico el momento del lectura del byte recibido. Registro de Desplazamiento RxD
Flag Registro de Mantenimiento
RHR
Al computador
Gracias al RHR el procesador tiene un tiempo igual al de duración de la recepción de un nuevo byte para leer este registro antes de que su contenido se pierda por la sobreescritura. En algunos receptores este registro, denominado registro de mantenimiento de recepción (RHR - Receiver Holding Register o simplemente registro de recepción, RR - Receiver Register -), es sustituido por una cola o FIFO. Asociado al registro de recepción existe un banderín o flag que se activa cada vez que el registro de desplazamiento transfiere un dato nuevo hacia el registro de recepción. También podemos encontrar un flag de Overrun o de sobreescritura. Todos los receptores asíncronos tienen una circuitería adicional que muestrea y chequea el bit de stop. Si este no es 1, se dice que existe un error de trama o Framming error que es recogido por un flag del mismo nombre. 12
Los transmisores asíncronos también son implementados mediante un registro de desplazamiento. Un circuito simplificado se muestra a continuación.
El procesador carga en paralelo el carácter a transmitir dentro de este registro gracias a la activación de la línea "Carga". Durante este proceso la posición menos significativa y la más significativa del registro, se escriben con 0 y 1 respectivamente ( bit de start y bit de stop ). Finalizado el proceso de carga ( desactivación de la línea "Carga" y habilitación del reloj ) se inicia el de desplazamiento, gracias al cual primero sale el bit de start, después los bits del dato y por último el bit de stop, atravesando, todos ellos, un biestable llamado Línea. Este biestable está conectado a la línea de comunicaciones e, inicialmente, se encuentra a 1 lógico. Después de transmitir todos los bits del formato asíncrono, el biestable mantiene el bit de stop, de esta forma se asegura que la salida se mantiene a 1 antes de que se inicie la transmisión de un nuevo dato. Asimismo, se dispone de un flag asociado con el registro de desplazamiento que informa si este se encuentra vacío y, por tanto, disponible para aceptar un nuevo dato. Para una transmisión lo más eficiente posible en el sentido de aprovechamiento del canal, o sea, que este se encuentre desocupado el menor tiempo posible, se realiza un doble "buffering" en los transmisores.
13
El procesador no accede directamente al registro de desplazamiento. Carga el byte que quiere enviar en un registro de mantenimiento (THR - Transmitter Holding Register - o TR - Transmitter Register -) el cual transfiere automáticamene su contenido al de desplazamiento cuando este se encuentra vacío. Asociado al registro de transmisión, también existe un flag que avisa de cuándo este está disponible para aceptar un nuevo dato. 3.1.1 UART Un dispositivo que permite la transmisión y recepción serie de información en modo asíncrono se denomina con las siglas UART - Universal Asynchronous Receiver Transmiter- Transmisor Receptor Asíncrono Universal.
Externamente la UART dispone de líneas de conexión con el microprocesador además de las propias de transmisión y recepción. Estas son: - bus de datos 14
-
líneas de direcciones, líneas de control y sincronismo
El bloque transmisor se compone de: - un decodificador de formato de datos que en función del número de bits de datos (5-8), número de bits de stop (1-2) y el byte a transmitir, forma la SDU (unidad de datos serie) que se cargará en el registro de desplazamiento del transmisor TSR (Transmitter Shift Register) para su transmisión. La SDU contiene el bit de start, los bits de datos, paridad y bits de stop. - Registro de mantenimiento de transmisión, THR - Registro de desplazamiento de transmisión TSR - Flag de THRE ( Transmisor Holding Register Empty o buffer de transmisión vacío) que se encuentra en un registro llamado Registro de estado de serialización, SR ( Status Register ). Este flag se desactiva cuando el microprocesador escribe un dato en el THR. - Flag de TSRE ( Transmitter Shift Register Empty o registro de desplazamiento vacío), que se activa cuando el registro TSR se ha quedado vacío y que se encuentra en el registro SR.
BLOQUE DE TRANSMISION El bloque de recepción consta de: - registro de desplazamiento de recepción RSR (Receiver Shift Register ), que almacena los bits de la SDU que se esperan recibir en función de los parámetros configurados de datos, stop y paridad - registro de mantenimiento de recepción, RHR ( Receiver Holding Register ), - Flag RxRDY que se encuentra en el registro SR que y que se activa en cada transferencia del RSR al RHR Cuando el registro RHR es leído, el flag RxRDY se desactiva automáticamente. - En paralelo con la carga del nuevo dato en el registro RHR y la activación de RxRDY, se actualizan unos bits que informan sobre los posibles errores ocurridos en la recepción. Estos 15
bits son: overrun, framming error y parity error.
BLOQUE DE RECEPCIÓN El generador de baudios programable genera la temporización necesaria para los bloques transmisor y receptor. La frecuencia de la señal de reloj generada es 16 veces mayor que la velocidad con la se desea transmitir y recibir los bits por el interfaz serie. Esta constituido por: -
-
un contador cuya señal de reloj es la que recibe la UART un registro que almacena un determinado número depositado por el microprocesador un comparador cuya misión es determinar si el contenido del registro es igual o menor que el valor de cuenta del contador. Si obtenemos un igual como resultado de la comparación, se activa la puesta a cero del contador y se genera un pulso de salida que es utilizado como señal de referencia para el bloque de transmisión y de recepción. Dentro de cada bloque, a su vez, existe un contador módulo 16 cuya salida actúa de reloj de los registros de desplazamiento. De esta forma la señal clk_tx_rx genera los 16 ticks o pulsos de reloj por bit necesarios por el circuito de sincronización del bloque receptor.
16
Tbit = 16* Tclk*[registro] Vbps= Fclk/(16*[registro])
GENERADOR DE BAUDIOS La lógica de interrupciones permite activar su línea INTRPT si suceden los siguientes eventos -
la llegada de un nuevo dato el registro de transmisión se ha quedado vacío se ha producido un error cambio de estado en las líneas del modem, etc.
3.2 Transferencia serie síncrona En este tipo de transferencia, además de los bits de datos se requiere el envío de la señal de reloj. La técnica más fácil es la que implementan muchos microcontroladores en el denominado interfaz SPI (Serial peripheral interface).
En el interfaz SPI existen dos dispositivos: el AMO, que genera la señal de reloj para la comunicación serie síncrona y el ESCLAVO. Los registros de desplazamiento del amo y del esclavo se configuran a modo de registro circular, por lo que se puede realizar una transmisión full-duplex siempre que los dos dispositivos tengan información que enviar simultáneamente. La señal de reloj generada por el AMO sólo está activa el tiempo necesario para la transmisión de todos los bits del registro de desplazamiento. En el interfaz SPI el registro de desplazamiento no es accesible directamente por la CPU, sino que se 17
accede a través de un registro de mantenimiento. Obsérvese que a diferencia de la UART, el mismo registro de desplazamiento se utiliza tanto para transmisión como recepción. Lo mismo ocurre con el registro de mantenimiento que es accedido por la CPU. Además de los registros anteriores, existen otros registros, dentro del interfaz, que permiten la programación del modo de funcionamiento del mismo. -
-
Registro de control SPI (SPICR): Dispone de un conjunto de bits que permiten enmascarar o habilitar las interrupciones, selección del orden de transmisión/recepción de bits (primero el LSB o primero el MSB, después los demás), la frecuencia de reloj, la polaridad del mismo, si el dispositivo actúa como amo o esclavo, etc. Registro de estado SPI(SPISR).Da información sobre el estado del interfaz, esto es, si el flag de petición de interrupción está activo o no, si se ha producido overrun, etc.
Existen otros dispositivos algo más complejos, que al estilo de la UART, disponen de dos canales diferentes para transmisión y recepción y en el que no existe un amo que cuenta los pulsos de reloj necesarios para transmitir todos los bits del dato. Para estos dispositivos se plantea el problema de saber cuándo empieza el primer bit de un carácter. En general, la estructura de estos dispositivos es similar a las de la UART, e incorporan un mecanismo de identificación de un carácter de sincronismo SYN. Este carácter de sincronismo se envía al principio de cada transmisión serie, antes de cualquier octeto de datos. El receptor está escuchando la entrada en cada ciclo de reloj, y compara el contenido del registro de desplazamiento con el carácter de SYN. Cuando se detecte la recepción de un carácter SYN, el receptor sabe que el siguiente bit que se reciba se corresponde con el primero del octeto de datos, por lo que ensambla de 8 en 8 los bits que va recibiendo para formar el carácter que deposita en el registro buffer de recepción. Este proceso continua hasta que el procesador indique al dispositivo que ya ha terminado la recepción de caracteres o/y que el dispositivo debe estar atento para la detección de otro carácter de sincronismo. Estos dispositivos tienen una estructura similar a las UART, de hecho existen integrados que mezclan tanto la función síncrona como la asíncrona (8251).
18
Registro de modo SYN
BUS DE DATOS
Registro de control RSR
RxD
RHR THR
TSR
Registro de estado
TxD
RxC TxC
clk
La parte emisora y la parte receptora tienen entradas de reloj diferentes (RxC y TxC) y disponen de dos registros de desplazamiento. Estos últimos, no son accesibles por la CPU directamente, sino a través de los registros de mantenimiento THR,RHR. Existe un registro de SYN que permite seleccionar el tipo de carácter que se emplea para la sincronización de las USRT. Cuando se habilita el transmisor síncrono, el carácter SYN se envía en primer lugar, de forma automática, antes de que se envíe el primer dato. Cuando se habilita el receptor de la USRT, este comienza automáticamente en la fase de detección del carácter SYN, tras el que se comienza el proceso de ensamblado del octeto entrante y transferencia hacia el RHR para su posterior lectura de la CPU. En muchos sistemas se utiliza un segundo registro de SYN que asegura una mayor eficacia en la detección del inicio de la trama. La configuración del modo de funcionamiento de la USRT se especifica en los registros de control y modo. En ellos se puede configurar el número de bits de datos que contiene cada octeto (5,6,7,8) si estos tienen paridad ( y en caso afirmativo, el tipo de paridad), el número de caracteres de sincronismo que se utilizan, la habilitación o inhabilitación del bloque de recepción o de transmisión, configuración del modo búsqueda, etc. El registro de estado contiene información del estado interno del dispositivo, esto es, si es buffer de transmisión está vacío, si el buffer de recepción está lleno, error de overrun, de paridad, etc.
19