Laboratório de Sistemas Processadores e Periféricos Porta Serial Prática 14 Gustavo G. Parma Assunto: Interface Serial Objetivos: O aluno deverá ser capaz de utilizar e conhecer os fundamentos da porta serial do microcomputador 1 Introdução Teórica O computador pode se comunicar paralelamente ou serialmente com os periféricos. A classificação entre serial ou paralelo é feita em função da forma como os bits de dados são transmitidos. Se os dados são transmitidos de uma única vez, ou em grupos, a comunicação é paralela. Se os dados são transmitidos um após o outro, a comunicação é serial. A porta paralela do computador foi desenvolvida devido a então baixa velocidade de transmissão da porta serial. Entretanto, observa-se hoje que a taxa de transmissão de dados seriais tem aumentado cada vez mais, alcançando patamares acima de 56 Kbps (bits por segundo). É importante ressaltar que uma comunicação serial envolve não somente os bits de dados, mas também bits de sinalização (start bit, stop bit, bit de paridade, e outros). Desta forma, uma comunicação de 56Kbps não significa que são transmitidos 56K bytes/s. 8 A comunicação serial do computar é feita através da UART (Universal Asynchorouns Receiver Trasmitter) 8250, a qual está conectada com uma RS232, que, por sua vez, é a responsável por conectar eletricamente o computador ao periférico. A conexão serial envolve alguns parâmetros que devem ser configurados antes de se haver a comunicação propriamente dita. São estes os principais parâmetros a serem configurados: 1. (a) velocidade de comunicação; (b) stop bits; (c) tamanho da palavra a ser transmitida; (d) paridade. Portanto, antes de se utilizar o 8250, deve-se configurá-lo corretamente. Por configurar a porta serial, entende-se configurar tanto o emissor quanto o receptor. Por se tratar de uma comunicação assíncrona, não existe um sinal de clock responsável pelo sincronismo entre emissor e receptor. Se o emissor estiver configurado de forma diferente do receptor, um erro do tipo framing será gerado pelo controlador. Antes de se transmitir um dado, deve-se, também, verificar se o 8250 está pronto para transmití-lo, ou se o controlador ainda está transmitindo um dado anterior. Quando a porta serial recebe algum dado, a UART pode informar à CPU que este dado foi recebido através do sistema de interrupção (IRQ3 para COM2 ou IRQ4 para COM1) ou através de um dos seus bits de status. Se o processador não retirar este dado do controlador e ele receber um novo dado, um erro do tipo overrun será gerado. A RS232, utilizada para conectar a UART ao mundo externo, pode ser utilizada apenas quando a distância entre o processador e o periférico for pequena. Caso contrário, deve ser utilizado um modem. A RS232 utiliza duas linhas, não balanceadas, para a comunicação, uma para a transmissão de dados
e outra para a recepção (a comunicação utilizando a RS485 utiliza linhas balanceadas). Para operar um modem, definiu-se uma norma mundial, chamada V24, na qual os pinos de controle necessários ao acionamento do modem são definidos. A RS232 pode estar disponível no computador através de dois conectores distintos, um DB9 ou um DB25. A tabela abaixo mostra as conexões dos pinos dos conectores com os sinais de controle da RS232. DB9 DB25 Nome Descrição - 1 GND Terra de proteção 3 2 TX Transmissão de dados 2 3 RX Recepção de dados 7 4 RTS Permissão para transmitir 8 5 CTS Permissão para transmissão concedida 6 6 DSR Modem pronto 5 7 GND Terra do sinal 1 8 DCD Portadora de dados detectada 4 20 DTR Terminal pronto 9 22 RI Indicador de chamada Pode-se utilizar as funções da bios (semelhante as funções do DOS) para o controle da UART. Entretanto, pode ser realizada uma configuração do UART utilizando diretamente os endereços dos doze registradores internos do controlador 8250, o qual está instalado no endereço base 03F 8h, para a COM1, (ou 02F 8h, para a COM2) e utiliza 8 endereços fisicos na arquitetura do computador pessoal, como mostra a tabela abaixo: Endereço base DLAB Acesso Abrev. Nome do Registrador +0 0 write THR Transmitter Holding Register +0 0 read RDR Receiver Data Register +0 1 r/w BDL Baud-Rate Divisor (Low) +1 1 r/w BDH Baud-Rate Divisor (high) +1 0 r/w IER Interrupt-Enable Register +2 - read IIR Interrupt-Identification +2 - write FCR Fifo Control Register +3 - r/w LCR Line-Control register +4 - r/w MCR Modem-control register +5 - read LSR Line-Status Register +6 - read MSR Modem-status Register +7 - r/w SR Scratch Pad Register Na tabela acima, DLAB se refere ao estado do bit 7 do registrador LCR. Os registradores mencionados são discriminados a seguir. 1. THR Registrador de escrita. Este é o registrador de envio de dados. Um dado escrito neste registrador será serializado e enviado pela RS232. 2. RDR Registrador de leitura. Este é o registrador de chegada de dados. Uma vez que a RS232 tenha recebido um dado e a UART tenha paralelizado-o adequadamente, ele estará disponível neste endereço. 3. BDL e BDH Registrador de leitura e escrita. Estes dois registradores serão responsáveis por determinar a taxa de transmissão (baud-rate) da conexão. Para acessar estes registradores é necessário que o DLAB (bit 7 de LCR) seja igual a 1. 2
O baud rate é determinado em função de uma palavra de 16 bits, sendo determinado através da seguinte equação: baud-rate = 115200. BDL se refere aos 8 bits menos significativos do divisor divisor e BDH se refere aos 8 bits mais significativos do divisor. Em função da equação mostrada, pode-se determinar as seguintes tabelas dos valores a serem escritos em BDL e BDH para um determinado baud-rate. Velocidade Parte alta (BDH) Parte baixa (BDL) 50 09h 00h 75 06h 00h 150 03h 00h 300 01h 80h 600 00h C0h 1200 00h 60h 2400 00h 30h 4800 00h 18h 9600 00h 0Ch 19200 00h 06h 38400 00h 03h 57600 00h 02h 115200 00h 01h 4. IER Registrador de leitura e escrita. Permite controlar quando e como a UART irá gerar alguma interrução. A tabela a seguir mostra o significado de cada bit deste registrador. Escrevendo 1 no bit, habilita-se a sua função, 0 desabilita a função. Os bits reservados devem ser mantidos em 0. Bit Significado 7 reservado 6 reservado 5 modo de baixa potência (somente para o CI 16750) 4 modo sleep (somente para o CI 16750) 3 interrupções de status do modem 2 interrupção de status da linha de recepção 1 interrupção de THR vazio 0 interrupção de RDR com dados A interrupção de RDR com dados talez seja a mais importante, pois mostra que existe um dado disponível na UART, o qual deve ser lido o quando antes para se evitar um erro de overrun. A interrupção de THR vazio sinaliza que o buffer de saída terminou de enviar tudo o que havia sido colocado nele. A interrupção de status da linha de recepção indica que algmia coisa no registrador LSR foi alterada. Geralmente sinaliza uma codição de erro. A interrupção de status do modem sinaliza quandl alguma coisa no modem externo conectado ao computador mudar, tal como o telefone tocando, uma conexão com sucesso ao outro modem ou uma desconexão. 5. IIR Registrador de Leitura. Utilizado para identificar as características funcionais da UART utilizada. Pode ser utilizado para identificar o motivo pelo qual a UART disparou uma interrupção ou para a identificação da UART. A tabela a seguir explica o significado de cada bit deste registrador. 3
Bit valor Significado 7 e 6 00 CI sem FIFO 01 FIFO existente mas não funcionando 10 condição reservada 11 FIFO habilitada 5 1 FIFO de 64 bytes habilitada (somente para o 16750) 4 - reservado 3, 2 e 1 000 Interrupção de status do modem 001 interrupção de THR vazio 010 interrupção de RDR com dados 011 interrupção de status da linha de recepção 100 reservado 101 reservado 110 FIFO time-out 111 reservado 0 1 não existência de interrupção pendente Uma vez detectada o motivo pelo qual a UART gerou a interrupção, é necessário eliminá-la, o que pode ser realizado utilizando-se a operação descrita na tabela abaixo. Motivo da interrução Interrupção de status do modem interrupção de THR vazio interrupção de RDR com dados interrupção de status da linha de recepção FIFO time-out 6. FCR Registrador de escrita. método de reset da interrupção ler MSR ler IIR ou escrever em THR ler RDR Ler LSR ler RDR Este registrador foi introduzido após o lançamento da UART 8250 original. Ele é utilizado para controlar como os buffers FIFO irão funcionar, sendo possível, também, ligar ou desligar o FIFO. A tabela abaixo explica o significado de cada bit deste registrador. Bit Significado Valor Nível do trigger (16 bytes) Nível do Trigger (64 bytes) 7 e 6 00 1 bytes 1 byte 01 4 bytes 16 bytes 10 8 bytes 32 bytes 11 14 bytes 56 bytes 5 Habilita a FIFO de 64 bytes (somente para o 16750) 4 reservado 3 Seleção de modo de DMA 2 Limpa a FIFO de transmissão 1 Limpa a FIFO de recepção 0 Habilita as FIFOS Escrever um 0 no bit 0 desabilita as FIFOs e a UART passa a funcionar como o 8250 original, fazendo com que os demais bits deste registrador percam suas funções. Os bits 1 e 2 são utilizados para zerar os buffers das FIFOs. Eles devem ser zerados no início de uma aplicação, para garantir que não exista nenhum dado restante de outra aplicação. Estes bits são automaticamente resetados, ou seja, após escrever 1 neles, não é necessário escrever 0. O bit 3 controla a forma pela qual o DMA irá acontecer e, do ponto de vista do programador não possui grande utilidade, podendo ser ignorado. O bit 5 permite que o CI 16750 expanda os buffers de 16 bytes para 64 bytes, controlando não apenas o tamanho do buffer mas também o tamanho do nível do trigger utilizado para gerar 4
uma interrução. Em CIs anteriores ao 16750 este bit é reservado e deve ser mantido em nível lógico 0. Os bits 6 e 7 descrevem o tamanho do nível de trigger utilizado para gerar uma interrução. Este é o número de caracters que deve ser armazanado na FIFO antes que uma interrupção seja gerada, avisando que o dado deve ser removido da FIFO. 7. LCR Registrador de escrita e leitura. Este é um dos principais registradores da UART. Ele é utilizado para setar o DLAB (Divisor Latch Access Bit), permitindo escrever nos registradores que controlam o baud-rate, e é utilizado para definir o quadro da comunicação (o protocolo que será utilizado). A tablea a seguir explica o significado de cada bit deste registrador. Bit Significado 7 DLAB, acesso ao divisor da baud-rate 6 habilita sinal Break valor seleção da paridade xx0 sem paridade 3, 4, 5 001 paridade ímpar 011 paridade par 101 marca (sempre 1) 111 espaço (sempre 0) valor quantidade de stop bits 2 0 um stop bit 1 1,5 stop bits ou 2 stop bits valor tamanho da palavra a ser transmitida 00 5 bits 0, 1 01 6 bits 10 7 bits 11 8 bits Os bits 0 e 1 controlam quantos bits de cada palavra de dados são enviados serialmente. O bit 2 controla quantos stop bits são transmitidos, caso sejam enviados 5 bits da palavra de dados, são enviados 1 ou 1,5 stop bits, caso contrário são enviados sempre 1 ou 2 stop bits. Os bits 3, 4 e 5 controlam como a paridade será criada. Quando o bit 5 valer 0, não será enviado o bit de paridade. Caso seja selecionada a paridade par ou ímpar, será adicionado um bit de tal forma que a quantidade de 1s transmitida seja par ou ímpar, respectivamente. Caso a paridade marca seja selecionada, o bit de paridade valerá sempre 1, independente da quantidade de 1s transmitida. Se a paridade espaço for selecionada, o bit de paridade valerá sempre 0. 8. MCR Registrador de escrita e leitura Este registrador permite fazer um controle de fluxo do hardware. Ele permite a manipulação direta de quatro pinos diferentes da UART (nem todos conectados ao DB-9 de saída do PC). É importante salientar que a maioria das UARTs requer que a saída auxiliar 2 seja colocada em nível lógico 1 para habilitar as interrupções. A tabela a seguir apresenta o significado de cada bit deste regitrador. Bit Significado 7 reservado 6 reservado 5 controle automático de fluxo habilitado (16750) 4 Modo de retorno 3 saída auxiliar 2 2 saída auxiliar 1 1 requisição para envio (RTS) 0 Terminal de dados pronto (DTR) 5
Destas saída em um PC, somente os sinais RTS e DTR são conectados à saída do conector DB-9. O modo de retorno é utilizado para testar a UART, verificando se os circuitos estão funcionando bem entre a CPU e a UART. Quando colocado em nível 1, qualquer caracter que chega ao registrador de envio será imediatamente encontrado no registrador de recebimento da UART. Os sinais RTS e DTS serão obtidos no resitrador de estatus do modem. Caso o CI utilizado seja o 16750, o bit 5 possibilita que a UART controle diretamente o estado de RTS e DTS, dependendo do estado atual da FIFO. Caso o CI utilizado não seja o 16750, este bit deve ser mantido em 0. 9. LSR Registrador de Leitura. Informa sobre possíveis condições de erros baseadas no dado que foi recebido. A tabela abaixo explica o significado de cada bit deste registrador. Bit Significado 7 erro na FIFO de recepção 6 serializador de bits vazio 5 buffer de transmissão vazio 4 sinal de break recebido 3 erro de framing 2 erro de paridade 1 erro de overrun 0 dado pronto O bit 7 se refere a erros que estão nos caracteres da FIFO. Se qualquer caractere que está na FIFOpossui um ou mais erros listados, este bit serve para lembrar que a FIFO precisa ser limpa que os dados não são confiávies e que possuem um ou mais erros. Os bits 5 e 6 se referem à condição dos circuitos de transmissão do caractere e auxiliam a identificar que a UART está pronta para receber outro caractere. O bit 6 é colocado em nível lógico 1 se todos oas caracteres tiverem sido transmitidos (incluindo a FIFO, se ativa). O bit 5 informa que a UART é capaz de receber mais caracteres (não necessariamente que os caracteres anteriormentes já foram transmitidos). O bit 4 recebe nível lógico 1 quando a linha de entrada de dados serial não tiver recebidno nenhum novo bit no período de tempo que for no mínimo igual a toda a palavra da dados serial, inclindo start bit, bits de dados, bit de paridade e stop bits (para um dado baud-rate). Um erro de framing ocorre quando o stop bit recebido é igual a nível lógico 0. Um erro de paridade ocorre quando a paridade do dado recebido não confere com o bit de paridade transmitido. Um erro de overrun é um sinal de que existem problemas no software que lida com a porta serial, ou que o sistema operacional não está fornecendo acesso adequado a UART. Este erro ocorre quando um caractere recebido está esperando para ser lido mas o registrador de deslocamento de entrada está tentando mover o conteúdo do novo caractere recebido para RDR. 10. MSR Registrador de Leitura. Possui informações sobre o estatus atual do modem. O modem acessado desta forma pode ser um modem externo ou um modem interno que utiliza a UART como interface com o computador. A tabela a seguir explica o significado de cada bit deste registrador. 6
Bit Significado 7 Portadora detectada 6 Indicador de chamada 5 Conjunto de dados pronto 4 pronto para enviar 3 variacão da portadora de dados 2 variação no indicador de chamada 1 variação no conjunto de dados pronto 0 variação no pronto para enviar O bit 7 permanecerá em 1 enquanto o modem estiver conectado a outro modem. O bit indicador de chamada (bit 6) é conectado diretamente ao pino RI (ring indicator) da RS-232. Este bit assume 1 quando é identificada uma chamada telefônica. Os bits 5 (conjunto de dados pronto -DSR) e 4 (pronto para enviar - CTS) são encontrados na RS-232 e conectados aos sinais RTS e DTR, transmitidos pelo MCR. OS demais bits que indicam variação (bits 3, 2, 1 e 0) serão iguais a 1 se o bit associado a eles tiver sofrido alguma alteração de estado desde a última vez que este registrador foi acessado. A única diferença está no bit 2 (variação no indicador de chamada), o qual será 1 se o bit indicador de chamada for do nível lógico 1 para nel lógico 0. 11. SR Registrador de leitura e escrita. Não possui função definida, podendo ser utilizado como memória extra. Normalmente um byte escrito neste registrador pode ser acessado posteriormente. 1.1 Breve resumo Para a correta inicialização da UART, os seguintes passos devem ser seguidos: 1. Determinar, previamente, quais serão os parâmetros da comunicação: (a) baud-rate (b) quantidade de bits de dados (c) quantidade de stop bits (d) tipo de paridade 2. Deve-se programar adequadamente o baud-rate da transmissão, observando, para isso, o valor de DLAB para o correto acesso a BDL e BDH. 3. Configurar o registrador FCR adequadamente, aproveitando para limpar as FIFOs. 4. Configurar o registrador LCR adequadamente, considerando os parâmetros da comunicação 5. Configurar IER adequadamente, habilitando ou desabilitando as possíveis fontes de geração de interrupção. 6. Se necessário, configurar MCR (principalmente o bit 3, caso seja optado por trabalhar com interrupção). Após estas configurações, a UART estará pronta para enviar ou receber dados. Antes do envio de um determinado dado, é importante verificar no registrador LSR, principalmente os bits 6 e 5. O envio ocorre escrevendo o dado em THR e, quando um dado for recebido, ele será disponibilizado em RDR. Pode-se, também, configurar a UART utilizando uma das funções da BIOS (basic Input output System). Ao contrário das funções do DOS, as quais estão todas concentradas na INT21h, as funções da BIOS são chamadas em função da interrupção. A interrupção responsável pelo gerenciamento das portas de comunicação serial é a INT14h (RS232 IO). 7
Figura 1: Algoritmo a ser implementado. 2 Parte Experimental : Desenvolver um programa que possibilite ao usuário programar (velocidade e quantidade de stop bits) e enviar continuamente um dado pela porta serial. O dado enviado será visto pelo osciloscópio. O usuário poderá configurar a porta serial para trabalhar com uma dentre três velocidades (1200, 2400 ou 4800 bps) e optar por enviar um ou dois stop bits. As demais configurações deverão ser mantidas sempre constantes: oito bits de dados e paridade do tipo marca. Estas configurações serão realizadas uma única vez, no começo do programa. Após a configuração o programa deverá solicitar do usuário um caractere e entrará, então, em um loop enviando sempre este mesmo caractere. Caso o usuário digite um novo caractere (sem que seja solicitado), o novo caractere deverá ser enviado. Somente quando a tecla ESC for pressionada o programa deverá ser finalizado. A figura 1 mostra o algoritmo a ser implementado. 3 Bibliografia 1. <http://en.wikibooks.org/wiki/serial Programming:8250 UART Programming>. Acessado em 03 de agosto de 2006. 2. <http://interface.centraltreasure.com/files/pdf/serial Port RS232 UART Programming pdf.pdf>. Acessado em 03 de agosto de 2006. 3. <http://www.mrl.nott.ac.uk/ cmg/srp/linux/serial.html>. Acessado em 03 de agosto de 2006. 8