BUILDBOT Blog

Interfaces de comunicação OneWire, SPI e I2C

Comunicacao_Microcontrolador

Vamos falar um pouco sobre os protocolos de comunicação mais utilizados nos projetos utilizando microcontroladores. Os protocolos de comunicação que vamos mostrar podem ser utilizados não só para comunicação entre microcontroladores, como também entre esses dispositivos e seus periféricos, como sensores, módulos e shields.

Apesar da evolução da tecnologia dos microcontroladores e a adoção de protocolos próprios (proprietários) pelos fabricantes, no final acabamos usando os protocolos mais conhecidos e mais bem documentados, por exemplo, as interfaces SPI e I2C que estão disponíveis em praticamente todas as placas encontradas no mercado, como Arduino, Raspberry Pi, Cubieboard e Beaglebone entre outras.

Comunicação usando interface Paralela

A comunicação paralela é atualmente pouco usada para comunicação em circuitos com microcontroladores, mas durante um bom tempo foi uma das mais utilizadas para comunicação com periféricos como impressoras e scanners.

Apesar de ser mais lembrada na utilização desses dispositivos, ela também é (ou foi) a base para a construção de interfaces para motherboards (placa mãe) de computadores, como as interfaces SCSI, ISA, PCI e IDE (também chamada de PATA = Parallel ATA).

Na comunicação paralela temos 8 linhas de dados, por onde conseguimos enviar um byte (8 bits) de cada vez.

Comunicação Paralela

Além dos 8 bits de dados geralmente também são necessários outros fios para alimentação e controle, o que acaba trazendo algumas limitações à construção de dispositivos utilizando essa interface, já que os cabos não podem ser tão longos (estão sujeitos à interferência devido à proximidade dos fios) e a confecção, manutenção dos conectores paralelos também é mais complexa.

Comunicação usando interface Serial

A comunicação serial (muitas vezes chamada de RS-232 ou até mesmo de UART) é uma evolução da interface paralela e como o próprio nome diz, funciona enviando os dados serialmente, um bit de cada vez:

Comunicação Serial

As vantagens com relação à comunicação paralela são o menor custo de confecção de cabos e conectores, já que a comunicação é feita por meio de apenas um fio, e a redução de interferência de sinal em cabos mais longos.

Claro que a utilização de apenas um fio serve somente para efeitos didáticos ou em projetos específicos, já que na comunicação serial precisamos também receber dados decontrole, resposta, etc. Assim, temos pelo menos 3 fios : TX (Transmissão), RX (Recepção) e GND (terra).

As configurações da comunicação serial variam de dispositivo para dispositivo e devem ser a mesma tanto no transmissor como no receptor. Os parâmetros configuráveis na interface serial são Baud rate, Data Bits, Stop BitsParidade.

Baud rate – É a taxa de transmissão ou a velocidade com que a serial vai se comunicar com o outro dispositivo e indica quantos bits são transmitidos por segundo. Os valores mais utilizados estão na faixa de 300 a 115.200 bauds, mas dependendo do hardware podem alcançar taxas muito maiores.

Data Bits – Indica quantos bits de dados você vai enviar pela serial. Esse número não precisa necessariamente ser 8 (um byte completo). Em algumas situações, podemos escolher entre o envio de 5, 7 ou 8 bytes de cada vez.

Stop Bits – Bits de parada, indica o fim da transmissão de um pacote de dados. Pode ter o valor de 1, 1.5 ou 2. É utilizado para fins de sincronização entre os dispositivos.

Paridade – Também utilizado para fins de sincronização e verificação da integridade dos dados após a transmissão.

Apesar de todos esses parâmetros o mais comum é encontrarmos como padrão para configuração da comunicação serial os valores 8-N-1, que significam 8 bits de dados, sem paridade e 1 stop bit. A adoção de outros valores vai depender do tipo de equipamento e protocolo utilizado.

Pela estrutura mostrada acima, vemos que a comunicação serial é do tipo ASSÍNCRONA, ou seja, não utiliza nenhum tipo de clock para sincronização e depende do envio de bits específicos após os dados para sinalizar o final da transmissão.

Comunicação usando Onewire

A comunicação Onewire (1-Wire), utiliza um protocolo criado pela Dallas Semicondutores (agora Maxim), que permite que um dispositivo mestre (na maioria dos casos um microcontrolador), se comunique com um dispositivo escravo utilizando apenas um pino de dados.

Em alguns casos, esse mesmo pino de dados pode levar a alimentação até o dispositivo, mas a utilização mais comum é a alimentação do sensor por meio de pinos específicos e a conexão de um fio de dados até o microcontrolador, como nesse exemplo com Arduino e módulos de temperatura DS18B20, da Dallas. Repare que os dois sensores utilizam o mesmo pino de dados (10) do Arduino:

Onewire - DS18B20 e Arduino

Uma rede com a configuração mestre/escravo utilizando protocolo Onewire é chamada de MicroLAN.

Comunicação usando SPI

A comunicação via interface SPI usa comunicação serial síncrona, com o conceito de mestre-escravo. Nesse tipo de comunicação, temos um dispositivo mestre (geralmente o microcontrolador) e vários escravos (periféricos).

Interface SPI

Como podemos ver na imagem acima, os pinos SCLK (Clock), MOSI (Master Output Slave Input) e MISO (Master Input SlaveOutput) são compartilhados pelos escravos e definem a sincronização e o envio e recebimento de dados. Para seleção do escravo, temos um pino independente (SS – Slave Select) para cada um que é ativado em nível baixo.

Para envio e recebimento de dados é enviado um sinal de clock do mestre para o escravo e esse clock determina em qual momento o bit pode ser enviado. Esse envio pode ser feito quanto o clock está passando do nível alto para o baixo ou quanto está passando do nível baixo para o alto, como na imagem abaixo :

SPI - Clock

A animação abaixo mostra o esquema de funcionamento da interface SPI, tanto na habilitação do escravo com o pino SS sendo colocado em nível baixo, como na utilização do clock para envio de dados :

Funcionamento SPI

Imagem : jaxcoder.com

Como vantagens da interface SPI podemos destacar a comunicação Full Duplex (é capaz de transmitir e receber dados ao mesmo tempo), um esquema de ligação simplificado e uma maior velocidade de comunicação (até 2 MB), em comparação com outras interfaces. É uma das interfaces mais utilizadas em módulos para Arduino e Raspberry.

Comunicação usando I2C

O protocolo de comunicação I2C foi criado pela Philips Semicondutores (hoje NXP) e posteriormente adotado por vários fabricantes. Devido à problemas de licença, pode também ser encontrada como interface TWI (Two Wire Interface) ou TWSI (Two-Wire Serial Interface), mas segue o mesmo princípio de funcionamento.

Na comunicação I2C, são utilizados dois fios para transmissão de dados entre o microcontrolador e um segundo dispositivo. As conexão são feitas por meio dos pinos SDA (Serial Data) e SCL (Serial Clock).

Interface I2C

Cada dispositivo I2C tem um endereço fixo para se comunicar com o microcontrolador e pode ser configurado para transmitir ou receber dados. Assim, tanto a linha SDA como a SCL são bidirecionais, com os dispositivos alternando seu estado entre mestre e escravo.

É importante que tanto o SDA como SCL sejam mantidas em nível alto quando não há transmissão de dados, para isso utilizamos resistores pull-up (R1 e R2 na imagem acima) ligados ao barramento. Sem eles, o barramento não fica em estado “pronto” para enviar e receber dados. Veja esse processo na imagem abaixo, onde os pinos SDA e SCL devem ficar em estado alto tanto no início como no fim:

I2C - Sequencia de inicio e parada

O modo mais comum de transmissão de dados pelo I2C utiliza 7 bits de dados. O oitavo bit indica se o dispositivo está lendo (Read) ou escrevendo (Write) dados :

I2C Read Write

Conclusão

A vantagem mais evidente da comunicação I2C é a ligação com o microcontrolador utilizando somente 2 fios, possibilitando a comunicação bidirecional. Entretanto, ela não é tão rápida quanto a comunicação SPI e em casos extremos pode ocorrer algum conflito de endereçamento, já que todos os dispositivos utilizam o mesmo barramento.

Category: Artigos

Your email address will not be published. Required fields are marked *

*