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