Voltar ao Noções Básicas O Receptor/Transmissor Assíncrono Universal (UART)
Este resumo técnico explica alguns detalhes de baixo nível da interface de comunicação ubiquitous-UART generalizada.
Informação Relacionada
- Transmissão de Dados Conveniente e Robusta com RS-422 e RS-485
Existem provavelmente poucos entre os engenheiros eléctricos e entusiastas da electrónica do mundo que não tenham interagido de alguma forma com uma interface receptor/transmissor assíncrono universal (UART). Num mundo onde a tecnologia pode tornar-se obsoleta muito rapidamente, temos de dar crédito a quem criou este simples esquema de comunicação digital, que existe há décadas e ainda goza de imensa popularidade.
Nota: O termo “UART” é bastante vago. Vários aspectos da interface – número de bits de dados, número de bits de paragem, níveis lógicos, paridade – podem ser adaptados às necessidades do sistema. Neste artigo, centrar-me-ei nas implementações UART que são normalmente encontradas em aplicações modernas de microcontroladores.
Capacidades e Características
Como provavelmente sabe, um sistema UART básico fornece uma comunicação robusta, de velocidade moderada, full-duplex com apenas três sinais: Tx (dados em série transmitidos), Rx (dados em série recebidos), e terra. Em contraste com outros protocolos como o SPI e I2C, não é necessário qualquer sinal de relógio porque o utilizador dá ao hardware UART a informação de cronometragem necessária.
Atualmente, existe um sinal de relógio, mas não é transmitido de um dispositivo de comunicação para o outro; em vez disso, tanto o receptor como o transmissor têm sinais de relógio internos que governam a forma como os níveis lógicos variáveis são gerados (no lado Tx) e interpretados (no lado Rx). Sem surpresas, a comunicação UART não funciona se o transmissor e o receptor tiverem sido configurados para diferentes frequências de transmissão de dados. Além disso, os sinais do relógio interno devem ser 1) suficientemente precisos em relação à frequência esperada e 2) suficientemente estáveis ao longo do tempo e da temperatura.
Key Terms
Levemos rever alguma terminologia e, no processo, vamos cobrir mais características UART:
- Start bit: O primeiro bit de uma transmissão UART de um byte. Indica que a linha de dados está a deixar o seu estado de inactividade. O estado de ociosidade é tipicamente lógico alto, por isso o bit inicial é lógico baixo.
- O bit inicial é um bit aéreo; isto significa que facilita a comunicação entre o receptor e o transmissor mas não transfere dados significativos.
- Bit de paragem: O último bit de uma transmissão UART de um byte. O seu nível lógico é o mesmo que o estado de inactividade do sinal, ou seja, o nível lógico elevado. Este é outro bit aéreo.
- Baud rate: A taxa aproximada (em bits por segundo, ou bps) a que os dados podem ser transferidos. Uma definição mais precisa é a frequência (em bps) correspondente ao tempo (em segundos) necessário para transmitir um bit de dados digitais. Por exemplo, com um sistema 9600-baud, um bit requer 1/(9600 bps) ≈ 104,2 µs. O sistema não pode de facto transferir 9600 bits de dados significativos por segundo porque é necessário tempo adicional para os bits aéreos e talvez para atrasos entre transmissões de um byte.
- Bit de paridade: Um bit de detecção de erro adicionado ao fim do byte. Existem dois tipos – “paridade ímpar” significa que o bit de paridade será logicamente elevado se o byte de dados contiver um número par de bits lógico-elevados, e “paridade uniforme” significa que o bit de paridade será logicamente elevado se o byte de dados contiver um número ímpar de bits lógico-elevados. Isto pode parecer contra-intuitivo, mas a ideia é que o bit de paridade assegura que o número de bits lógico-elevados seja sempre par (para paridade par) ou ímpar (para paridade ímpar). Assim, se estiver a usar paridade uniforme e o byte tiver três bits lógico-elevados, o bit de paridade será lógico-elevado, de modo a que o número total de bits lógico-elevados nos dados transmitidos (ou seja o byte em si mais o bit de paridade) é uniforme.
- Ao forçar o número de bits lógico-elevados a ser sempre uniforme (para paridade uniforme) ou ímpar (para paridade ímpar), o bit de paridade fornece um mecanismo grosseiro de detecção de erros – se um bit for invertido algures no processo de transmissão, o número de bits lógico-elevados não corresponderá ao modo de paridade escolhido. Naturalmente, a estratégia decompõe-se se dois bits forem invertidos, pelo que o bit de paridade está longe de ser à prova de bala. Se tiver uma necessidade séria de comunicação sem erros, recomendo um CRC.
Sincronização e Amostragem
Dados digitais padrão não fazem sentido sem um mecanismo de relógio de algum tipo. O diagrama seguinte mostra porque:
Um sinal de dados típico é simplesmente uma tensão que faz a transição entre a lógica baixa e a lógica alta. O receptor só pode converter correctamente estes estados lógicos em dados digitais se souber quando deve fazer a amostragem do sinal. Isto pode ser facilmente realizado utilizando um sinal de relógio separado – por exemplo, o transmissor actualiza o sinal de dados em cada borda ascendente do relógio, e depois o receptor recolhe amostras dos dados em cada borda descendente.
No entanto, como implícito pelo nome “receptor/transmissor assíncrono universal”, a interface UART não utiliza um sinal de relógio para sincronizar os dispositivos Tx e Rx. Assim, como é que o receptor sabe quando deve ser feita uma amostragem do sinal de dados do transmissor?
O transmissor gera um fluxo de bits baseado no seu sinal de relógio, e depois o objectivo do receptor é utilizar o seu sinal de relógio interno para fazer uma amostragem dos dados recebidos no meio de cada período de bits. A amostragem no meio do período de bits não é essencial, mas é óptima, porque a amostragem mais próxima do início ou fim do período de bits torna o sistema menos robusto contra as diferenças de frequência de relógio entre o receptor e o transmissor.
A sequência do receptor começa com a borda descendente do bit inicial. Isto é quando ocorre o processo de sincronização crítico. O relógio interno do receptor é completamente independente do relógio interno do transmissor – por outras palavras, esta primeira borda descendente pode corresponder a qualquer ponto do ciclo do relógio do receptor:
Para assegurar que uma borda activa do relógio receptor possa ocorrer perto do meio do período de bits, a frequência do relógio de taxa de transmissão enviada para o módulo receptor é muito mais elevada (por um factor de 8 ou 16 ou mesmo 32) do que a taxa de transmissão real.
Vamos dizer que um período de um bit corresponde a 16 ciclos de relógio do receptor. Neste caso, a sincronização e a amostragem podem proceder da seguinte forma:
- O processo de recepção é iniciado pela borda descendente do bit inicial.
- O receptor espera por 8 ciclos de relógio, a fim de estabelecer um ponto de amostragem que esteja próximo do meio do período de bit.
- O receptor espera então 16 ciclos de relógio, o que o leva ao meio do primeiro período de bits de dados.
- O primeiro bit de dados é amostrado e armazenado no registo de recepção, e depois o módulo aguarda outros 16 ciclos de relógio antes de amostrar o segundo bit de dados.
- Este processo repete-se até que todos os bits de dados tenham sido amostrados e armazenados, e depois a borda ascendente do bit de paragem devolve a interface UART ao seu estado de inactividade.
Conclusion
Este artigo cobriu alguns detalhes sobre um protocolo de comunicação que talvez tenha usado com sucesso muitas vezes. É bastante possível implementar uma interface UART sabendo muito pouco sobre o comportamento real dos sinais e do hardware, mas um pouco de conhecimento extra – para além da edificação geral que tal conhecimento proporciona – pode ser útil quando a sua comunicação UART não está a funcionar como esperado.