O I2C ou I²C é um tipo de interface serial utilizada para comunicar com diversos dispositivos, como o acelerômetro MPU 6050. E é importante conhecer o funcionamento por trás dessa comunicação, que é o que faremos neste post.

Recomendo a leitura dos posts sobre a comunicação serial assíncrona, o SPI, o RS-485 e o Modbus RTU.

O que é o I2C

Assim como na comunicação assíncrona, o I²C utiliza dois canais para comunicação. A diferença é que, nesse caso, um canal é de transmissão e recepção de dados e outro é para sincronização dos mesmos. Ou seja, ele é um tipo de comunicação síncrona, assim como a SPI.

I²C significa Inter-Integrated Circuit (Circuito Inter-Integrado) e pode ser pronunciado como “I dois C”. Ele foi criado pela Philips, tendo como vantagem a simplicidade e o baixo custo, e, como desvantagem, a velocidade.

Em relação aos dois canais de comunicação, temos: o canal de dados seriais, chamado de serial data (SDA); e o canal de sincronização, chamado serial clock (SCL). Simplificadamente, o Clock é um sinal que oscila entre nível alto e baixo rapidamente. Então, essa oscilação é utilizada para sincronizar os dispositivos a cada vez que o clock apresentar certo estado. Na explicação do funcionamento, isso será melhor ilustrado.

Barramentos

Outra informação importante é que os dois canais de comunicação são bidirecionais. Isto é, os dispositivos dos dois lados podem utilizar os canais. Esses canais são, basicamente, barramentos que interligam diversos dispositivos entre si. E, para haver a comunicação, deve existir pelo menos um dispositivo denominado “mestre” e outro denominado “escravo”.

O mestre é responsável por coordenar a comunicação (gerar clock e iniciar a comunicação). Enquanto o escravo apenas recebe os dados e responde quando é “chamado”. Cada escravo possui um endereço individual de 7 bits que é utilizado para um mestre conseguir comunicar individualmente com eles (normalmente escrito em hexadecimal). Dependendo, os dispositivos podem ser mestres ou escravos, embora normalmente eles assumam um papel fixo.

As linhas da comunicação I²C são de coletor aberto, então é necessário utilizar resistores de pull-up para evitar erros na comunicação.

Um exemplo de um diagrama com dispositivos interligados está mostrado abaixo:

I2C diagrama de ligação

De acordo com a imagem acima:

  • 3 dispositivos estão conectados no barramento da comunicação I²C
  • O dispositivo 1 pode ser um microcontrolador e os outros dois podem ser módulos ou sensores.
  • Os resistores de pull-up estão ligados entre o Vdd (5 V por exemplo) e as linhas.

Propriedades e detalhes do I2C

Como foi dito anteriormente, a desvantagem do I²C é a relativa baixa velocidade. Isso se deve por dois motivos: o primeiro é que o procedimento de transmissão de dados é mais “burocrático”; o segundo é que uma única linha recebe e transmite dados (comunicação half-duplex). Ou seja, não é possível fazer os dois ao mesmo tempo e o tempo gasto é dobrado. Um valor médio de velocidade é de 100kbit/s.

Existe um terceiro motivo (mais complexo), que tem relação com os resistores de pull-up, mas não pretendo explicá-lo.

Apesar da relativa baixa velocidade, o barramento do I²C permite a comunicação entre diversos dispositivos com apenas dois fios. Sendo assim, podem existir diversos mestres ou escravos ligados no barramento. O número máximo de dispositivos ligados pode depender da capacitância máxima do barramento (400pF).

Endereço

O endereço de um dispositivo é algo arbitrário e, portanto, podem haver dispositivos ligados em um barramento que, coincidentemente, possuem o mesmo endereço. É uma situação incomum, dado que o endereço é formado por 7 bits (128 possibilidades, ignorando que algumas são reservadas). Também podem haver casos em que a comunicação I²C utilize 10 bits para endereço.

Um módulo que já mostrei aqui no site, o acelerômetro MPU 6050, é capaz de mudar o seu endereço. Dessa forma, é possível utilizar dois acelerômetros em um mesmo barramento. Ele ainda possui pinos auxiliares que permitem criar um barramento alternativo para comandar outros dispositivos por I²C (um magnetômetro por exemplo). Portanto, o acelerômetro age como escravo em relação ao Arduino, e age como mestre em relação ao magnetômetro.

Barramento com mais de um mestre

Em um barramento com dois mestres ou mais, podem ocorrer conflitos de comunicação. Normalmente, um mestre sempre espera outro terminar a comunicação quando o barramento está sendo utilizado. Entretanto, dois mestres podem querer transmitir dados ao mesmo tempo. Para este caso, existe uma arbitragem que evita o erro na comunicação. O que ocorre é que cada mestre verifica o nível da linha SDA e compara com o nível que ele está esperando (o nível que ele mandou definir).

Se, para um determinado mestre, o nível real é diferente do esperado, então este mestre perde o direito da transmissão e espera até o outro mestre terminar o procedimento. Portanto, o mestre que verificou que o nível da linha SDA foi igual ao que ele esperava pode, sem interrupção, continuar a sua transmissão de dados. Dessa forma, a comunicação fica organizada e sem conflitos.

Alongamento do clock

Pode ser que um escravo esteja defasado do mestre (diferentes velocidades de processamento) ou que não esteja pronto para receber/enviar dados. Se este for o caso, o escravo pode manter a linha SCL em nível baixo após receber ou enviar um byte. E o mestre que está comunicando com este escravo deve aguardar até a linha SCL voltar ao nível alto.

Funcionamento do I2C

Início e 1º byte

Sabemos então que a comunicação I²C é constituída por um clock e um endereço de 7 bits na linha SDA. Mas este é só o necessário para começar a transmitir os dados. Vamos considerar as duas linhas, SDA e SCL, em nível alto a princípio (devido ao pull-up). A transmissão, de fato, ocorrerá da seguinte forma:

A transmissão dos bits ocorre do mais para o menos significativo.

  1. Para ser detectado um início de transmissão, a linha de dados (SDA) precisa passar de nível alto para nível baixo enquanto a linha de clock (SCL) estiver em nível alto. Este, então, é chamado de bit de início.
  2. Em seguida, a linha SCL fica oscilando na frequência estipulada (depende da velocidade).
  3. Enquanto isso, a linha SDA deve enviar 7 bits correspondente ao endereço do dispositivo alvo. Esses bits são enviados um por vez a cada intervalo que a linha SCL estiver em nível baixo. Ou seja, o clock fica em nível baixo e um bit é enviado, depois o clock fica em nível alto e, em seguida, fica novamente em nível baixo, então outro bit é enviado. E assim em diante.
  4. Após os 7 bits de dados, um bit deve ser enviado para determinar se você deseja escrever ou ler um registrador do dispositivo. Enviar 0 indica escrita e 1 indica leitura. Para esse início da comunicação, devemos enviar 0 (mais a frente você entenderá).
  5. Na sequência do primeiro byte, o escravo deve informar se ele recebeu as informações. Ele faz isso mantendo a linha SDA em nível baixo. E o mestre deve deixar a linha SDA livre. Esse bit é chamado de Acknowledge ou ACK. Se o escravo não recebeu corretamente os dados, ele mantem a linha em nível alto e este bit recebe o nome de Not Acknowledge ou NACK.
    • O NACK pode ocorrer por outros motivos. Exemplo: se nenhum escravo com o endereço especificado existir. Em todos os casos, a comunicação é abortada (uma nova tentativa depende do mestre).
I2C transmissão do 1º byte
Observe as linhas verdes indicando os intervalos que SDA tem para alterar o nível de sua linha

2º byte

  1. Considerando sucesso no passo anterior, o mestre envia o endereço do registrador que ele deseja gravar/ler os dados. Este endereço é constituído de um byte (8 bits) e deve ser enviado igual foi especificado no passo 3 na parte do 1º byte.
  2. Então, o passo 5 (do 1º byte) se repete: o escravo envia o ACK.
  3. Se o passo anterior foi um sucesso, o próximo passo depende se o procedimento é escrita ou leitura. Portanto, a sequência dos dois está nos tópicos abaixo:
I²C transmissão do 2º byte

Escrita

  1. Se o segundo ACK foi um sucesso, o mestre finalmente envia um byte com os dados que ele deseja gravar no registrador.
    • Pode ser que o registrador possua mais de 1 byte de espaço. Se for o caso, este passo e o ACK se repetem até todos os dados serem enviados.
  2. A penúltima informação enviada deve ser um ACK (pelo escravo).
  3. Por último, quando não há mais nada a ser enviado, a linha SDA passa de nível baixo para nível alto enquanto a linha SCL está em alta. E este é chamado bit de parada.

A imagem abaixo mostra o exemplo de uma escrita. O endereço do escravo é 0x68 (1101000), o registrador é 0x3B (00111011) e os dados enviados são: 11001010.

I²C escrevendo em um registrador

Leitura

No caso da leitura, continuando do 2º byte, temos:

  1. Se o segundo ACK foi um sucesso, o mestre envia um novo bit de início (SCL em alto e SDA passa de alto para baixo).
  2. Após este segundo bit de início, o mestre deve enviar novamente o endereço do escravo e o passo 3 do 1º byte se repete.
  3. Ao fim do endereço do escravo, o bit de leitura (1) deve ser enviado.
  4. Seguido a ele, um ACK.
  5. Se este último ACK deu certo, o escravo finalmente envia os dados que estão gravados no registrador. Em sequência a ele, agora é o mestre que deve enviar o ACK.
    • Pode ser que o registrador possua mais de 1 byte de espaço. Se for o caso, este passo e o ACK (do mestre) se repetem até todos os dados serem enviados pelo escravo.
  6. A penúltima informação enviada deve ser um NACK do mestre.
  7. Por último, quando não há mais nada a ser recebido pelo mestre, ocorre um bit de parada (a linha SDA passa de nível baixo para nível alto enquanto a linha SCL está em alta).

A imagem abaixo mostra o exemplo de uma leitura. O endereço do escravo é 0x68 (1101000), o registrador é 0x3B (00111011) e os dados enviados pelo escravo são: 10010011.

I2C lendo de um registrador

Obs: É enviado ‘escrita’ no 1º byte (0 no 8º bit) mesmo que estejamos fazendo a leitura mais a frente.

Comentários finais

Para complementar o post, recomendo esta apostila da Texas Instruments sobre a comunicação I²C no geral.

Tendo em vista o que foi mostrado, agora você já deve ser capaz de entender o princípio de funcionamento do I²C, além de saber como interpretar a transmissão dos dados.

 

Referência: Wikipedia

SPI