Na comunicação serial os dados são enviados bit-a-bit através de um ou mais sinais digitais. A comunicação serial pode ser usada tanto para comunicação entre equipamentos como para a comunicação entre componentes de um circuito. Existem diversas modalidades e padrões de comunicação serial, vamos ver aqui apenas alguns deles.
Uma vez que os dados são enviados bit-a-bit, as questões básicas são como localizar cada bit e como localizar o início de cada sequência de bits (tipicamente com 8 bits formando um byte). A figura abaixo mostra como um mesmo sinal digital pode ser interpretado de formas diferentes.
A comunicação serial pode ser implementada por software usando as entradas e saídas digitais e o timer. É um processo trabalhoso, nem sempre confiável, e que consome processador e memória. Por este motivo é comum os microcontroladores possuirem módulos internos que permitem trabalhar diretamente com bytes.
Nestes módulos existe sempre uma certa capacidade de bufferização. No mínimo existe um registrador com o byte que está em processo de transmissão e recepção (normalmente inacessível ao programador) e um outro registrador onde pode ser retirado o byte que já foi recebido inteiramente ou colocado o próximo byte a transmitir. Nos modelos mais sofisticados temos filas de vários bytes, simplificando ainda mais a programação. Em alguns casos existe até um recurso de DMA onde você programa o endereço e tamanho de um buffer de memória e o módulo de comunicação faz toda a comunicação sozinho.
Comunicação Assíncrona - UART
A comunicação serial assíncrona é uma das formas mais simples e comuns de comunicação serial. Nela a linha de comunicação está normalmente em nível "1". O início de um byte é indicado por um "0" (start bit). Em seguida vem os bits de dados, um bit (opcional) de paridade e um período de repouso em "1" (stop bits). O tempo de duração de cada bit (que define a taxa de comunicação ou baud rate) precisa ser combinado previamente entre as duas pontas (para que a determinação de cada bit ocorra corretamente).
Uma UART (Universal Asynchronous Receiver Transmiter) é um módulo que implementa a comunicação assíncrona, gerando e interpretando o sinal digital correspondente.
Comunicação Síncrona - USART
Dois problemas da comunicação asíncrona é que gasta-se tempo de comunicação transmitindo os start e stop bits e o baud rate precisa ser combinado externamente à comunicação. Na comunicação síncrona utiliza-se um sinal de clock separado para indicar onde está cada bit.
O início de cada byte é determinado através de sequências especiais de bits.
Uma USART é módulo que implementa comunicação síncrona e assíncrona.
SPI - Serial Peripheral Interface
O SPI é uma comunicação serial síncrona utilizada principalmente para interligar componentes. Um uso típico de SPI é para conectar memória adicional a um microcontrolador.
O SPI utiliza 4 sinais para permitir a comunicação bi-direcional entre um master e um slave:
- SCLK: é o sinal de clock, gerado pelo master.
- MOSI: é o sinal de dados que vai do master para o slave.
- MISO: é o sinal de dados que vai do slave para o master.
- SS: é um sinal gerado pelo master que aciona a comunicação com o slave.
Maiores detalhes sobre SPI podem ser vistos na Wikipedia (de onde veio a imagem acima).
I²C - Inter-Integrated Circuit
Como o SPI, o I²C é uma comunicação serial síncrona utilizada principalmente para interligar componentes. Também permite uma ligação tipo "varal" entre um master e vários slaves. Entretanto, ele utiliza somente dois sinais:
- SDA: sinal de dados. É bi-direcional, o protocolo determina quem vai acionar o sinal.
- SCL: sinal de clock, gerado pelo master
Confuso? Por isto mesmo é que é util o microcontrolador ter toda esta lógica interna.
2 comentários:
Muito bom post, linguagem clara e objetiva!!!
Gostaria de saber se consigo usar duas comunicações ao mesmo tempo, por exemplo de o Arduino pro mini, e quero usar ele pra ler um sensor de temperatura, a comunicação é feita por I2C, e queria comunicar esse Arduino a um outro Arduino só que modelo UNO usando a comunicação SPI.
Sim, é possível usar SPI e I2C ao mesmo tempo no Arduino, pois ele tem periféricos separados para as duas funções.
Postar um comentário