Skip to content

Logo grande 2022
  • Eletrônica
  • Robótica
  • Computação
  • Projetos
  • Cursos
    • ESP8266 com Arduino IDE (EA)
    • Eletrônica Digital (ED)
    • Microcontroladores (MC)
    • Arduino para Iniciantes (AI)
    • NodeMcu básico (Obsoleto)
  • Youtube
  • Sobre
> Eletrônica > I2C

Acompanhe no YouTube

Acompanhe no Instagram

Fábio

mundo_projetado

Você sabe por quê o HX711 é comumente usado par Você sabe por quê o HX711 é comumente usado para ler células de carga? Leia o post mais recente do site e descubra! Lá eu explico como utilizar células de carga com o HX711 e um Arduino para medir massas.
Aprenda o que são as células de carga e como ela Aprenda o que são as células de carga e como elas e os strain gauges funcionam.
Acesse o site e leia o post mais recente sobre o assunto!
Recebi alguns CIs da Win Source (patrocinado) e fi Recebi alguns CIs da Win Source (patrocinado) e fiquei bem satisfeito com a qualidade e o profissionalismo deles. Dê uma olhada no vídeo para entender. E também acesse o site da Win Source se estiver precisando de um distribuidor confiável.
Esta semana publiquei um post sobre a escassez de Esta semana publiquei um post sobre a escassez de componentes na pandemia e outro sobre o reaproveitamento de componentes a partir de sucatas eletrônicas. Acesse o site para ler!
Obs: imagem gerada por IA
Veja mais... Seguir

Acompanhe no Facebook

Facebook Pagelike Widget

I2C

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

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

Compartilhe:

  • Clique para compartilhar no Facebook(abre em nova janela)
  • Clique para compartilhar no WhatsApp(abre em nova janela)
  • Clique para compartilhar no Twitter(abre em nova janela)
agosto 22, 2018 - 12:00 Fábio Guimarães
Eletrônica
barramento, clock, comunicação serial, comunicação serial síncrona, dados, escravo, i dois c, i2c, i²c, master, mestre, pull-up, SCL, SDA, síncrona, slave, transmissão de dados
6 Comments

Deixe um comentário Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

6 thoughts on “I2C”

  1. ANDERSON MATARELLE DE ABREU disse:
    6 de fevereiro de 2021 às 12:20

    MUITO OBRIGADO PELA APRESENTAÇÃO , MUITO UTIL.

    Responder
    • Fábio Guimarães disse:
      6 de fevereiro de 2021 às 13:12

      Que bom que gostou, Anderson. Muito obrigado pelo comentário!

      Responder
  2. José Batista disse:
    9 de junho de 2022 às 15:49

    Uma ótima explicação, obrigado por publicar.

    Responder
    • Fábio Guimarães disse:
      12 de junho de 2022 às 11:22

      Muito bom receber esse feedback, José. Obrigado pelo comentário!

      Responder
  3. Rodrigo disse:
    22 de setembro de 2022 às 20:20

    muito obrigado pela disposição. aprendi bastante!!!

    Responder
    • Fábio Guimarães disse:
      22 de setembro de 2022 às 21:26

      Show de bola, Rodrigo. Eu que agradeço o feedback!

      Responder

Política de privacidade.

© 2025 - Construído usando o tema Columnist