ElectroDesignForgeElectroDesignForge
Sinais e interfacesComponentesProjeto de PCB

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 editorial

Ponto-chave: I²C conecta vários circuitos integrados por duas linhas compartilhadas: SDA para dados e SCL para 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

ModoFrequência máxima de SCLTempo máximo de subida t_r (30–70%)Capacitância de referência por linha
Modo padrão (Sm)100 kHz1.000 ns400 pF
Modo rápido (Fm)400 kHz300 ns400 pF
Modo rápido plus (Fm+)1 MHz120 ns550 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çãoPonto de partidaVerificar
PCB curto, 3,3 V, 100 kHz4.7 to 10 kΩcapacitância e pull-ups existentes
PCB curto, 3,3 V, 400 kHz2.2 to 4.7 kΩt_r e I_OL de cada alvo
Cabo ou muitos móduloscalculado, frequentemente menorcorrente 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.

SintomaCausas prováveisAções
Nenhum alvo encontradoTerra ausente, endereço incorreto, SDA/SCL trocadosVerifique continuidade e alimentação; procure endereços de 7 bits
Linhas sempre em nível altoPull-up ausente ou tensão de alimentação incorretaVerifique os dois resistores e as tensões a que se ligam
Linha presa em nível baixoAlvo em reset, falha nas ligações, transação interrompidaIsole módulos e reinicie o segmento
NACKs aleatóriosSubida lenta, ruído, capacitância ou velocidade excessivaMeça t_r, reduza R_p ou diminua a velocidade
Falha apenas com todos os módulosPull-ups paralelos fortes demais ou capacitância acumuladaCalcule 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

  1. Todos os componentes compartilham terra e níveis de tensão compatíveis no barramento?
  2. SDA e SCL têm, cada uma, um pull-up efetivo sem resistores paralelos adicionados por engano?
  3. Os endereços são exclusivos e estão registrados no formato de 7 bits?
  4. Todos os alvos, conversores de nível e isoladores aceitam a velocidade escolhida?
  5. O valor escolhido fica entre R_p,min e R_p,max?
  6. O tempo de subida foi verificado na placa com a capacitância real?

Calculadora associada

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.