sábado, agosto 23, 2008

Microcontroladores - Parte 7

Fechando a parte de funcionalidades típicas de um microcontrolador, vamos ver hoje a parte de comunicação serial.

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.
Tipicamente o microcontrolador é o master. Os sinais SCLK, MOSI e MISO do master são ligados a todos os slaves. Um sinal separado de SS é usado para cada slave. Os slaves não acionados pelo sinal SS devem ignorar os sinais SCLK e MOSI e deixar o sinal MISO flutuar. O sinal MISO será comandado pelo slave acionado pelo sinal SS. Isto permite uma configuração de "varal" onde vários periféricos (slaves) são conectados a um mesmo master, apenas um slave poderá se comunicar de cada vez:
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
Na situação de repouso, os dois sinais estão em nível "1". Para iniciar uma comunicação, o master muda o sinal SDA para "0", mantendo SCL em "1"; é o start bit. Em seguida o master transmite um endereço de 7 bits seqguido de um bit que indica se deseja ler ou escrever no slave; os bits são enviados pelo sinal SDA com a transição do sinal SCL de "0" para "1" indicando onde os bits devem ser lidos. Caso um dos slaves tenha o endereço especificado, ele deve responder forçando SDA em "0" (acknowledge). Em seguida o byte de dado é transmitido na linha SDA, com SCL indicando a posição de cada bit. Ao final de cada byte o receptor envia um bit de ACK. No final da comunicação o master muda o sinal SDA de "0" para "1" mantendo SCL em "1" (stop bit).

Confuso? Por isto mesmo é que é util o microcontrolador ter toda esta lógica interna.

2 comentários:

Unknown disse...

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.

Daniel Quadros disse...

Sim, é possível usar SPI e I2C ao mesmo tempo no Arduino, pois ele tem periféricos separados para as duas funções.