
Barramento I²C: ligações, endereçamento e resistores de pull-up
Conecte um barramento I²C confiável: funções de SDA e SCL, endereços de 7 bits, velocidades, capacitância do barramento, tempo de subida e dimensionamento dos resistores de pull-up.
Redigido e revisado tecnicamente porElectroDesignForge Engineering Team
Ver o processo editorialPonto-chave: I²C conecta vários circuitos integrados por duas linhas compartilhadas:
SDApara dados eSCLpara clock. As saídas normalmente são do tipo dreno aberto: um dispositivo puxa a linha para nível baixo, enquanto os resistores de pull-up a levam de volta ao nível alto. O dimensionamento precisa respeitar tanto a corrente máxima que a saída consegue drenar em nível baixo quanto o tempo de subida permitido pela velocidade e pela capacitância total do barramento.
Referência rápida
| Modo | Frequência máxima de SCL | Tempo máximo de subida t_r (30–70%) | Capacitância de referência por linha |
|---|---|---|---|
| Modo padrão (Sm) | 100 kHz | 1.000 ns | 400 pF |
| Modo rápido (Fm) | 400 kHz | 300 ns | 400 pF |
| Modo rápido plus (Fm+) | 1 MHz | 120 ns | 550 pF |
Esses limites vêm da especificação I²C. O componente mais lento pode exigir uma velocidade menor. Não selecione Fm+ apenas porque o controlador o suporta: todos os dispositivos alvo, conversores de nível e isoladores também precisam ser compatíveis.
SDA e SCL: linhas compartilhadas
SDA transporta o endereço, o bit de leitura/escrita, os bytes de dados e as confirmações. SCL fornece o clock da transferência. Quando o barramento está ocioso, as duas linhas ficam em nível alto. Uma condição START ocorre quando SDA desce enquanto SCL está alto; uma condição STOP ocorre quando SDA sobe enquanto SCL está alto.
Durante a transferência, SDA permanece estável enquanto SCL está alto. O controlador envia oito bits e libera SDA no nono pulso de clock; o receptor puxa SDA para nível baixo para indicar ACK ou a deixa alta para indicar NACK.
+3.3 V +3.3 V
| |
[Rp] [Rp]
| |
SDA ──────────────+──── controller ── target A ── target B
SCL ──────────────+──── controller ── target A ── target B
GND ───────────────────── common to every device
Use um pull-up efetivo em SDA e outro em SCL. Vários módulos já incluem esses resistores, que acabam ligados em paralelo. Dois resistores de 4.7 kΩ equivalem a 2.35 kΩ; quatro equivalem a 1.18 kΩ. Confira os esquemas dos módulos antes de acrescentar outro par.
Por que usar dreno aberto?
Um dispositivo nunca força ativamente o barramento para nível alto: ele libera a linha ou a puxa para baixo. Se dois dispositivos atuarem ao mesmo tempo, o nível baixo prevalece sem curto-circuito entre saídas opostas. Esse comportamento de «E cabeado» permite confirmação, arbitragem entre controladores e alongamento do clock.
Em algumas aplicações com um único controlador e sem alvos que alonguem o clock, SCL pode ser push-pull; documente expressamente essa exceção. Para um barramento I²C interoperável, mantenha SCL em dreno aberto com seu pull-up.
Ligações, terra e níveis de tensão
Conecte todos os dispositivos em paralelo: SDA a SDA, SCL a SCL e terra comum. Evite uma topologia em estrela com ramificações longas; derivações acrescentam capacitância, reflexões e sensibilidade a ruído. Na PCB, mantenha os sinais curtos, sobre um plano de terra contínuo e afastados de nós de comutação rápida.
A tensão à qual os pull-ups se ligam define o nível alto. Ela precisa ser compatível com todas as entradas e saídas, inclusive as de um microcontrolador desligado. Não ligue diretamente um componente de 1,8 V a pull-ups de 3,3 V, salvo se sua folha de dados permitir. Use um conversor de nível compatível com I²C e pull-ups dos dois lados quando o circuito exigir.
Os pull-ups internos de microcontroladores muitas vezes ficam entre 20 to 100 kΩ: podem servir em baixa velocidade e trilhas curtas, mas normalmente são fracos demais para barramentos carregados a 100/400 kHz. Verifique o valor real.
Endereço de 7 bits, não de 8 bits
A maioria dos circuitos integrados usa um endereço de destino de 7 bits. O primeiro byte transmitido é:
[ A6 A5 A4 A3 A2 A1 A0 | R/W ]
O bit R/W é acrescentado no barramento; ele não faz parte do endereço de 7 bits usado pela biblioteca. Um dispositivo no endereço 0x68 aparece como 0xD0 na escrita e 0xD1 na leitura. Uma API que solicita 0xD0 talvez use uma convenção de 8 bits; confira antes de deslocar o endereço duas vezes.
Em muitos sensores, os pinos ADDR, SA0 ou SDO selecionam o endereço. Ligue-os a um nível definido e registre os endereços no esquema. Se dois dispositivos de endereço fixo entrarem em conflito, use um multiplexador I²C, outro controlador ou uma variante do componente. Há endereçamento de dez bits, mas ele é incomum; o endereço de um registrador interno não é o endereço I²C do dispositivo.
Velocidade, SCL e alongamento do clock
A frequência de SCL é uma taxa máxima de clock, não uma taxa garantida de dados úteis: endereços, registradores, bits ACK/NACK, condições START/STOP e atrasos internos reduzem a vazão. Por isso, uma transferência de vários registradores a 400 kHz demora mais do que a quantidade de bytes dividida por 400 kbit/s.
Um dispositivo alvo pode manter SCL em nível baixo depois que o controlador a libera: isso é alongamento do clock. O controlador deve ler SCL e esperar que volte a nível alto, respeitando o tempo limite do produto. Verifique a compatibilidade, pois alguns drivers lidam mal com esse recurso. Com vários controladores, aquele que libera SDA mas lê nível baixo perde a arbitragem e para.
Capacitância do barramento e tempo de subida
Cada linha forma uma carga RC: somam-se as capacitâncias das entradas dos circuitos integrados, trilhas, cabos, pontas de prova, conectores e parasitas. Quando nenhum dispositivo puxa a linha para baixo, o resistor de pull-up carrega gradualmente essa capacitância.
Para uma medição entre 30% e 70% de VDD:
t_r ≈ 0.8473 × R_p × C_bus
R_p,max ≈ t_r,max / (0.8473 × C_bus)
Use ohms, farads e segundos. O resultado é a resistência máxima de pull-up; acima dela, a subida fica lenta demais. A 400 kHz, com C_bus = 100 pF:
R_p,max ≈ 300 ns / (0.8473 × 100 pF) ≈ 3.54 kΩ
4.7 kΩ exige pouca corrente, mas é um valor alto demais para atingir 300 ns com 100 pF. 3.3 kΩ é um ponto de partida melhor, sujeito aos limites de corrente em nível baixo e à medição. Prefira medir a capacitância no conjunto final; caso contrário, some capacitâncias de entrada, dados do cabo (pF/m), conectores e uma margem para a PCB. A ponta de prova também acrescenta capacitância.
Dimensionamento do pull-up: uma faixa, não um valor mágico
Um resistor menor acelera a borda, mas aumenta a corrente quando um dispositivo força o nível baixo. O limite inferior é:
R_p,min ≈ (VDD − V_OL,max) / I_OL,max
Para VDD = 3.3 V, V_OL,max = 0.4 V e I_OL,max = 3 mA:
R_p,min ≈ (3.3 − 0.4) / 3 mA ≈ 967 Ω
R_p,min ≤ R_p ≤ R_p,max
O valor escolhido só é válido dentro dessa faixa. Se ela não existir, reduza a capacitância ou a velocidade, use um buffer I²C adequado ou um dispositivo Fm+ capaz de drenar mais corrente. Não escolha um resistor abaixo de R_p,min apenas porque parece funcionar: V_OL pode deixar de atender ao nível baixo exigido, e a dissipação aumenta.
| Situação | Ponto de partida | Verificar |
|---|---|---|
| PCB curto, 3,3 V, 100 kHz | 4.7 to 10 kΩ | capacitância e pull-ups existentes |
| PCB curto, 3,3 V, 400 kHz | 2.2 to 4.7 kΩ | t_r e I_OL de cada alvo |
| Cabo ou muitos módulos | calculado, frequentemente menor | corrente drenada, compatibilidade eletromagnética e forma de onda na ponta do cabo |
Essas faixas não substituem o cálculo para a montagem real.
Medir e solucionar problemas
Observe SDA e SCL no ponto mais distante do controlador. Meça t_r entre 30% e 70% de VDD e verifique V_OL, oscilações nas bordas e a estabilidade de SDA enquanto SCL está alta.
| Sintoma | Causas prováveis | Ações |
|---|---|---|
| Nenhum alvo encontrado | Terra ausente, endereço incorreto, SDA/SCL trocados | Verifique continuidade e alimentação; procure endereços de 7 bits |
| Linhas sempre em nível alto | Pull-up ausente ou tensão de alimentação incorreta | Verifique os dois resistores e as tensões a que se ligam |
| Linha presa em nível baixo | Alvo em reset, falha nas ligações, transação interrompida | Isole módulos e reinicie o segmento |
| NACKs aleatórios | Subida lenta, ruído, capacitância ou velocidade excessiva | Meça t_r, reduza R_p ou diminua a velocidade |
| Falha apenas com todos os módulos | Pull-ups paralelos fortes demais ou capacitância acumulada | Calcule a resistência e a capacitância equivalentes |
Uma recuperação típica libera SDA, gera até nove pulsos em SCL e então emite STOP. Use esse procedimento apenas se todas as folhas de dados o permitirem; reiniciar o segmento pode ser mais confiável.
Lista de verificação antes do layout
- Todos os componentes compartilham terra e níveis de tensão compatíveis no barramento?
- SDA e SCL têm, cada uma, um pull-up efetivo sem resistores paralelos adicionados por engano?
- Os endereços são exclusivos e estão registrados no formato de 7 bits?
- Todos os alvos, conversores de nível e isoladores aceitam a velocidade escolhida?
- O valor escolhido fica entre
R_p,mineR_p,max? - O tempo de subida foi verificado na placa com a capacitância real?
Calculadora associada
- Abra a calculadora de pull-up / pull-down para calcular a faixa de resistência a partir de
VDD, da corrente GPIO, dos limiares, da capacitância da linha e do limite de tempo de subida I²C.
Fontes
- NXP Semiconductors, UM10204 — Especificação do barramento I²C e manual do usuário: protocolo, níveis elétricos e temporização Sm/Fm/Fm+.
- Folhas de dados do controlador, alvos, conversores de nível, buffers e isoladores usados: prevalecem para
I_OL,V_OL, capacitância de entrada e suporte ao alongamento do clock.