3.23. Noções básicas de I2C

I2C (Inter-Integrated Circuit, pronunciado «I ao quadrado C» ou «I dois C») é um barramento série de dois fios concebido para ligações de curto alcance entre circuitos integrados na mesma placa. Situa-se entre SPI e UART em termos de prioridades: mais lento que SPI mas mais económico em pinos, e endereçado (múltiplos dispositivos nos mesmos dois fios) enquanto SPI necessita de uma linha CS dedicada por dispositivo.

I2C é o barramento preferido para sensores de baixa frequência – acelerómetros, sensores de temperatura, sensores de humidade, magnetómetros, relógios de tempo real, EEPROMs – onde reduzir pinos e a complexidade do barramento é mais importante do que o débito bruto.

3.23.1. Dois fios, ambos open-drain

Um barramento I2C tem apenas dois sinais:

  • SCL (relógio série). Comandado pelo controlador (na maior parte do tempo).

  • SDA (dados série). Comandado pelo dispositivo que está a falar naquele momento – pelo controlador durante o endereço e os dados de saída, pelo periférico durante as leituras e os bits ACK.

Ambas as linhas são open-drain: cada dispositivo no barramento pode puxar a linha para a massa mas nunca a conduz para nível alto. Dois resistores de pull-up no barramento (tipicamente 2.2 a 10 para o barramento de alimentação) puxam as linhas para nível alto quando ninguém as está a puxar para baixo. O comportamento em OR lógico resulta disso – qualquer dispositivo que puxe a linha para baixo prevalece, e o estado alto é simplesmente «ninguém está a falar».

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

3.23.2. A transação

Cada transação I2C segue a mesma estrutura:

SCL and SDA traces. SDA falls while SCL is high (START), then SCL clocks bytes on SDA -- a 7-bit address byte with a read/write bit and an ACK, then a register byte and an ACK, then a data byte and a NACK, then SDA rises while SCL is high (STOP).

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

A troca desenrola-se bit a bit:

  • START. O controlador puxa SDA para baixo enquanto SCL ainda está alto. Este flanco invulgar indica a todos os dispositivos no barramento que uma transação está prestes a começar.

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

  • ACK / NACK. Após cada byte, o recetor comanda SDA durante um relógio para ACK (baixo) ou NACK (alto). No byte de endereço, o periférico envia ACK se reconhecer o seu próprio endereço; se nenhum dispositivo enviar ACK, o controlador vê um NACK e sabe que o endereço não está no barramento.

  • Bytes de dados. Cada um seguido de um ACK do recetor. Numa escrita, o periférico envia ACK a cada byte; numa leitura, o controlador envia ACK a cada byte que pretende receber e NACK ao último byte para indicar ao periférico que deve parar.

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

Um repeated start é um segundo START emitido sem um STOP intermédio – o controlador muda de direção (endereço de escrita, depois endereço de leitura) no mesmo periférico sem libertar o barramento.

3.23.3. Endereçamento

O espaço de endereços de 7 bits abrange 0x080x77; os valores nas extremidades são reservados para fins especiais. O endereço de cada dispositivo é definido pelo projetista do circuito integrado; muitos componentes permitem alterar alguns dos bits menos significativos ao nível da placa (ligando um pino a nível alto ou baixo) para que dois sensores iguais possam coexistir no mesmo barramento.

Se dois dispositivos partilham um endereço, não é possível comunicar com um deles sem que o outro interfira, por isso verifique a folha de dados antes de combinar componentes. i2c.scan() (abordado em I2C em código) percorre o espaço de endereços e reporta os endereços que respondem, sendo este o método padrão para descobrir o que está no barramento.

3.23.4. Pontos fortes e fracos

Os pontos fortes e fracos do barramento definem o seu nicho:

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

  • Velocidades normalizadas. 100 kHz («modo standard») e 400 kHz («modo rápido») cobrem quase todos os sensores. 1 MHz é atingível, mas começa a exigir mais da capacitância do barramento e do dimensionamento dos pull-ups.

  • Lento comparado com SPI. Qualquer coisa a mover mais do que algumas centenas de kilobits por segundo prefere SPI.

  • Conflitos de endereços. Dois dispositivos com o mesmo endereço no mesmo barramento é um erro de hardware que o protocolo não consegue contornar.