🎯 I2C

Em poucas palavras

I2C (Inter-Integrated Circuit) é um protocolo de comunicação serial síncrona que usa só dois fios - um de dados (SDA) e um de clock (SCL) - para conectar vários dispositivos ao mesmo barramento, cada um identificado por um endereço próprio.


📝 Notas e Desenvolvimento

O que é

  • Criado pela Philips (hoje NXP) em 1982; às vezes também chamado de TWI (Two Wire Interface) em alguns fabricantes de microcontroladores.
  • Barramento síncrono: um dos fios (SCL, clock) marca o ritmo em que os bits do outro fio (SDA, dados) devem set lidos - ao contrário de protocolos assíncronos como o serial UART, onde não há um fio de clock e as duas pontas precisam concordar previamente na velocidade.
  • Suporta múltiplos dispositivos no mesmo barramento (multi-slave), e até múltiplos controladores (multi-master, menos comum na prática).
  • Cada dispositivo no barramento tem um endereço (normalmente de 7 bits, permitindo 112 endereços utilizáveis na prática), o que permite ao microcontrolador falar com o dispositivo certo mesmo com vários conectados aos mesmos dois fios.

Os dois fios, fisicamente

SinalFunção
SDA (Serial Data)Linha por onde os dados trafegam, nos dois sentidos
SCL (Serial Clock)Linha de clock, gerada pelo mestre, que sincroniza a leitura dos bits em SDA

Um detalhe físico importante: as duas linhas são open-drain (ou open-collector) - nenhum dispositivo força a linha para nível alto sozinho, só consegue puxá-la para baixo (0). Por isso o barramento precisa de resistores de pull-up (normalmente entre 2kΩ e 10kΩ) ligados de cada linha até a alimentação; sem else, as linhas ficam “flutuando” e a comunicação simplesmente não acontece.

Por que open-drain, e não um sinal comum?

Esse esquema é o que permite vários dispositivos compartilharem a mesma linha sem que um “brigue” eletricamente com o outro: cada um só consegue puxar a linha para baixo quando precisa, nunca empurrá-la para cima - quem faz isso são os resistores de pull-up, compartilhados por todos.

Velocidades padronizadas

ModoVelocidade
Standard modeaté 100 kHz
Fast modeaté 400 kHz
Fast mode plusaté 1 MHz
High speed modeaté 3.4 MHz

Na prática, a maioria dos projetos com microcontroladores (ESP32, Arduino etc.) e periféricos como o PCA9685 roda tranquilamente em 100 kHz ou 400 kHz.

Como uma transação acontece, em linhas gerais

  1. O mestre gera uma condição de START (uma transição específica em SDA enquanto SCL está em nível alto).
  2. O mestre envia o endereço do dispositivo escravo (7 bits) seguido de 1 bit indicando se a operação é leitura ou escrita.
  3. O escravo endereçado responde com um bit de ACK (confirmação) - se nenhum dispositivo reconhecer aquele endereço, a linha permanece em nível alto (NACK), e é assim que o mestre sabe que não há ninguém respondendo.
  4. Dados são trocados byte a byte, cada um seguido de seu próprio ACK/NACK.
  5. O mestre encerra com uma condição de STOP.

Exemplo prático (MicroPython, ESP32)

from machine import I2C, Pin
 
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
print("Dispositivos encontrados:", [hex(a) for a in i2c.scan()])
 
# Escrever em um registrador específico de um dispositivo no endereço 0x40
i2c.writeto_mem(0x40, 0x00, bytes([0x00]))
 
# Ler de volta
valor = i2c.readfrom_mem(0x40, 0x00, 1)

O i2c.scan() é normalmente o primeiro teste ao ligar qualquer periférico I2C novo: ele varre todos os endereços possíveis e devolve os que responderam com ACK - se a lista vier vazia, o problema está na camada elétrica (fiação, pull-ups, alimentação), antes mesmo de chegar a qualquer lógica de software.

Problemas comuns

  • Faltam resistores de pull-up (ou os que existem na placa não são adequados para o comprimento/capacitância do fio usado) - sintoma: i2c.scan() não encontra nada.
  • SDA e SCL invertidos na fiação - sintoma parecido: nada responde, ou respostas incoerentes.
  • Conflito de endereço: dois dispositivos no mesmo barramento com o mesmo endereço fixo - por isso módulos como o PCA9685 trazem pinos de endereço configuráveis.
  • Comunicação “funciona” mas nada acontece fisicamente: sinal de que o problema não está mais no I2C em si, e sim em uma camada depois dele (como o pino OE do PCA9685).

📚 Referências e Fontes

🔗 Conexões do Cofre

🌐 Referências Externas