🎯 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
| Sinal | Funçã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
| Modo | Velocidade |
|---|---|
| Standard mode | até 100 kHz |
| Fast mode | até 400 kHz |
| Fast mode plus | até 1 MHz |
| High speed mode | até 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
- O mestre gera uma condição de START (uma transição específica em
SDAenquantoSCLestá em nível alto). - O mestre envia o endereço do dispositivo escravo (7 bits) seguido de 1 bit indicando se a operação é leitura ou escrita.
- 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.
- Dados são trocados byte a byte, cada um seguido de seu próprio ACK/NACK.
- 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. SDAeSCLinvertidos 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
OEdo PCA9685).