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 kΩ a 10 kΩ 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:
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 (
0para escrita,1para 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 0x08 – 0x77; 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”) e400 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.