Share

Nós temos iniciado aqui no Software Livre uma série de artigos sobre acesso a periféricos em sistemas embarcados.  Já falamos sobre como acessar a GPIO, como acessar a UART, e agora iremos abordar Comunicação I2C em Linux. Posteriormente falaremos de comunicação SPI.

O padrão de comunicação I2C

 i2c

I2C é um padrão de comunicação serial síncrona desenvolvido pela Philips que usa apenas dois fios para comunicação. Um fio é usado para transmissão de dados e o outro é usado para o sinal de clock para fazer o sincronismo entre o transmissor e o receptor. Na comunicação I2C a transmissão é feita de forma semelhante a como é feita em sockets, no que diz respeito a servidor e cliente.

O mestre inicia a comunicação com um escravo por meio do envio do byte do endereço do escravo, indicando que quer se comunicar com ele. Isso é feito porque pode existir vários mestres e vários escravos no barramento I2C. Se o escravo retorna um ACK(confirmação), a comunicação é iniciada. A partir daí, o mestre pode escrever ou ler dados do escravo. No protocolo I2C, apenas o mestre pode iniciar a comunicação. O escravo é como um servidor em sockets, fica esperando alguém iniciar uma transmissão, aguardando o seu byte de endereço.

I2C é um protocolo serial de velocidade baixa a média com a seguinte lista de atributos:

  • Resistente a falhas e ruidos
  • Suportado por um vasto e variado número de dispositivos
  • Um protocolo reconhecidamente robusto
  • Suporta vários escravos e mestres
  • Uma distância de comunicação que pode ser extendida a longas distâncias com extensores de barramento
  • Vários microcontroladores e processadores têm suporte a I2C, embutido no próprio chip
  • Facilmente emulado por software por qualquer microcontrolador

Terminologia do barramento I2C

Transmissor – o dispositivo que envia dados ao barramento. O transmissor pode ou ser um dispositivo que coloca dados no barramento, ou em resposta a uma requisição de dados por outro dispositivo

Receptor – o dispositivo que recebe dados do barramento;

Mestre – o componente que inicializa a transferência, gera o sinal de clock, e termina a transferência. Um mestre pode ser ou um transmissor ou um receptor;

Escravo – o dispositivo endereçado por um mestre. Um escravo pode ser ou um receptor ou transmissor;

Multi-mestre – a habilidade de mais do que um mestre coexistir no barramento ao mesmo tempo sem colisão ou perda de dados;

Arbitração – o procedimento premeditado que autoriza apenas um mestre em dado tempo tomar o controle do barramento;

Sicronização – o procedimento premeditado que sicroniza o clock dos sinais providos por dois ou mais mestres;

SDA – data signal line (linha de sinal de dado);

SCL – clock signal line (linha de sinal de clock).

Habilitando o driver I2C no kernel Linux

Agora vamos habilitar o driver genérico I2C no kernel Linux que disponibiliza no espaço de usuário uma interface muito fácil de usar. Através de funcoes de acesso a arquivo, você pode ler e escrever em um dispositivo I2C.

Selecione Device Driver:

driver_i2c_01

Habilite o suporte a I2C pressionado y, depois aperte ENTER:

driver_i2c_02

Habilite o suporte a Interface I2C como módulo pressionando M:

driver_i2c_03

Selecione <Exit> até sair de todas as telas e ao final salve escolhendo <Yes>:

menuconfig_save

Este driver genérico I2C irá disponibiliza entradas no diretório /dev com nomes como i2c-0, i2c-1, para que o usuário acesse o periférico i2c da mesma forma que acessa um arquivo. Veremos um exemplo logo a seguir. Aqui você pode ver como configurar o driver I2C: https://www.youtube.com/watch?v=c_G9dIbps_M

Comunicação I2C em Linux

Agora que temos o driver generico habilitado no kernel, podemos escrever um software de espaço de usuario para fazer uma comunicação I2C. Você pode usar qualquer dispositivo que suporte o protocolo I2C como uma memória, RTC, RFID, etc.

Exemplo de software para escrever e ler uma memoria I2C:

Referências

https://www.kernel.org/doc/Documentation/i2c/dev-interface

[emailMarketingFoot]

Translate »