3.23. Fundamentos do I2C

O I2C (Inter-Integrated Circuit, pronunciado “I-ao-quadrado-C” ou “I-dois-C”) é um barramento serial de dois fios projetado para enlaces de curto alcance entre chips na mesma placa. Ele se situa entre o SPI e o UART em termos de prioridades: mais lento que o SPI, porém mais econômico em pinos, e endereçado (vários dispositivos nos mesmos dois fios), enquanto o SPI precisa de uma linha CS dedicada por dispositivo.

O I2C é o barramento preferido para sensores de baixa taxa – acelerômetros, sensores de temperatura, sensores de umidade, magnetômetros, relógios de tempo real, EEPROMs – onde economizar pinos e complexidade do barramento importa mais do que o throughput bruto.

3.23.1. Dois fios, ambos open-drain

Um barramento I2C tem apenas dois sinais:

  • SCL (clock serial). Acionado pelo controlador (na maior parte do tempo).

  • SDA (dados seriais). Acionado por qualquer dispositivo que esteja falando no momento – o controlador durante o endereço e os dados de saída, o periférico durante leituras e bits ACK.

Ambas as linhas são open-drain: cada dispositivo no barramento pode puxar a linha para o terra, mas nunca a aciona para nível alto. Dois resistores de pull-up no barramento (tipicamente de 2.2 a 10 para o trilho de alimentação) puxam as linhas para nível alto quando ninguém as está puxando para baixo. O comportamento wired-OR decorre disso – qualquer dispositivo que puxe a linha para baixo vence, e o estado alto é simplesmente “ninguém está falando”.

Os pull-ups internos do MCU em seus pinos SCL e SDA geralmente não são fortes o suficiente para atuar sozinhos como os pull-ups do barramento; normalmente são necessários resistores externos no barramento. Muitas placas breakout de sensores já os incluem; verifique a folha de dados antes de adicionar mais.

3.23.2. A transação

Toda transação I2C segue o mesmo formato:

Trilhas de SCL e SDA. SDA cai enquanto SCL está em nível alto (START), depois SCL gera o clock dos bytes em SDA -- um byte de endereço de 7 bits com um bit de leitura/escrita e um ACK, depois um byte de registrador e um ACK, depois um byte de dados e um NACK, depois SDA sobe enquanto SCL está em nível alto (STOP).

Uma transação I2C: START, endereço de 7 bits + R/W, ACK, registrador, ACK, dados, NACK, STOP.

A troca se desenrola bit a bit:

  • START. O controlador puxa SDA para baixo enquanto SCL ainda está em nível alto. Essa borda incomum informa a todos os dispositivos no barramento que uma transação está prestes a começar.

  • Endereço + R/W. O controlador gera no clock um endereço de periférico de 7 bits seguido por um bit de leitura/escrita (0 para escrita, 1 para leitura).

  • ACK / NACK. Após cada byte, o receptor aciona SDA por um clock para dar ACK (baixo) ou NACK (alto). No byte de endereço, o periférico dá ACK se reconhecer seu próprio endereço; se nenhum dispositivo der ACK, o controlador vê um NACK e sabe que o endereço não está no barramento.

  • Bytes de dados. Cada um seguido por um ACK do receptor. Em uma escrita, o periférico dá ACK em cada byte; em uma leitura, o controlador dá ACK em cada byte do qual quer mais e dá NACK no último byte para dizer ao periférico para parar.

  • STOP. O controlador libera SDA para nível alto enquanto SCL está em nível alto, encerrando a transação.

Um repeated start é um segundo START emitido sem um STOP entre eles – o controlador troca de direção (endereço de escrita, depois endereço de leitura) no mesmo periférico sem abrir mão do barramento.

3.23.3. Endereçamento

O espaço de endereços de 7 bits cobre 0x080x77; os valores nas extremidades são reservados para propósitos especiais. O endereço de cada dispositivo é definido pelo projetista do chip; muitas peças permitem que alguns dos bits inferiores sejam alterados no nível da placa (ligando um pino a nível alto ou baixo), de modo que dois sensores iguais possam ficar no mesmo barramento.

Se dois dispositivos compartilham um endereço, não há como falar com um deles sem o outro interferir, então verifique a folha de dados antes de emparelhar as peças. i2c.scan() (abordado em I2C em código) percorre o espaço de endereços e informa quais endereços respondem, que é a forma padrão de descobrir o que está no barramento.

3.23.4. Pontos fortes e fracos

Os pontos fortes e fracos do barramento definem seu nicho:

  • Dois pinos para muitos dispositivos. Um único par SCL/SDA pode comportar uma dúzia de sensores. O SPI precisaria de um pino CS extra por dispositivo.

  • Velocidades padrão. 100 kHz (“modo padrão”) e 400 kHz (“modo rápido”) cobrem quase todos os sensores. 1 MHz é alcançável, mas começa a exigir mais da capacitância do barramento e do dimensionamento dos pull-ups.

  • Lento em relação ao SPI. Qualquer coisa que mova mais do que algumas centenas de kilobits por segundo prefere o SPI.

  • Conflitos de endereço. Dois dispositivos com o mesmo endereço em um barramento é um erro de hardware que o protocolo não tem como contornar.