I²C - I²C

Barramento I 2 C
I²C bus logo.svg
Modelo Barramento de comunicação serial
Designer Philips Semiconductor , conhecido hoje como NXP Semiconductors
Projetado 1982 ; 39 anos atrás ( 1982 )
Sinal de dados Coletor aberto ou dreno aberto
Largura 1 bit (SDA) com relógio separado (SCL)
Taxa de bits 0,1, 0,4, 1,0, 3,4 ou 5,0  Mbit / s dependendo do modo
Protocolo Serial , half-duplex

I 2 C ( Circuito Inter-integrado , olho-quadrado- C ), alternativamente conhecido como I2C ou IIC , é um barramento de comunicação serial síncrono , multimestre, multiescravo , comutado por pacote , terminação única , inventado em 1982 pela Philips Semicondutores . É amplamente usado para conectar CIs periféricos de baixa velocidade a processadores e microcontroladores em comunicação de curta distância dentro da placa.

Vários concorrentes, como Siemens , NEC , Texas Instruments , STMicroelectronics , Motorola , Nordic Semiconductor e Intersil , introduziram produtos I 2 C compatíveis no mercado desde meados da década de 1990.

O System Management Bus (SMBus), definido pela Intel em 1995, é um subconjunto de I 2 C, definindo um uso mais restrito. Um dos objetivos do SMBus é promover robustez e interoperabilidade. Consequentemente, os sistemas I 2 C modernos incorporam algumas políticas e regras do SMBus, às vezes suportando I 2 C e SMBus, exigindo apenas uma reconfiguração mínima por comando ou uso de pino de saída.

Formulários

Expansor de E / S I 2 C Microchip MCP23008 8 bits no pacote DIP-18

I 2 C é apropriado para periféricos onde a simplicidade e o baixo custo de fabricação são mais importantes do que a velocidade. As aplicações comuns do barramento I 2 C são:

Um ponto forte particular do I 2 C é a capacidade de um microcontrolador de controlar uma rede de chips de dispositivo com apenas dois pinos de E / S de uso geral e software. Muitas outras tecnologias de barramento usadas em aplicativos semelhantes, como o barramento de interface periférica serial (SPI), exigem mais pinos e sinais para conectar vários dispositivos.

Revisões

História dos lançamentos de especificações I 2 C
Ano Versão Notas Refs
1981 Patente Patente US 4.689.740 depositada em 2 de novembro de 1981 pela US Philips Corporation.
1982 Original O sistema I 2 C de 100 kbit / s foi criado como um sistema de barramento interno simples para a construção de componentes eletrônicos de controle com vários chips Philips. N / D
1992 1 Adicionado modo rápido de 400 kbit / s (Fm) e um modo de endereçamento de 10 bits para aumentar a capacidade para 1008 nós. Esta foi a primeira versão padronizada. N / D
1998 2 Adicionado o modo de alta velocidade (Hs) de 3,4 Mbit / s com requisitos de economia de energia para tensão e corrente elétrica. N / D
2000 2,1 Esclarecida a versão 2, sem alterações funcionais significativas.
2007 3 Adicionado 1 Mbit / s Fast-mode plus (Fm +) (usando drivers de 20 mA) e um mecanismo de ID de dispositivo.
2012 4 Adicionado 5 Mbit / s Fast-modo Ultra (UPM) para novo USDA (dados) e linhas USCL (relógio) usando push-pull lógica sem resistores pull-up ,
e acrescentou uma tabela fabricante ID atribuído. É apenas um barramento unidirecional .
2012 5 Erros corrigidos.
2014 6 Dois gráficos corrigidos. Este é o padrão atual.

Projeto

Um exemplo esquemático com um mestre (um microcontrolador ), três nós escravos (um ADC , um DAC e um microcontrolador) e resistores pull-up R p

I 2 C usa apenas duas linhas bidirecionais de coletor aberto ou dreno aberto : linha de dados serial (SDA) e linha de relógio serial (SCL), puxada com resistores . As tensões típicas usadas são +5 V ou +3,3 V, embora sistemas com outras tensões sejam permitidos.

O projeto de referência I 2 C tem um espaço de endereço de 7 bits , com uma extensão de 10 bits raramente usada. As velocidades comuns do barramento I 2 C são o modo padrão de 100  kbit / se o modo rápido de 400 kbit / s . Também existe um modo de baixa velocidade de 10 kbit / s , mas frequências de clock arbitrariamente baixas também são permitidas. As revisões posteriores do I 2 C podem hospedar mais nós e executar em velocidades mais rápidas ( modo rápido de 400 kbit / s , modo rápido de 1 Mbit / s mais , modo de alta velocidade de 3,4  Mbit / s e modo ultra-rápido deMbit / s ) . Essas velocidades são mais amplamente utilizadas em sistemas embarcados do que em PCs.

Observe que as taxas de bits são cotadas para as transferências entre mestre e escravo sem esticar o clock ou outro overhead de hardware. Os overheads de protocolo incluem um endereço escravo e talvez um endereço de registro dentro do dispositivo escravo, bem como bits ACK / NACK por byte. Assim, a taxa de transferência real dos dados do usuário é menor do que aquelas taxas de bits de pico por si só implicariam. Por exemplo, se cada interação com um escravo permite que apenas 1 byte de dados seja transferido de maneira ineficiente, a taxa de dados será menor que a metade da taxa de bits de pico.

O número de nós que podem existir em um determinado barramento I 2 C é limitado pelo espaço de endereço e também pela capacitância total do barramento de 400  pF , que restringe as distâncias práticas de comunicação a alguns metros. A impedância relativamente alta e a baixa imunidade a ruído requerem um potencial de aterramento comum, o que novamente restringe o uso prático para comunicação dentro da mesma placa de circuito impresso ou pequeno sistema de placas.

Modos I 2 C
Modo Velocidade
máxima

Capacitância máxima
Dirigir Direção
Modo padrão (Sm) 100 kbit / s 400 pF Dreno aberto * Bidirecional
Modo rápido (Fm) 400 kbit / s 400 pF Dreno aberto * Bidirecional
Modo rápido mais (Fm +) 1 Mbit / s 550 pF Dreno aberto * Bidirecional
Modo de alta velocidade (Hs) 1,7 Mbit / s 400 pF Dreno aberto * Bidirecional
Modo de alta velocidade (Hs) 3,4 Mbit / s 100 pF Dreno aberto * Bidirecional
Modo ultrarrápido (UFm) 5 Mbit / s ? Empurrar puxar Unidirecional
  • Nota: dreno aberto significa coletor aberto também.

Design de referência

O projeto de referência mencionado é um barramento com linhas de relógio (SCL) e dados (SDA) com endereçamento de 7 bits. O barramento tem duas funções para os nós: mestre e escravo:

  • Nó mestre - nodo que gera o relógio e inicia a comunicação com os escravos.
  • Nó escravo - nó que recebe o relógio e responde quando endereçado pelo mestre.

O barramento é um barramento multimestre , o que significa que qualquer número de nós mestres pode estar presente. Além disso, as funções de mestre e escravo podem ser alteradas entre as mensagens (após o envio de um STOP).

Pode haver quatro modos potenciais de operação para um determinado dispositivo de barramento, embora a maioria dos dispositivos use apenas uma única função e seus dois modos:

  • transmissão mestre - o nó mestre está enviando dados para um escravo,
  • recebimento mestre - o nó mestre está recebendo dados de um escravo,
  • transmissão escravo - o nó escravo está enviando dados para o mestre,
  • escravo receber - o nó escravo está recebendo dados do mestre.

Além dos bits de dados 0 e 1, o barramento I 2 C permite sinais START e STOP especiais que atuam como delimitadores de mensagem e são distintos dos bits de dados. (Isso está em contraste com os bits de início e de parada usados ​​na comunicação serial assíncrona , que se distinguem dos bits de dados apenas por seu tempo.)

O mestre está inicialmente no modo de transmissão mestre enviando um START seguido pelo endereço de 7 bits do escravo com o qual deseja se comunicar, que é finalmente seguido por um único bit que representa se deseja escrever (0) ou ler (1 ) do escravo.

Se o escravo existir no barramento, ele responderá com um bit ACK (ativo baixo para confirmado) para esse endereço. O mestre então continua no modo de transmissão ou recepção (de acordo com o bit de leitura / gravação enviado), e o escravo continua no modo complementar (recepção ou transmissão, respectivamente).

O endereço e os bytes de dados são enviados o bit mais significativo primeiro. A condição inicial é indicada por uma transição de alto para baixo de SDA com SCL alto; a condição de parada é indicada por uma transição de baixo para alto de SDA com SCL alto. Todas as outras transições de SDA ocorrem com SCL baixo.

Se o mestre deseja escrever para o escravo, ele envia repetidamente um byte com o escravo enviando um bit ACK. (Nesta situação, o mestre está no modo de transmissão mestre e o escravo está no modo de recepção escravo.)

Se o mestre deseja ler do escravo, ele recebe repetidamente um byte do escravo, o mestre enviando um bit ACK após cada byte, exceto o último. (Nesta situação, o mestre está no modo de recepção mestre e o escravo está no modo de transmissão escravo.)

Uma transação I 2 C pode consistir em várias mensagens. O mestre termina uma mensagem com uma condição STOP se este for o fim da transação ou pode enviar outra condição START para reter o controle do barramento para outra mensagem (uma transação de "formato combinado").

Protocolos de mensagem

I 2 C define tipos básicos de transações, cada uma das quais começa com um START e termina com um STOP:

  • Mensagem única em que um mestre grava dados em um escravo.
  • Mensagem única em que um mestre lê os dados de um escravo.
  • Formato combinado, em que um mestre emite pelo menos duas leituras ou gravações para um ou mais escravos.

Em uma transação combinada, cada leitura ou gravação começa com um START e o endereço do escravo. As condições de START após a primeira também são chamadas de bits de START repetidos . STARTs repetidos não são precedidos por condições STOP, que é como os escravos sabem que a próxima mensagem faz parte da mesma transação.

Qualquer escravo fornecido responderá apenas a certas mensagens, conforme especificado na documentação do produto.

Os sistemas I 2 C puros suportam estruturas de mensagens arbitrárias. O SMBus está restrito a nove dessas estruturas, como ler a palavra N e escrever a palavra N , envolvendo um único escravo. O PMBus estende o SMBus com um protocolo de Grupo , permitindo que várias dessas transações SMBus sejam enviadas em uma mensagem combinada. O encerramento STOP indica quando essas ações agrupadas devem entrar em vigor. Por exemplo, uma operação do PMBus pode reconfigurar três fontes de alimentação (usando três endereços diferentes de escravos I 2 C) e suas novas configurações entrarão em vigor ao mesmo tempo: quando eles receberem esse STOP.

Com apenas algumas exceções, nem I 2 C nem SMBus definem a semântica da mensagem, como o significado dos bytes de dados nas mensagens. A semântica da mensagem é, de outra forma, específica do produto. Essas exceções incluem mensagens endereçadas ao endereço de chamada geral I 2 C (0x00) ou ao endereço de resposta de alerta SMBus ; e mensagens envolvidas no protocolo de resolução de endereços SMBus (ARP) para alocação e gerenciamento de endereços dinâmicos.

Na prática, a maioria dos escravos adota modelos de controle de solicitação-resposta, onde um ou mais bytes após um comando de gravação são tratados como um comando ou endereço. Esses bytes determinam como os bytes gravados subsequentes são tratados ou como o escravo responde nas leituras subsequentes. A maioria das operações SMBus envolve comandos de byte único.

Exemplo de mensagem: 24C32 EEPROM

STMicroelectronics 24C08: EEPROM serial com barramento I 2 C

Um exemplo específico é o tipo EEPROM 24C32 , que usa dois bytes de solicitação que são chamados de Endereço Alto e Endereço Baixo. (Conseqüentemente, esses EEPROMs não são utilizáveis ​​por hosts SMBus puros, que suportam apenas comandos ou endereços de byte único.) Esses bytes são usados ​​para bytes de endereçamento dentro do espaço de endereço EEPROM de 32  kbit (ou 4  kB ). O mesmo endereçamento de dois bytes também é usado por EEPROMs maiores, como o 24C512 que armazena 512 kbits (ou 64 kB). A escrita e leitura de dados nessas EEPROMs usa um protocolo simples: o endereço é escrito e os dados são transferidos até o final da mensagem. A parte de transferência de dados do protocolo pode causar problemas no SMBus, uma vez que os bytes de dados não são precedidos por uma contagem e mais de 32 bytes podem ser transferidos de uma vez. I 2 C EEPROMs menores que 32 kbit, como o 24C02 de 2 kbit, são freqüentemente usados ​​no SMBus com transferências de dados de byte único ineficientes para superar esse problema.

Uma única mensagem é gravada na EEPROM. Após o START, o mestre envia o endereço de barramento do chip com o bit de direção limpo ( gravação ), em seguida, envia o endereço de dois bytes de dados dentro da EEPROM e, em seguida, envia os bytes de dados a serem escritos a partir desse endereço, seguido por um STOP. Ao gravar vários bytes, todos os bytes devem estar na mesma página de 32 bytes. Enquanto estiver ocupado salvando esses bytes na memória, a EEPROM não responderá a outras solicitações de I 2 C. (Essa é outra incompatibilidade com o SMBus: os dispositivos SMBus devem sempre responder aos seus endereços de barramento.)

Para ler começando em um endereço específico na EEPROM, uma mensagem combinada é usada. Depois de um START, o mestre primeiro escreve o endereço de barramento do chip com o bit de direção livre ( escrever ) e, em seguida, os dois bytes do endereço de dados EEPROM. Em seguida, ele envia um START (repetido) e o endereço de barramento da EEPROM com o bit de direção definido ( lido ). A EEPROM irá então responder com os bytes de dados começando no endereço de dados EEPROM especificado - uma mensagem combinada: primeiro uma escrita, depois uma leitura. O mestre emite um ACK após cada byte lido, exceto o último byte, e então emite um STOP. A EEPROM incrementa o endereço após cada byte de dados transferido; as leituras de vários bytes podem recuperar todo o conteúdo da EEPROM usando uma mensagem combinada.

Camada física

Barramento I 2 C: R p são resistores pull-up, R s são resistores em série opcionais.

Na camada física , as linhas SCL e SDA são um projeto de barramento de dreno aberto ( MOSFET ) ou coletor aberto ( BJT ), portanto, um resistor pull-up é necessário para cada linha. Um "0" lógico é gerado puxando a linha para o terra, e um "1" lógico é produzido deixando a linha flutuar ( alta impedância de saída ) de forma que o resistor pull-up a puxa para cima. Uma linha nunca é ativamente elevada. Essa fiação permite que vários nós se conectem ao barramento sem curtos-circuitos de contenção de sinal. Os sistemas de alta velocidade (e alguns outros) podem usar uma fonte de corrente em vez de um resistor para puxar apenas SCL ou SCL e SDA, para acomodar uma capacitância de barramento mais alta e permitir tempos de subida mais rápidos.

Uma consequência importante disso é que vários nós podem estar conduzindo as linhas simultaneamente. Se algum nó estiver conduzindo a linha para baixo, ele será baixo. Os nós que estão tentando transmitir um nó lógico (ou seja, deixando a linha flutuar alto) podem detectar isso e concluir que outro nó está ativo ao mesmo tempo.

Quando usado no SCL, isso é chamado de alongamento do relógio e é um mecanismo de controle de fluxo para escravos. Quando usado no SDA, isso é chamado de arbitragem e garante que haja apenas um transmissor por vez.

Quando ocioso, ambas as linhas ficam altas. Para iniciar uma transação, o SDA é reduzido enquanto o SCL permanece alto. É ilegal transmitir um marcador de parada liberando SDA para flutuar alto novamente (embora essa "mensagem de vazio" geralmente seja inofensiva), então a próxima etapa é puxar o SCL para baixo.

Exceto para os sinais de início e parada, a linha SDA só muda enquanto o relógio está baixo; transmitir um bit de dados consiste em pulsar a linha do relógio para cima enquanto mantém a linha de dados estável no nível desejado.

Enquanto o SCL está baixo, o transmissor (inicialmente o mestre) define o SDA para o valor desejado e (após um pequeno atraso para permitir que o valor se propague) permite que o SCL flutue alto. O mestre então espera que o SCL realmente vá alto; isso será atrasado pelo tempo de subida finito do sinal SCL (a constante de tempo RC do resistor pull-up e a capacitância parasita do barramento) e pode ser adicionalmente atrasado pelo alongamento do relógio do escravo.

Uma vez que o SCL está alto, o mestre espera um tempo mínimo (4 μs para velocidade padrão I 2 C) para garantir que o receptor tenha visto o bit e, em seguida, puxa-o para baixo novamente. Isso completa a transmissão de um bit.

Após cada 8 bits de dados em uma direção, um bit de "reconhecimento" é transmitido na outra direção. O transmissor e o receptor trocam de função para um bit, e o receptor original transmite de volta um único bit "0" (ACK). Se o transmissor vir um bit "1" (NACK), ele aprenderá que:

  • (Se o mestre estiver transmitindo para o escravo) O escravo é incapaz de aceitar os dados. Não existe tal escravo, comando não compreendido ou incapaz de aceitar mais dados.
  • (Se o escravo estiver transmitindo para o mestre) O mestre deseja que a transferência pare após este byte de dados.

Apenas a linha SDA muda de direção durante os bits de reconhecimento; o SCL é sempre controlado pelo mestre.

Após o bit de reconhecimento, a linha do clock está baixa e o mestre pode fazer uma das três coisas:

  • Comece a transferir outro byte de dados: o transmissor define SDA e o mestre pulsa SCL alto.
  • Envie um "Stop": defina o SDA para baixo, deixe o SCL para o alto e, em seguida, deixe o SDA para o alto. Isso libera o barramento I 2 C.
  • Envie um "Início repetido": defina SDA alto, deixe SCL ir alto e, em seguida, puxe SDA baixo novamente. Isso inicia uma nova mensagem de barramento I 2 C sem liberar o barramento.

Alongamento do relógio usando SCL

Uma das características mais significativas do protocolo I 2 C é o alongamento do relógio. Um dispositivo escravo endereçado pode manter a linha de clock (SCL) baixa após receber (ou enviar) um byte, indicando que ainda não está pronto para processar mais dados. O mestre que está se comunicando com o escravo pode não terminar a transmissão do bit atual, mas deve esperar até que a linha do clock realmente fique alta. Se o escravo for alongamento do relógio, a linha do relógio ainda estará baixa (porque as conexões estão abertas ). O mesmo é verdadeiro se um segundo mestre, mais lento, tentar acionar o relógio ao mesmo tempo. (Se houver mais de um mestre, todos, exceto um deles, normalmente perderão a arbitragem.)

O mestre deve esperar até observar a linha do relógio aumentando e um tempo mínimo adicional (4 μs para padrão 100 kbit / s I 2 C) antes de diminuir o relógio novamente.

Embora o mestre também possa manter a linha SCL baixa pelo tempo que desejar (isso não é permitido na mais nova Rev. 6 do protocolo - subseção 3.1.1), o termo "alongamento do relógio" é normalmente usado apenas quando os escravos o fazem . Embora em teoria qualquer pulso de clock possa ser alongado, geralmente são os intervalos antes ou depois do bit de confirmação que são usados. Por exemplo, se o escravo for um microcontrolador , sua interface I 2 C pode esticar o relógio após cada byte, até que o software decida se enviará uma confirmação positiva ou um NACK.

O alongamento do relógio é o único momento em I 2 C em que o escravo dirige o SCL. Muitos escravos não precisam esticar o clock e, portanto, tratam o SCL estritamente como uma entrada, sem nenhum circuito para acioná-lo. Alguns mestres, como os encontrados em ASICs personalizados, podem não oferecer suporte ao alongamento do relógio; frequentemente, esses dispositivos serão rotulados como uma "interface de dois fios" e não I 2 C.

Para garantir uma taxa de transferência de barramento mínima , o SMBus impõe limites sobre a distância que os relógios podem ser aumentados. Hosts e escravos que aderem a esses limites não podem bloquear o acesso ao barramento por mais do que um curto período, o que não é uma garantia feita por sistemas I 2 C puros .

Arbitragem usando SDA

Cada mestre monitora o barramento quanto aos bits de partida e parada e não inicia uma mensagem enquanto outro mestre estiver mantendo o barramento ocupado. No entanto, dois mestres podem iniciar a transmissão mais ou menos ao mesmo tempo; neste caso, ocorre a arbitragem. O modo de transmissão escravo também pode ser arbitrado, quando um mestre endereça vários escravos, mas isso é menos comum. Em contraste com os protocolos (como Ethernet ) que usam atrasos de retirada aleatórios antes de emitir uma nova tentativa, I 2 C tem uma política de arbitragem determinística. Cada transmissor verifica o nível da linha de dados (SDA) e o compara com os níveis esperados; se eles não corresponderem, esse transmissor perdeu a arbitragem e sai desta interação de protocolo.

Se um transmissor definir SDA para 1 (não direcionando um sinal) e um segundo transmissor definir para 0 (puxar para o solo), o resultado é que a linha está baixa. O primeiro transmissor então observa que o nível da linha é diferente do esperado e conclui que outro nó está transmitindo. O primeiro nó a notar tal diferença é aquele que perde a arbitragem: ele para de conduzir o SDA. Se for um mestre, ele também para de dirigir o SCL e espera por um STOP; então, ele pode tentar reeditar sua mensagem inteira. Nesse ínterim, o outro nó não notou nenhuma diferença entre os níveis esperados e reais no SDA e, portanto, continua a transmissão. Ele pode fazer isso sem problemas porque até agora o sinal tem sido exatamente o que esperava; nenhum outro transmissor perturbou sua mensagem.

Se os dois mestres estão enviando uma mensagem para dois escravos diferentes, aquele que envia o endereço do escravo inferior sempre "ganha" a arbitragem no estágio de endereço. Visto que os dois mestres podem enviar mensagens para o mesmo endereço de escravo, e os endereços às vezes se referem a vários escravos, a arbitragem às vezes deve continuar nos estágios de dados.

A arbitragem ocorre muito raramente, mas é necessária para o suporte multi-master adequado. Tal como acontece com o alongamento do relógio, nem todos os dispositivos oferecem suporte à arbitragem. Aqueles que o fazem, geralmente se autodenominam como suporte à comunicação "multimestre".

Um caso que deve ser tratado com cuidado em implementações multimestre I 2 C é o dos mestres conversando entre si. Um mestre pode perder a arbitragem para uma mensagem recebida e deve mudar sua função de mestre para escravo a tempo de reconhecer seu próprio endereço.

No caso extremamente raro de dois mestres enviarem mensagens idênticas simultaneamente, ambos considerarão a comunicação bem-sucedida, mas o escravo verá apenas uma mensagem. Por este motivo, quando um escravo pode ser acessado por vários mestres, todo comando reconhecido pelo escravo deve ser idempotente ou ter a garantia de nunca ser emitido por dois mestres ao mesmo tempo. (Por exemplo, um comando que é emitido por apenas um mestre não precisa ser idempotente, nem é necessário que um comando específico seja idempotente quando algum mecanismo de exclusão mútua garante que apenas um mestre pode ser obrigado a emitir esse comando a qualquer momento .)

Arbitragem em SMBus

Enquanto I 2 C apenas arbitra entre mestres, o SMBus usa a arbitragem em três contextos adicionais, onde vários escravos respondem ao mestre e um recebe sua mensagem.

  • Embora conceitualmente um barramento mestre único, um dispositivo escravo que suporta o "protocolo de notificação de host" atua como um mestre para realizar a notificação. Ele apreende o barramento e grava uma mensagem de 3 bytes no endereço reservado "Host SMBus" (0x08), passando seu endereço e dois bytes de dados. Quando dois escravos tentam notificar o host ao mesmo tempo, um deles perderá a arbitragem e precisará tentar novamente.
  • Um sistema de notificação de escravo alternativo usa o sinal SMBALERT # separado para solicitar atenção. Nesse caso, o host executa uma leitura de 1 byte do "Endereço de Resposta de Alerta SMBus" reservado (0x0C), que é um tipo de endereço de broadcast. Todos os escravos de alerta respondem com bytes de dados contendo seus próprios endereços. Quando o escravo transmite com sucesso seu próprio endereço (vencendo arbitragem contra outros), ele para de gerar essa interrupção. Neste e no caso anterior, a arbitragem garante que a mensagem de um escravo seja recebida e os outros saberão que devem tentar novamente.
  • O SMBus também oferece suporte a um "protocolo de resolução de endereço", em que os dispositivos retornam um "ID universal de dispositivo" ( UDID ) de 16 bytes . Vários dispositivos podem responder; aquele com o menor UDID vencerá a arbitragem e será reconhecido.

Arbitragem na PMBus

O PMBus versão 1.3 estende o protocolo de resposta de alerta SMBus em seu protocolo de "leitura de zona". Os escravos podem ser agrupados em "zonas", e todos os escravos em uma zona podem ser endereçados para responder, com suas respostas mascaradas (omitindo informações indesejadas), invertidas (as informações desejadas são enviadas como 0 bits, que vencem a arbitragem) ou reordenadas ( portanto, as informações mais significativas são enviadas primeiro). A arbitragem garante que a resposta de maior prioridade seja a que é retornada primeiro ao mestre.

O PMBus reserva os endereços I 2 C 0x28 e 0x37 para leituras e gravações de zona, respectivamente.

Diferenças entre modos

Existem vários modos de operação possíveis para a comunicação I 2 C. Todos são compatíveis no sentido de que o modo padrão de 100 kbit / s pode sempre ser usado, mas combinar dispositivos de diferentes capacidades no mesmo barramento pode causar problemas, como segue:

  • O modo rápido é altamente compatível e simplesmente aperta vários dos parâmetros de tempo para atingir a velocidade de 400 kbit / s. O modo rápido é amplamente suportado por dispositivos escravos I 2 C, portanto, um mestre pode usá-lo desde que saiba que a capacitância do barramento e a força de pull-up permitem.
  • O modo rápido plus atinge até 1 Mbit / s usando drivers e pull-ups mais potentes (20 mA) para obter tempos de subida e descida mais rápidos. A compatibilidade com dispositivos de modo padrão e rápido (com capacidade de pull-down de 3 mA) pode ser alcançada se houver alguma maneira de reduzir a força dos pull-ups ao falar com eles.
  • O modo de alta velocidade (3,4 Mbit / s) é compatível com dispositivos I 2 C normais no mesmo barramento, mas requer que o mestre tenha um pull-up ativo na linha do relógio que é habilitado durante transferências de alta velocidade. O primeiro bit de dados é transferido com uma borda ascendente de clock normal de dreno aberto, que pode ser esticada. Para os sete bits de dados restantes e o ACK, o mestre aumenta o clock no momento apropriado e o escravo pode não esticá-lo. Todas as transferências de alta velocidade são precedidas por um "código mestre" de um byte em velocidade rápida ou padrão. Este código tem três finalidades:
    1. diz aos dispositivos escravos de alta velocidade para mudar para as regras de temporização de alta velocidade,
    2. garante que dispositivos de velocidade rápida ou normal não tentarão participar da transferência (porque não corresponde a seu endereço), e
    3. porque identifica o mestre (há oito códigos mestre e cada mestre deve usar um diferente), garante que a arbitragem seja concluída antes da parte de alta velocidade da transferência e, portanto, a parte de alta velocidade não precisa fazer concessões para essa habilidade.
  • O modo Ultra-Fast é essencialmente um subconjunto I 2 C de somente gravação , que é incompatível com outros modos, exceto pelo fato de ser fácil adicionar suporte a um design de hardware de interface I 2 C existente . Apenas um mestre é permitido, e ele aciona ativamente as linhas de dados o tempo todo para atingir uma taxa de transferência de 5 Mbit / s. O alongamento do relógio, a arbitragem, as transferências de leitura e as confirmações são todos omitidos. Destina-se principalmente a telas de LED animadas em que um erro de transmissão causaria apenas uma breve falha visual inconseqüente . A semelhança com outros modos de barramento I 2 C é limitada a:
    • as condições de início e parada são usadas para delimitar transferências,
    • O endereçamento I 2 C permite que vários dispositivos escravos compartilhem o barramento sem sinais de seleção de escravo estilo barramento SPI , e
    • um nono pulso de relógio é enviado por byte transmitido marcando a posição dos bits de confirmação não utilizados.

Alguns dos fornecedores fornecem o chamado modo Turbo não padrão com uma velocidade de até 1,4 Mbit / s.

Em todos os modos, a frequência do clock é controlada pelo (s) mestre (s), e um barramento mais longo do que o normal pode ser operado a uma velocidade mais lenta do que a nominal por underclock .

Interconexões de circuito

Uma placa ADC de 16 bits com interface I 2 C

I 2 C é popular para fazer a interface de circuitos periféricos a sistemas de prototipagem, como o Arduino e o Raspberry Pi . I 2 C não emprega um conector padronizado, no entanto, os projetistas da placa criaram vários esquemas de fiação para interconexões I 2 C. Para minimizar os possíveis danos devido à conexão de cabeçalhos de 0,1 polegada ao contrário, alguns desenvolvedores sugeriram o uso de sinal alternado e conexões de energia dos seguintes esquemas de fiação: (GND, SCL, VCC, SDA) ou (VCC, SDA, GND, SCL) .

A grande maioria dos aplicativos usa I 2 C da maneira como foi originalmente projetado - CIs periféricos conectados diretamente a um processador na mesma placa de circuito impresso e, portanto, em distâncias relativamente curtas de menos de 1 pé (30 cm), sem um conector . No entanto, usando um driver diferencial, uma versão alternativa do I 2 C pode se comunicar até 20 metros (possivelmente mais de 100 metros) por meio de CAT5 ou outro cabo.

Vários conectores padrão transportam sinais I 2 C. Por exemplo, o conector UEXT carrega I 2 C; o conector iPack de 10 pinos carrega I 2 C; o conector 6P6C Lego Mindstorms NXT carrega I 2 C; algumas pessoas usam os conectores 8P8C e cabo CAT5 normalmente utilizados para Ethernet camada física , em vez disso transportam diferencial codificada-I 2 sinais de C ou potenciado single-ended I 2 sinais de C; e todos os conectores HDMI e DVI e VGA carregam dados DDC2 em I 2 C.

Buffer e multiplexação

Quando há muitos dispositivos I 2 C em um sistema, pode haver a necessidade de incluir buffers de barramento ou multiplexadores para dividir grandes segmentos de barramento em menores. Isso pode ser necessário para manter a capacitância de um segmento de barramento abaixo do valor permitido ou para permitir que vários dispositivos com o mesmo endereço sejam separados por um multiplexador. Existem muitos tipos de multiplexadores e buffers e todos devem levar em consideração o fato de que as linhas I 2 C são especificadas para serem bidirecionais. Multiplexadores podem ser implementados com interruptores analógicos, que podem ligar um segmento a outro. As chaves analógicas mantêm a natureza bidirecional das linhas, mas não isolam a capacitância de um segmento de outro nem fornecem capacidade de buffer.

Buffers podem ser usados ​​para isolar a capacitância em um segmento de outro e / ou permitir que I 2 C seja enviado por cabos mais longos ou traços. Buffers para linhas bidirecionais como I 2 C devem usar um dos vários esquemas para evitar travamento. I 2 C é dreno aberto, portanto, os buffers devem conduzir uma baixa em um lado quando virem uma baixa no outro. Um método para prevenir o travamento é um buffer ter níveis de entrada e saída cuidadosamente selecionados de forma que o nível de saída de seu driver seja maior do que seu limite de entrada, evitando que ele seja acionado. Por exemplo, um buffer pode ter um limite de entrada de 0,4 V para detectar um nível baixo, mas um nível baixo de saída de 0,5 V. Este método requer que todos os outros dispositivos no barramento tenham limites que são compatíveis e muitas vezes significa que vários buffers implementando isso esquema não pode ser colocado em série com o outro.

Alternativamente, existem outros tipos de buffers que implementam amplificadores de corrente ou controlam o estado (ou seja, qual lado levou o barramento para baixo) para evitar travamento. O método de estado normalmente significa que um pulso não intencional é criado durante uma transferência quando um lado está levando o barramento para baixo, então o outro o leva para baixo, então o primeiro lado é liberado (isso é comum durante uma confirmação de I 2 C).

Compartilhando SCL entre vários ônibus

Ao ter um único mestre, é possível ter vários barramentos I 2 C compartilhando a mesma linha SCL. Os pacotes em cada barramento são enviados um após o outro ou ao mesmo tempo. Isso é possível porque a comunicação em cada barramento pode ser subdividida em períodos curtos alternados com SCL alto seguidos de períodos curtos com SCL baixo. E o relógio pode ser esticado, se um ônibus precisar de mais tempo em um estado.

As vantagens são usar dispositivos escravos com o mesmo endereço ao mesmo tempo e economizar conexões ou um throughput mais rápido usando várias linhas de dados ao mesmo tempo.

Tabela de estado de linha

Essas tabelas mostram os vários estados atômicos e operações de bits que podem ocorrer durante uma mensagem I 2 C.

Estado da linha
Modelo Ônibus inativo

(N)

Começar

(S)

Ocioso

(eu)

Pare

(P)

Alongamento do relógio

(CS)

Observação Livre para reivindicar arbitragem Reivindicação de ônibus (mestre) Ônibus reivindicado (mestre) Liberação de ônibus (mestre) Pausado por escravo
SDA Pullup passivo Borda de queda (mestre) Mantido baixo (mestre) Borda ascendente (mestre) Não se importe
SCL Pullup passivo Pullup passivo Pullup passivo Pullup passivo Mantido baixo (escravo)
Estado da linha
Modelo Enviando um bit de dados (1) (0)

(SDA é definido / amostrado após SCL para evitar a detecção de falso estado)

Resposta do receptor com bit ACK

(Byte recebido do remetente)

Resposta do receptor com bit NACK

(Byte não recebido do remetente)

Configuração de bits (Bs) Pronto para provar (Bx) Configuração de bits (Bs) ACK (A) Configuração de bits (Bs) NACK (A ')
Observação Bit de definição do remetente (mestre / escravo) Bit de amostra do receptor (mestre / escravo) Emissor transmissor hi-Z O remetente vê que o SDA está baixo Emissor transmissor hi-Z O remetente vê que o SDA está alto
SDA Definir bit (após a queda de SCL) Bit de captura (após o aumento de SCL) Mantido baixo pelo receptor (após a queda do SCL) Impulsionado alto (ou alto passivo) pelo receptor (após a queda do SCL)
SCL Borda de queda (mestre) Borda ascendente (mestre) Borda de queda (mestre) Borda ascendente (mestre) Borda de queda (mestre) Borda ascendente (mestre)
Estado da linha (início repetido)
Modelo Configurando para um sinal (Sr) após um ACK / NACK Início repetido (Sr)
Observação Comece aqui a partir de ACK Evitando estado de parada (P) Comece aqui com NACK Igual ao sinal de início (S)
SDA Foi mantido baixo para ACK Vanguarda em ascensão Alta passiva Alta passiva Borda de queda (mestre)
SCL Borda de queda (mestre) Mantido baixo Borda ascendente (mestre) Alta passiva Pullup passivo

Estrutura de endereçamento

Endereçamento de 7 bits

Campo: S Campo de endereço I 2 C R / W ' UMA Sequências de mensagens I 2 C ... P
Modelo Começar Byte 1 ACK Byte X etc ...

Resto da leitura ou gravação

a mensagem vai aqui

Pare
Posição do bit no byte X 7 6 5 4 3 2 1 0
Endereço de 7 bits pos 7 6 5 4 3 2 1
Observação MSB LSB 1 = ler
0 = escrever

Endereçamento de 10 bits

Campo: S Indicador de modo de 10 bits Endereço superior R / W ' UMA Campo de endereço inferior Sequências de mensagem I 2 C P
Modelo Começar Byte 1 ACK Byte 2 Byte X etc.

Resto da leitura ou gravação

a mensagem vai aqui

Pare
Posição do bit no byte X 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Valor de bit 1 1 1 1 0 X X X X X X X X X X X
Endereço de 10 bits pos 10 9 8 7 6 5 4 3 2 1
Observação Indica modo de 10 bits MSB 1 = ler LSB
0 = escrever

Endereços reservados em espaço de endereço de 7 bits

Dois grupos de endereços são reservados para funções especiais:

  • 0000 XXX
  • 1111 XXX
Índice de
endereços reservados
Byte de 8 bits Descrição
Endereço de 7 bits Valor R / W
MSB
(4 bits)
LSB
(3 bits)
1 bit
1 0000 000 0 Chamada geral
2 0000 000 1 Byte inicial
3 0000 001 X Endereço CBUS
4 0000 010 X Reservado para diferentes formatos de ônibus
5 0000 011 X Reservado para uso futuro
6 0000 1XX X Código mestre modo HS
7 1111 1XX 1 Identificador do dispositivo
8 1111 0XX X Endereçamento escravo de 10 bits

O SMBus reserva alguns endereços adicionais. Em particular, 0001 000é reservado para o host SMBus, que pode ser usado por dispositivos com capacidade de mestre, 0001 100é o "endereço de resposta de alerta SMBus" que é pesquisado pelo host após uma interrupção fora de banda, e 1100 001é o endereço padrão que é inicialmente usado por dispositivos capazes de atribuição dinâmica de endereços.

Endereços não reservados no espaço de endereço de 7 bits

MSB (4 bits) Uso típico
0001 Receptores digitais, SMBus
0010 Decodificadores de linha de vídeo de TV, IPMB
0011 Codecs AV
0100 Codificadores de vídeo, expansores GPIO
0101 Barramento ACCESS , PMBus
0110 VESA DDC , PMBus
0111 Controlador de exibição
1000 Processamento de sinal de TV, processamento de áudio, SMBus
1001 Comutação AV, ADCs e DACs , IPMB , SMBus
1010 Memória de armazenamento, relógio em tempo real
1011 Processadores AV
1100 PLLs e sintonizadores, moduladores e demoduladores, SMBus
1101 Processadores e decodificadores AV, amplificadores de potência de áudio, SMBus
1110 Conversores de espaço de cores AV

Embora o MSB 1111 seja reservado para ID de dispositivo e endereçamento escravo de 10 bits, ele também é usado por dispositivos dependentes de exibição VESA DDC , como dispositivos apontadores .

Formato de transação

Uma transação I 2 C consiste em uma ou mais mensagens . Cada mensagem começa com um símbolo de início e a transação termina com um símbolo de parada. Os símbolos de início após o primeiro, que iniciam uma mensagem, mas não uma transação, são chamados de símbolos de início repetidos .

Cada mensagem é lida ou escrita. Uma transação que consiste em uma única mensagem é chamada de transação de leitura ou gravação. Uma transação que consiste em várias mensagens é chamada de transação combinada. A forma mais comum do último é uma mensagem escrita fornecendo informações de endereço intra-dispositivo, seguida por uma mensagem lida.

Muitos dispositivos I 2 C não distinguem entre uma transação combinada e as mesmas mensagens enviadas como transações separadas, mas não todas. O protocolo de ID do dispositivo requer uma única transação; escravos são proibidos de responder se observarem um símbolo de parada. Os modos de configuração, calibração ou autoteste que fazem com que o escravo responda de maneira incomum também são encerrados automaticamente no final de uma transação.

Diagrama de tempo

Sequência de transferência de dados
  1. A transferência de dados é iniciada com uma condição de início (S) sinalizada por SDA sendo puxada para baixo enquanto SCL permanece alto.
  2. SCL é puxado para baixo e SDA define o primeiro nível de bit de dados enquanto mantém SCL baixo (durante o tempo de barra azul).
  3. Os dados são amostrados (recebidos) quando SCL aumenta para o primeiro bit (B1). Para um bit ser válido, SDA não deve mudar entre uma borda ascendente de SCL e a borda descendente subsequente (todo o tempo da barra verde).
  4. Este processo se repete, a transição do SDA enquanto o SCL está baixo e os dados sendo lidos enquanto o SCL é alto (B2 a Bn).
  5. O bit final é seguido por um pulso de clock, durante o qual SDA é puxado para baixo em preparação para o bit de parada .
  6. Uma condição de parada (P) é sinalizada quando o SCL aumenta, seguido pelo aumento do SDA.

Para evitar a detecção de marcadores falsos, há um atraso mínimo entre a borda descendente do SCL e a mudança do SDA, e entre a mudança do SDA e a borda ascendente do SCL. Observe que uma mensagem I 2 C contendo n bits de dados (incluindo confirmações) contém n + 1 pulsos de clock.

Exemplo de bit-banging do protocolo mestre I 2 C

Abaixo está um exemplo de bit-banging do protocolo I 2 C como um mestre I 2 C. O exemplo é escrito em pseudo C . Ele ilustra todos os recursos I 2 C descritos antes (alongamento do clock, arbitragem, bit de início / parada, ack / nack).

// Hardware-specific support functions that MUST be customized:
#define I2CSPEED 100
void I2C_delay(void);
bool read_SCL(void);  // Return current level of SCL line, 0 or 1
bool read_SDA(void);  // Return current level of SDA line, 0 or 1
void set_SCL(void);   // Do not drive SCL (set pin high-impedance)
void clear_SCL(void); // Actively drive SCL signal low
void set_SDA(void);   // Do not drive SDA (set pin high-impedance)
void clear_SDA(void); // Actively drive SDA signal low
void arbitration_lost(void);

bool started = false; // global data

void i2c_start_cond(void) {
  if (started) { 
    // if started, do a restart condition
    // set SDA to 1
    set_SDA();
    I2C_delay();
    set_SCL();
    while (read_SCL() == 0) { // Clock stretching
      // You should add timeout to this loop
    }

    // Repeated start setup time, minimum 4.7us
    I2C_delay();
  }

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  // SCL is high, set SDA from 1 to 0.
  clear_SDA();
  I2C_delay();
  clear_SCL();
  started = true;
}

void i2c_stop_cond(void) {
  // set SDA to 0
  clear_SDA();
  I2C_delay();

  set_SCL();
  // Clock stretching
  while (read_SCL() == 0) {
    // add timeout to this loop.
  }

  // Stop bit setup time, minimum 4us
  I2C_delay();

  // SCL is high, set SDA from 0 to 1
  set_SDA();
  I2C_delay();

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  started = false;
}

// Write a bit to I2C bus
void i2c_write_bit(bool bit) {
  if (bit) {
    set_SDA();
  } else {
    clear_SDA();
  }

  // SDA change propagation delay
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  // Wait for SDA value to be read by slave, minimum of 4us for standard mode
  I2C_delay();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // SCL is high, now data is valid
  // If SDA is high, check that nobody else is driving SDA
  if (bit && (read_SDA() == 0)) {
    arbitration_lost();
  }

  // Clear the SCL to low in preparation for next change
  clear_SCL();
}

// Read a bit from I2C bus
bool i2c_read_bit(void) {
  bool bit;

  // Let the slave drive data
  set_SDA();

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // SCL is high, read out bit
  bit = read_SDA();

  // Set SCL low in preparation for next operation
  clear_SCL();

  return bit;
}

// Write a byte to I2C bus. Return 0 if ack by the slave.
bool i2c_write_byte(bool send_start,
                    bool send_stop,
                    unsigned char byte) {
  unsigned bit;
  bool     nack;

  if (send_start) {
    i2c_start_cond();
  }

  for (bit = 0; bit < 8; ++bit) {
    i2c_write_bit((byte & 0x80) != 0);
    byte <<= 1;
  }

  nack = i2c_read_bit();

  if (send_stop) {
    i2c_stop_cond();
  }

  return nack;
}

// Read a byte from I2C bus
unsigned char i2c_read_byte(bool nack, bool send_stop) {
  unsigned char byte = 0;
  unsigned char bit;

  for (bit = 0; bit < 8; ++bit) {
    byte = (byte << 1) | i2c_read_bit();
  }

  i2c_write_bit(nack);

  if (send_stop) {
    i2c_stop_cond();
  }

  return byte;
}

void I2C_delay(void) { 
  volatile int v;
  int i;

  for (i = 0; i < I2CSPEED / 2; ++i) {
    v;
  }
}

Suporte para sistema operacional

  • No AmigaOS, pode-se usar o componente i2c.resource para AmigaOS 4.xe MorphOS 3.x ou a biblioteca compartilhada i2c.library de Wilhelm Noeker para sistemas mais antigos.
  • Os desenvolvedores do Arduino podem usar a biblioteca "Wire".
  • Maximite suporta comunicações I 2 C nativamente como parte de seu MMBasic.
  • PICAXE usa os comandos i2c e hi2c.
  • eCos suporta I 2 C para várias arquiteturas de hardware.
  • ChibiOS / RT suporta I 2 C para várias arquiteturas de hardware.
  • FreeBSD , NetBSD e OpenBSD também fornecem uma estrutura I 2 C, com suporte para vários controladores e sensores mestres comuns.
    • Desde o OpenBSD 3.9 (lançado em 1º de maio de 2006 ; 15 anos atrás ), um subsistema central i2c_scan analisa todos os chips sensores possíveis de uma vez durante a inicialização, usando um esquema de ponderação ad hoc e uma função de cache local para ler os valores dos registradores dos escravos I 2 C; isso torna possível para sondar sensores de uso geral off-the-shelf i386 / amd64 hardware durante a inicialização sem qualquer configuração por parte do utilizador, nem um atraso sondagem perceptível; os procedimentos de correspondência dos drivers individuais então só precisam contar com um "nome amigável" baseado em string para a correspondência; como resultado, a maioria dos drivers de sensor I 2 C são ativados automaticamente por padrão nas arquiteturas aplicáveis ​​sem efeitos nocivos na estabilidade; sensores individuais, I 2 C e outros, são exportados para o ambiente do usuário por meio da estrutura sysctl hw.sensors . Em março de 2019, o OpenBSD tinha mais de duas dúzias de drivers de dispositivo em I 2 C que exportam algum tipo de sensor por meio da estrutura hw.sensors , e a maioria desses drivers são totalmente habilitados por padrão nos kernels i386 / amd64 do OpenBSD. ( 01-05-2006 ) GENERIC
    • No NetBSD , existem mais de duas dúzias de dispositivos escravos I 2 C que apresentam sensores de monitoramento de hardware, que são acessíveis por meio da estrutura sysmon envsys como listas de propriedades . Em hardware de uso geral, cada driver deve fazer sua própria verificação, portanto, todos os drivers para os escravos I 2 C são desabilitados por padrão no NetBSD em GENERICcompilações i386 / amd64.
  • No Linux , I 2 C é tratado com um driver de dispositivo para o dispositivo específico e outro para o adaptador I 2 C (ou SMBus ) ao qual está conectado. Centenas desses drivers fazem parte das versões atuais do kernel Linux.
  • No Mac OS X , existem cerca de duas dúzias de extensões de kernel I 2 C que se comunicam com sensores para leitura de tensão, corrente, temperatura, movimento e outros estados físicos.
  • No Microsoft Windows , I 2 C é implementado pelos respectivos drivers de dispositivo de grande parte do hardware disponível na indústria. Para dispositivos HID embutidos / SoC , o Windows 8 e posterior tem um driver de barramento I²C integrado.
  • No Windows CE , I 2 C é implementado pelos respectivos drivers de dispositivo de grande parte do hardware disponível na indústria.
  • O Unison OS , um POSIX RTOS para IoT, suporta I 2 C para várias arquiteturas de hardware MCU e MPU.
  • Em RISC OS , I 2 C é fornecido com uma interface I 2 C genérica do controlador IO e suportado pelo sistema de módulo OS
  • Nos sistemas operacionais Sinclair QDOS e Minerva QL , I 2 C é suportado por um conjunto de extensões fornecidas por TF Services .

Ferramentas de desenvolvimento

Ao desenvolver ou solucionar problemas de sistemas usando I 2 C, a visibilidade no nível dos sinais de hardware pode ser importante.

Adaptadores de host

Existem várias soluções de hardware de adaptador host I 2 C para fazer uma conexão mestre ou escrava I 2 C a computadores host, executando Linux , Mac ou Windows . A maioria das opções são adaptadores USB -para-I 2 C. Nem todos eles exigem drivers ou APIs proprietários .

Analisadores de protocolo

Os analisadores de protocolo I 2 C são ferramentas que fazem a amostragem de um barramento I 2 C e decodificam os sinais elétricos para fornecer uma visão de nível superior dos dados sendo transmitidos no barramento.

Analisadores lógicos

Ao desenvolver e / ou solucionar problemas do barramento I 2 C, o exame dos sinais de hardware pode ser muito importante. Analisadores lógicos são ferramentas que coletam, analisam, decodificam e armazenam sinais, para que as pessoas possam visualizar as formas de onda de alta velocidade em seu lazer. Os analisadores lógicos exibem registros de data e hora de cada mudança de nível de sinal, o que pode ajudar a encontrar problemas de protocolo. A maioria dos analisadores lógicos tem a capacidade de decodificar sinais de barramento em dados de protocolo de alto nível e mostrar dados ASCII.

Limitações

A atribuição de endereços escravos é uma fraqueza de I 2 C. Sete bits é muito pouco para evitar colisões de endereços entre os muitos milhares de dispositivos disponíveis. O que alivia a questão das colisões de endereços entre diferentes fornecedores e também permite a conexão com vários dispositivos idênticos é que os fabricantes dedicam pinos que podem ser usados ​​para definir o endereço escravo para uma das poucas opções de endereço por dispositivo. Dois ou três pinos são típicos e, com muitos dispositivos, há três ou mais opções de fiação por pino de endereço.

Os endereços I 2 C de 10 bits ainda não são amplamente usados ​​e muitos sistemas operacionais host não os suportam. Tampouco o é o esquema SMBus "ARP" complexo para atribuir endereços dinamicamente (exceto para placas PCI com presença de SMBus, para as quais é necessário).

A configuração automática do barramento é um problema relacionado. Um determinado endereço pode ser usado por vários dispositivos incompatíveis com protocolos diferentes em vários sistemas, e quase nenhum tipo de dispositivo pode ser detectado em tempo de execução. Por exemplo, 0x51pode ser usado por um 24LC02 ou 24C32 EEPROM , com endereçamento incompatível; ou por um RTC PCF8563 , que não pode ser distinguido de forma confiável de nenhum deles (sem alterar o estado do dispositivo, o que pode não ser permitido). Os únicos mecanismos de configuração confiáveis ​​disponíveis para hosts envolvem mecanismos fora de banda, como tabelas fornecidas pelo firmware do sistema, que listam os dispositivos disponíveis. Novamente, esse problema pode ser parcialmente resolvido pelo ARP em sistemas SMBus, especialmente quando identificadores de fornecedor e produto são usados; mas isso realmente não pegou. O rev. A versão 03 da especificação I 2 C adiciona um mecanismo de ID de dispositivo.

I 2 C suporta uma faixa limitada de velocidades. Os hosts que suportam as velocidades de vários megabits são raros. O suporte para a velocidade Fm + 1 Mbit / s é mais difundido, já que seus eletrônicos são variantes simples do que é usado em velocidades mais baixas. Muitos dispositivos não suportam a velocidade de 400 kbit / s (em parte porque o SMBus ainda não a suporta). Os nós I 2 C implementados em software (em vez de hardware dedicado) podem nem mesmo suportar a velocidade de 100 kbit / s; portanto, todo o intervalo definido na especificação raramente é utilizável. Todos os dispositivos devem, pelo menos parcialmente, oferecer suporte à velocidade mais alta usada ou eles podem detectar de forma fraudulenta o endereço do dispositivo.

Os dispositivos podem esticar os ciclos do clock para atender às suas necessidades específicas, o que pode reduzir a largura de banda necessária para dispositivos mais rápidos e aumentar as latências ao falar com outros endereços de dispositivo. A capacitância do barramento também limita a velocidade de transferência, especialmente quando as fontes de corrente não são usadas para diminuir os tempos de aumento do sinal.

Como I 2 C é um barramento compartilhado, existe a possibilidade de qualquer dispositivo ter uma falha e travar todo o barramento. Por exemplo, se algum dispositivo mantém a linha SDA ou SCL baixa, impede o mestre de enviar comandos START ou STOP para reiniciar o barramento. Assim, é comum que os projetos incluam um sinal de reinicialização que fornece um método externo de reinicialização dos dispositivos de barramento. No entanto, muitos dispositivos não têm um pino de reinicialização dedicado, forçando o projetista a colocar um circuito para permitir que os dispositivos sejam desligados e desligados se precisarem ser reinicializados.

Por causa desses limites (gerenciamento de endereço, configuração de barramento, falhas potenciais, velocidade), poucos segmentos de barramento I 2 C têm até uma dúzia de dispositivos. É comum que os sistemas tenham vários desses segmentos. Um pode ser dedicado para uso com dispositivos de alta velocidade, para gerenciamento de energia de baixa latência. Outro pode ser usado para controlar alguns dispositivos onde a latência e a taxa de transferência não são problemas importantes; ainda outro segmento pode ser usado apenas para ler chips EEPROM que descrevem placas de expansão (como o padrão SPD usado com dispositivos DRAM).

Tecnologias derivadas

I 2 C é a base para o ACCESS.bus , a interface VESA Display Data Channel (DDC), o System Management Bus (SMBus), o Power Management Bus (PMBus) e o Intelligent Platform Management Bus (IPMB, um dos protocolos da IPMI ). Essas variantes têm diferenças nas faixas de tensão e frequência de clock e podem ter linhas de interrupção .

Os sistemas de alta disponibilidade (AdvancedTCA, MicroTCA) usam I 2 C redundante de 2 vias para gerenciamento de prateleira. A capacidade I 2 C multimestre é um requisito nesses sistemas.

TWI (Two-Wire Interface) ou TWSI (Two-Wire Serial Interface) é essencialmente o mesmo barramento implementado em vários processadores system-on-chip da Atmel e de outros fornecedores. Os fornecedores usam o nome TWI, embora I 2 C não seja uma marca registrada em 07/11/2014. A proteção de marca registrada existe apenas para o respectivo logotipo (consulte o canto superior direito) e as patentes de I 2 C expiraram. De acordo com a Microchip Technology , TWI e I2C têm algumas diferenças. Um deles é que o TWI não suporta o byte START.

Em alguns casos, o uso do termo "interface de dois fios" indica implementação incompleta da especificação I 2 C. Não suportar arbitragem ou alongamento do relógio é uma limitação comum, que ainda é útil para um único mestre se comunicar com escravos simples que nunca aumentam o tempo.

O padrão de interface do sensor MIPI I3C (I3C) é um desenvolvimento do I 2 C, em desenvolvimento em 2017.

Veja também

Referências

Leitura adicional

links externos