# I²C

I²C (Inter-Integrated Circuit) é um barramento serial Barramento multimestre desenvolvido pela Philips que é usado para conectar periféricos de baixa velocidade a uma placa mãe, a um sistema embarcado ou a um telefone celular. O nome significa Circuito Inter-integrado e é pronunciado I-ao quadrado-C, ou I-dois-C. Desde o dia 1 de Outubro de 2006, nenhuma taxa de licenciamento é exigida para implementar o protocolo I²C, contudo, algumas taxas ainda são exigidas para obtenção de endereços escravos I²C.
Vários concorrentes, como a Siemens AG, NEC Corporation, Texas Instruments, STMicroelectronics, Motorola e Intersil apresentaram produtos compatíveis desde a metade dos anos 90.
O System Management Bus foi definido pela Intel Corporation, é um subsistema da I²C que define os protocolos mais estritamente. Um propósito do SMBus é promover um melhor comportamento a erros. Sistemas modernos I²C incorporaram politicas e regras do SMBus, algumas vezes suportando ambos I²C e SMBus, o que requer uma pequena reconfiguração.

## Atualizações

* 1982, o sistema original da 100kHz I²C foi criado como um simples sistema de barramento interno para construir controles eletrônicos com vários chips Philips.
* 1992, adicionada a Versão 1, 400kHz Fast-mode e um modo de endereçamento 10 bits para aumentar a capacidade para 1008 nodos.
* 1998, adicionada a Versão 2, 3.4MHz High-Speed mode, com requerimentos para economia de energia para a voltagem e corrente elétrica.
* 2000, adicionada a Versão 2.1, introduzindo uma pequena limpeza da versão 2.
* 2007, adicionada a Versão 3, 1MHz Fast-mode plus e um dispositivo de mecanismo de ID.
* 2012, adicionada a Versão 4, 5MHz Ultra Fast-mode para as novas linhas USDA e USCL usando a lógica push-pull sem Resistores pull-up e adicionando uma tabela com IP.
* 2012, adicionada a Versão 5, correção de erros da versão anterior.
* 2014, adicionada a Versão 6, correção de dois grafos, é a versão mais recente.

## Projeto

O I²C utiliza apenas duas linhas bidirecionais de dreno aberto, Dados Seriais (Serial Data - SDA) e Clock Serial (Serial Clock - SCL), computadores. Este protocolo especifica dois sinais de comunicação, um com o sinal de clock (gerado pelo mestre), e outro de dados, bidirecional.

## Modelo

I²C usa apenas duas linhas bidirecionais Coletor aberto, a linha serial de dados e linha serial de clock com Resistores pull-up. Tensões tipicamente utilizadas são +5V ou +3.3V entretanto sistemas com outras tensões são permitidos. O modelo de referência I²C tem um espaço de endereçamento de 7-bit ou de 10-bit. Normalmente barramentos I²C tem velocidade de 100 kbits/s no modo padrão e de 10kbits/s no modo de baixa velocidade, mas arbitrariamente frequências baixas de clock também são permitidas. As atualizações recentes do I²C podem hospedar mais nodos e funcionar em maior velocidade (400 kbit/s Versão 1(Fast mode), 1Mbit/s Versão 3(Fast mode plus), e 3.4Mbit/s Versão 2 (High Speed mode)). Estas velocidades são muito mais usadas em sistemas embarcados do que em PCs. Existe também outros recursos, como o endereçamento 16-bit.
A transição de bits são especificadas pelas transações entre mestre e escravo sem clock ou hardware. Protocolo de gastos incluem um endereço escravo e talvez um registrador de endereço dentro do dispositivo escravo e também por byte ACK/NACK bits. Assim a verdadeira velocidade de transferência de dados é mais baixa que aquelas indicadas pelo pico de velocidade de bits sugere. Por exemplo, para cada interação com um escravo ineficientemente permite 1 byte de dados ser transferido, a transferência de dados será menor que a metade do pico de transferência de bits.
O numero maximo de nodos é limitado pelo espaço de endereçamento, e também pela capacitância do barramento de 400 pF, que torna restrita a distancia pratica da comunicação para poucos metros.

### Modelo de referência

O antes mencionado modelo de referência é um barramento com um clock (SCL) e linhas de dados (SDA) com endereçamento 7-bit. O barramento tem dois papeis para modos: mestre e escravo:
* Modo mestre - nodo que gera clock e inicia comunicação com escravos.
* Modo escravo - nodo que recebe o clock e responde quando endereçado pelo seu mestre.
O barramento é um barramento multimestre que significa que qualquer número de nodos mestre pode estar presente. O papel de mestre e escravo podem trocar durante mensagens (após receber um PARAR).
Pode haver quatro modos potenciais para operação de um determinado dispositivo de barramento, entretanto a maioria dos dispositivos usam um simples papel e são dois modos:
* mestre envia - Modo mestre envia dados para um escravo.
* mestre recebe - Modo mestre recebe dados de um escravo.
* escravo envia - Modo escravo manda dados para um mestre.
* escravo recebe - Modo escravo recebe dados de um mestre.
O mestre está inicialmente em modo mestre envia, enviando um bit inicial seguido de um endereço 7-bit do escravo que deseja se comunicar, que é seguido por um bit simples que deseja escrever(0) ou ler(1) do escravo.
Se o escravo existe no barramento então ele irá responder com um bit para saber se esta ativo aquele endereço. O mestre então continua em modo envia ou recebe e o escravo continua no seu modo complementar.
O bytes de endereço e dados são enviados pelo Bit mais significativo primeiro. O bit inicial é indicado por uma transição alta-para-baixa de SDA com alta SCL; o bit final é indicado por uma transição baixa-para-alta de SDA com alta SCL. Todas outras transições de SDA tomam posição com baixa SCL.
Se o mestre deseja escrever no escravo então ele manda um byte repetidamente com o escravo enviando um bit de atividade (mestre em modo envia e escravo em modo recebe).
Se o mestre deseja ler do escravo então repetidamente vai receber byte do escravo, o mestre enviando um bit de que foi recebido depois de cada byte menos o final (mestre em modo recebe e escravo em modo envia).
O mestre pode então terminar a transmissão enviando um bit para parar, ou enviar outro bit para iniciar se desejar controlar o barramento para outra transferência.

### Protocolos de mensagem

I²C define vários tipos básicos de mensagens, cada qual inicia com um INICIAR e um PARAR no final.
* Mensagem única onde o mestre escreve dados no escravo.
* Mensagem única onde o mestre lê dados de um escravo.
* Mensagens combinadas, onde o mestre requisita pelo menos duas leituras e/ou escritas em um ou mais escravos.
Em uma mensagem combinada, cada leitura ou escrita começa com um INICIAR e o endereço do escravo. Depois do primeiro INICIAR em uma mensagem combinada isto também é chamado de repetição de bits INICIAR. Bits INICIAR repetidos não são precedidos de bits PARAR, que é como escravos sabem quando a próxima transferência faz parte da mesma mensagem.
Na pratica, quase todos escravos adotam controle de modelos pedido/resposta, onde um ou mais bytes seguindo um comando de escrita são tratados como um comando e endereço. Estes bytes determinam o quanto subsequente bytes escritos são tratados e/ou quanto o escravo responde em leituras subsequentes. Maioria das operações SMBus envolvem comandos com único byte.

### Exemplo de mensagem: 24c32 EEPROM

Um exemplo específico é o 24c32 tipo EEPROM, que usa dois pedidos de bytes que são chamados de Endereço Alto e Endereço Baixo. Estes bytes são usados para endereçar bytes dentro de 32 kbit (4 kb) suportado pela EEPROM; o mesmo endereçamento de dois bytes é também usado por EEPROM mais largas, como as 24c512 armazenando 512 kbits (64kB). Lendo ou escrevendo dados para estas EEPROMs usa um protocolo simples: o endereço é escrito, e quando os dados são transferidos até o final da mensagem.
Uma mensagem simples escreve na EEPROM. Depois do INICIAR , o mestre manda o endereço do chip com a direção e o bit escrever(write), então manda os dois bytes de endereço de dados para o EEPROM e depois envia os bytes de dados para ser escritos começando por aquele endereço seguido de um PARAR. Quando escrever múltiplos bytes, todos os bytes devem estar na mesma página 32 byte. Quando está ocupado salvando aqueles bytes para a memória, o EEPROM não irá responder os próximos pedidos I²C. (É uma incompatibilidade com SMBus: dispositivos SMBus sempre devem responder para seus endereços de barramento.)
Para ler um endereço particular no EEPROM, a mensagem combinada é usada. Depois do iniciar, o mestre primeiro escreve o endereço do chip do barramento com a direção e bit escrever(write) e depois dois bytes com o endereço de dados do EEPROM. Manda repetidamente um INICIAR e o endereço de barramento do EEPROM com o bit de direção ler(read). Então o EEPROM irá responder com os bytes de dados começando no endereço de dados especificado - uma mensagem combinada, primeiro ler e depois ecrever. A cada leitura o mestre envia uma resposta exceto no ultimo byte e então identifica um PARAR. O EEPROM incrementa o endereço depois de cada byte tranferido; leituras de multi-byte pode retornar todo conteúdo do EEPROM usando uma mensagem combinada.

### Diagrama de tempo

* Dado tranferido é iniciado com um bit INICIAR (S) sinalizado com SDA sendo arrastado para baixo enquanto SCL continua alto.
* SDA coloca o primeiro dado em nível de bit enquanto mantendo SCL baixo (durante o tempo de barra azul.)
* O dado é recebido quando SCL aumenta (verde) para o primeiro bit (B1).
* Este processo repete, SDA em transição enquanto SCL está baixo, e os dados sendo lidos quando SCL estiver alto (B2, Bn).
* Um bit PARAR (P) é sinalizado quando SDA for puxado para cima enquanto o SCL está alto.

## Aplicações

I²C é apropriado onde a simplicidade e o baixo preço são mais importantes que a velocidade. Aplicações comuns de I²C são:
* Lendo dados de configuração de EEPROMs em memórias SDRAM, DDR SDRAM, DDR2 SDRAM e outras placas para PC.
* Suporta sistemas de gerenciamento para cartões PCI, por uma entrada SMBus 2.0.
* Acessando chips NVRAM que mantem configurações do usuário.
* Acessando Conversor analógico-digital e Conversor digital-analógico de baixa velocidade.
* Alterando contraste e cor das configurações em monitores.
* Alterando volume em alto falantes inteligentes.
* Controlando tela OLED/LCD, como em celulares.
* Lendo Relógio de tempo real.
* Ligando e desligando o recebimento de energia de componente do sistema.

## Sistemas operacionais suportados

* No AmigaOS um pode ser usado o componente i2c.resource para o AmigaOS 4.x ou a biblioteca compartilhada i2c.library por Wilhelm Noeker para sistemas mais velhos.
* Desenvolvedores Arduino podem usar a biblioteca 'Wire'.
* Maximite suporta comunicações I²C como parte de sua própria MMBasic.
* Picaxe usa comandos i²c e hi²c.
* ECos (sistema operacional) suporta i²c para diversas arquiteturas de hardware.
* ChibiOS/RT suporta i²c para diversas arquiteturas de hardware.
* FreeBSD, NetBSD e OpenBSD também fornece uma moldura I²C, com suporte de um numero controladores mestre e sensores.
* No Linux, I²C é manipulado com dispositivo de driver para outro dispositivo especifico, e outro para o adaptador I²C que está conectado. Várias centenas, como drivers, fazem parte dos recentes lançamentos.
* No OS X, existe mais ou menos duas dúzias de extensões I²C kernel que se comunicam com sensores para ler voltagem, corrente, temperatura, movimento, e outros estados físicos.
* No Microsoft Windows, I²C é implementado pelos respectivos dispositivos de drivers o quanto a industria tem de hardware disponível.

## Ferramentas de desenvolvimento

Quando desenvolvendo ou resolvendo sistemas usando I²C, a visibilidade do level do hardware pode ser importante.

### I²C adaptadores host

Há um número de soluções de hardware para computadores host, rodando Linux, Mac ou Windows, recursos I²C mestre e/ou escravo. Quase todos baseados em USB para adaptadores I²C. Nem todos requerem drivers proprietários ou API.

### I²C analisadores de protocolo

I²C analisadores de protocolo são ferramentas que testam um barramento I²C e decodificam sinais elétricos para prover um nível maior de visão dos dados sendo transmitidos pelo barramento.

### Analisadores lógicos

Quando desenvolvendo e/ou resolvendo o barramento I²C, examinação de sinais de hardware podem ser muito importante. Analisadores lógicos são ferramentas que coletam, analisam, decodificam e armazenam sinais para que as pessoas possam ver os formatos de onda em alta velocidade ao seu prazer. Analisadores lógicos mostram data e hora para cada mudança de nível de sinal, que pode ajudar a achar problemas de protocolo. A maioria dos analisadores lógicos tem a capacidade de decodificar sinais de barramentos em dados de protocolo de alto nível e mostrar dados ASCII.