Hardware - A interface I³C / SMBus

Hardware - A interface I³C / SMBus

08/08/2018

| Escrito por:

  Olá leitor! Hoje daremos continuidade ao estudo das interfaces presentes no Super I/O. A interface de hoje é a I²C, aperfeiçoada pela Intel e atualmente mais conhecida como SMBus.

 

  I²C é a sigla para Inter-Integrated Circuit, que significa "Circuito Inter Integrado", servindo para interligar dispositivos de baixo desempenho num circuito. Foi desenvolvido pela Philips nos anos 1980 para servir de meio de comunicação entre chips Philips em circuitos da mesma marca e, a partir dos anos 1990 começaram a surgir chips de memória EEPROM e microcontroladores com suporte a esta interface por parte de empresas concorrentes.

  Em 1995, a Intel Corporation criou uma revisão desta interface e também um novo nome: System Management Bus ou simplesmente "SMBus", que em português significa "Barramento de Gerenciamento de Sistema". O protocolo de funcionamento é o mesmo Philips I²C e a principal diferença é o comportamento perante a erros do sistema, que foi melhorado pela Intel. Tanto o I²C quanto o SMBus são retro-compatíveis mas, requerem uns ajustes para funcionarem corretamente.

  A lista de modificações introduzidas com o nome SMBus é dada abaixo:

  • Verificação de Erros de Pacotes (PEC);

  • Tempo limite para transferências;

  • Tipos de transferência padronizados;

  • Linha ALERTA;

  • Linha SUSPEND;

  • Desligue / Aumente.

  O I²C permite tensões de 3,3 Volts ou 5 Volts mas, trabalha bem com valores um pouquinho diferentes deste. Existem memórias EEPROM que trabalham com 3,6 Volts e dispositivos que já chegam a casa dos 2 Volts ou 1,8 Volts. É aconselhável que, quanto menor a tensão nominal do barramento, menor seja o comprimento dos dois fios e menor seja a taxa de transferência para evitar interferências e problemas resistivos e capacitivos com o canal. É preferível que, para poder aproveitar o máximo de desempenho, se use fitas ou PCB's com trilhas cobreadas. 

  Já o SMBus funciona com um padrão mais rígido, normalmente a 3,3 Volts mas, com pequenas adaptações trabalha da mesma forma que o barramento da Philips. A versão 3.0 do SMBus, lançada em 2014, pode trabalhar na faixa dos 1.8 a 5 Volts. As recomendações contra interferências e deficiências resistivas e capacitivas do I²C também valem para o SMBus.

  Como não existe um padrão de tensão nos dispositivos com interface I²C / SMBus e qualquer um pode ocupar a linha SCL, é necessário criar Shifters de nível, que tem o papel de mover um pedido de um lado para outro e manter a comunicação. Duas soluções possíveis são o Optii e o Levii. O Optii possui a vantagem de manter a compatibilidade lógica entre dois dispositivos I²C que trabalham com tensões diferentes (consequentemente as linhas SDA e SCL ficam com tensões diferentes) de maneira mais eficaz: manter a lógica e comunicação entre dois dispositivos mas, isola-los eletricamente.

  A faixa de frequência em que o I²C opera se estende a alguns kHz. As primeiras versões trabalham na faixa dos 100 kHz, depois surgiu a de 400 kHz (Modo rápido), 1 MHz (Fast Mode Plus) e 3,4 Mhz (Ultra Fast Mode).

  Vamos comparar alguns meios de comunicação populares, para você ter uma noção das principais diferenças:

  A interface RS-232 possui apenas dois fios para comunicação em modo Half ou Full-Duplex sem sinal de clock, enquanto as interfaces SPI e I²C possuem sinal de clock, ou seja, são síncronas

  No caso do SMBus, pelas informações que conseguimos, ele trabalha de 10 a 400 kHz, dependendo da versão utilizada (1.1 e 2.0). A versão 3.0 vai de 400 kHz a 1Mhz.

  Os chips Super I/O normalmente não vem com interface I²C / SMBus de fábrica mas, na grande maioria dos modelos de chipsets de placas-mãe, um controlador SMBus já é embutido e, se você não lembra, no artigo sobre o Super I/O, eu escrevi que praticamente todas as Pontes Sul possuem um Super I/O integrado.

  O controlador SMBus apresenta apenas dois fios: o SDA, que serve para transmitir dados em modo Half-Duplex, isto é, bidirecional e, a linha SCL, que serve para transmitir o sinal de clock que sincroniza os dispositivos. Os dois fios são ligados a resistores Pull-Up, que mantém as linhas com sinal em nível HIGH durante o ósseo.

  Ao iniciar a transferência de dados, o sistema apenas deve puxar a linha SDA para LOW durante a representação dos bits com valor zero (0), fazendo com que ao transmitir os bits com valor um(1) não seja necessário puxar a linha para HIGH pois, com o resistor Pull-Up ela já está em HIGH. Veja o tipo de sinal gerado com esta terminação no gráfico abaixo:

  Uma terminação resistiva errada ou ausente pode trazer problemas ou danificar o sistema I²C / SMBus.

  Outro fator positivo do I²C e também do SMBus é a possibilidade do sistema trabalhar com vários mestres de barramento, todos trabalhando de forma organizada sem colisões na linha SDA. O clock não é fixado, isto é, não fica o tempo todo na mesma frequência e é definido pelo mestre que "está na vez". Observe o diagrama abaixo:

Exemplo de ligação de mestres e escravos no barramento. Note os dois resistores ligado a linha de energia (Vdd)

 

  Para que o sistema de vários mestres funcione, todos os dispositivos mestre precisam suportar o modo multi-master, e este modo prevê a seguinte arbitragem:

 > Se dois dispositivos ocuparem a interface I²C simultaneamente, o que liberar mais zeros no barramento ou no dispositivo escravo mais lento ganha a vez, e o outro mestre deve desocupar o meio imediatamente.

 > Os mestres e escravos devem reconhecer a ocupação do barramento e ocupa-lo apenas quando a interface ficar ociosa. Caso um dispositivo mestre que não suporte o modo multi-master estiver conectado a um barramento com dispositivos multi-master, ele pode interromper os outros e causar resultados ruins na comunicação.

  O SMBus possui uma linha adicional e opcional: o SMBALERT#, utilizado para avisar o mestre do barramento sobre eventos de interesse do host. Há também o "Host Notify Protocol" que é uma melhoria com função similar ao SMBALERT# mas, é capaz de repassar mais informações sobre o evento e trabalhar melhor com o modo multi-mestre (também pode ser chamado de multi-host), porém não é muito comum.

  Como você já deve ter notado, o SMBus / I²C é uma interface serial na forma de barramento, ou seja, os dados são transmitidos em série mas, vários dispositivos podem ser conectados nos mesmos dois fios da interface e serem tratados individualmente através da distribuição de endereços.

   A comunicação, nesta interface, ocorre de forma parecida, em alguns pontos, com a interface PS/2 (para mouses e teclados antigos). Há o START bit e o STOP bit e os dados são enviados Byte a Byte, sendo que, o bit mais significativo (msb)  é enviado primeiro e, o menos significativo (lsb) é enviado por último.

  Observe o diagrama abaixo:

   O START é dado quando SDA cai para LOW e SCL está em nível HIGH. Na sequência começa o sinal de clock.

  O STOP é dado quando SDA vai pra nível HIGH e SCL já está em nível HIGH. Neste momento o clock é parado e as duas linhas permanecem em nível HIGH.

  Na sequência do START bit, é enviado o endereço do dispositivo, que possui 7 bits de tamanho, o que significa que, teoricamente, 128 dispositivos SMBus / I²C podem ser conectados no barramento mas, na prática apenas 112 endereços podem ser utilizados, o restante é reservado.

  O endereço é dividido em duas partes: os primeiros quatro bits (os mais significativos - msb) indicam o tipo de dispositivo, e os outros três bits indica 1 entre 8 dispositivos de um determinado tipo a ser acessado. Obs.: Se você fizer 2³, o resultado será 8, portanto pode se fazer 8 endereços diferentes utilizando combinações de três bits.

  Após os 7 bits, o mestre do barramento que está em atividade manda mais 1 bit, o bit menos significativo (lsb). Se este bit for 1, significa que a operação no dispositivo a ser acessado é de leitura de dados e, caso este bit for 0, a operação no dispositivo a ser acessado é de escrita de dados.

  Se o dispositivo que estiver recebendo o sinal não conseguir trabalhar com ele, por estar sobrecarregado ou por outro motivo, ele poderá puxar a linha SCL para LOW e forçar o dispositivo que está enviado a permanecer em espera.

  Para cada Byte transmitido, o receptor gerará um sinal Acknowledge na linha SDA, confirmando ou não o recebimento dos 8 bits. Então, após o mestre transmitir o endereço de 7 bits e o bit que indica a operação a ser feita, o escravo que receberá estes dados irá transmitir o bit Acnowledge. Se houver erros, o bit ACK transmitido pelo escravo será em nível HIGH, então o mestre tentará transmitir novamente os 8 bits. Isso acontece até que o escravo reporta o ACK em nível LOW, significando a confirmação de recebimento.

  Lembrando que, quando o mestre manda um pacote de dados pelo barramento, todos os dispositivos conectados receberão mas, só aquele que portar o mesmo endereço informado no cabeçalho do pacote de dados é que receberá a informação transmitida, os outros dispositivos a ignorarão.

  Após transmitir o endereço de 7 bits, o bit de operação e o escravo receber e transmitir o bit ACK, o mestre transmite mais uma sequência de 8 bits, desta vez são os dados. Se o escravo receber a informação, ele mandará novamente um bit ACK para confirmar. Caso precise transmitir mais dados, o mestre manda mais 8 bits e ao final o escravo confiram novamente o recebimento com um ACK. Isso ocorre até que o mestre termine de transmitir os dados. Ao transmitir o último Byte e o escravo confirmar o recebimento, o mestre aplica o STOP bit e o barramento fica ocioso. Veja a estrutura de um pacote de dados no barramento I²C / SMBus:

 > S: START bit;

 > Endereço: endereço do escravo a ser acessado;

 > R/W: Operação a ser feita, ou seja, Read / Write - Leitura / Escrita;

 > A: pulso Acknowledge dado pelo receptor para confirmar ou não recebimento dos dados;

 > 1B: 1 Byte de dados transmitidos;

 > A: pulso Acknowledge dado pelo receptor para confirmar ou não recebimento dos dados;

 > 1B: 1 Byte de dados transmitidos;

 > A: pulso Acknowledge dado pelo receptor para confirmar ou não recebimento dos dados;

 > Na transmissão pode haver apenas 1 Byte de dados ou vários Bytes a serem transmitidos, dependerá da ocasião, da necessidade de se transmitir. Por exemplo, uma memória EEPROM pode enviar vários parâmetros de configurações ao mestre, ou seja, vários Bytes vão ser transmitidos, já uma alteração na rotação de um FAN requer apenas um comando e pode necessitar a transmissão de apenas 1 Byte ao dispositivo escravo.

 > P: STOP bit.

 

  Mas, se a operação for de leitura? Uma memória EEPROM pode ser a escrava do barramento, correto? Então:

 > O mestre dá o START bit, o endereço do chip no barramento I²C / SMBus e o pulso que indica a operação de ESCRITA;

 > O escravo (neste caso o chip de memória EEPROM) mandará o pulso ACK;

 > O mestre manda outro endereço, desta vez com 8 bits e que servirá para acessar determinado ponto do chip memória. Como foi dado o comando de escrita anteriormente, este endereço ficará no registrador da memória e servirá para o mestre ter acesso no próximo START bit e efetuar a leitura de determinado ponto da EEPROM que foi marcado com este endereço;

 > A EEPROM manda outro pulso ACK;

 > O START bit é dado novamente pelo mestre, que envia o endereço do chip no barramento I²C / SMBus e o bit que indica a operação de LEITURA;

 > O escravo responde com ACK e começa a transferir os dados para o mestre, e da mesma forma, ou seja, a cada 8 bits transmitidos, o mestre larga o pulso de ACK pra confirmar ou não o recebimento. Isso ocorre até o fim da transmissão.

 > O fim da transmissão é dado pelo mestre que simplesmente diz que não quer mais ler dados através de um pulso noacknowledge (NOACK) em nível HIGH.

 > Após o NOACK, o STOP bit é dado pelo mestre, tornando o barramento ocioso novamente.

 

  Lembrando que, para que todos estes passos sejam executados, há um programa agindo no circuito. Este programa dirá quantos bytes devem ser lidos ou gravados numa EEPROM, os comandos que devem ser mandados para determinado hardware se configurado ou ter suas funções modificadas, enfim, você entenderá melhor vendo alguns exemplos de uso do barramento I²C / SMBus no tópico "Utilidade".

  Esta interface é caracterizada pelo baixo desempenho e pelo uso apenas para troca de comandos e dados entre pequenos chips de memória EEPROM e microcontroladores de circuitos maiores. Como assim? Me acompanhe:

  Se você leu o artigo sobre a interface PCI Express, viu que no slot há uma interface SMBus, antes da chave mecânica, pois então, ela é ligada ao controlador SMBus do Super I/O da Ponte Sul e serve para trocar algumas informações:

 > Ao conectar uma placa de vídeo, informações técnicas de hardware são detectadas pelo barramento SMBus!

 > Quando você faz um overclock, o software que você está utilizando (MSi Afterburner, EVGA Precicion OC e etc.) recebe as informações da placa e envia comandos para a alteração do clock, da tensão, do RPM dos FAN's e outras funções que foram alteradas pelo usuário através do SMBus. Veja a imagem da interface do MSi Afterburner:

 > Quando você instala um módulo de memória RAM, como que o CPU-Z, o AIDA64 e outros softwares de monitoramento de hardware sabem informações como por exemplo a marca do módulo, número de série, período de fabricação, padrões de frequências suportados, latências, bancos de memória, ranks, tensão nominal e várias outras informações técnicas? Por que no módulo de memória RAM há uma memória EEPROM denominada SPD (Serial Presence Detect - Detector de Presença Serial) com todas as informações técnicas sobre o módulo. Ao conectar o módulo no slot e ligar o PC, as informações são redigidas ao firmware da placa através do barramento SMBus. O sistema ajusta o controlador de memória RAM de acordo com as informações repassadas pelo SPD do módulo e as informações também podem ser repassadas ao usuário do PC através de aplicativos para Windows, Linux...

  Veja a imagem do CPU-Z na aba "SPD", que recebe as informações do(s) módulo(s) instalado(s):

   Estas são apenas algumas funções da interface SMBus. Todos os exemplos acima também são válidos para notebooks!

 > A interface I²C também está presente no Arduino e até mesmo em smartphones! Todos os toques na tela de seu smartphone são transmitidos do controlador Touch Screen ao chipset através de uma interface I²C! Observe o diagrama abaixo:

   Abaixo, a imagem de um controlador Touch Screen:

Microcontrolador de tela Touch Screen capacitiva da ST Microelectronics

 

  Lembre-se que, os controladores Touch Screen são chips ultra pequenos e podem ser soldados diretamente no cabo flat que liga a plataforma sensível ao toque à placa-mãe do smartphone. Em notebooks com tela Touch Screen também é utilizado um chip com interface I²C, SPI ou outra com características próximas.

 > Outra utilização clássica do barramento SMBus é nas baterias de notebook. Para identificar as características detalhadas das células de carga da bateria, a placa-mãe da aparelho se comunica com o Módulo de Gerenciamento de Bateria (Battery Management System) através de um barramento SMBus e pega todas as informações disponíveis (quantidade de células, tensão, corrente, potência, capacidades, enfim, várias informações) para que a placa-mãe possa gerencia-la da melhor forma possível. Veja um diagrama do conector da bateria de um notebook abaixo:

  Perceba na imagem acima as duas linhas do barramento SMBus (logo acima das outras duas linhas circuladas com uma linha marrom).

  Numa placa-mãe de PC ou notebook, um controlador SMBus / I²C pode ser ligado aos slots de memória RAM, slots PCI Express e a outros chips também. Todos ligados ao mesmo barramento, sem erros, sem problemas. Caso não concorde com minhas palavras, vá até a biblioteca de esquemas elétricos do Hardware Central e tire a prova!

  Existe uma variação do I²C conhecido como TWI (Two Wire Interface) e possui as mesmas características do I²C, exceto suporte ao Ultra Fast Mode. O TWI tem algumas modificações, a principal delas é o endereçamento de 10 bits e broadcast geral. O TWI foi designado pela Atmel e em sua versão padrão é completamente compatível com a I²C.

  Existe também uma variação do SMBus, chamada de PMBus. São completamente iguais e retro-compatíveis, a única coisa diferente é que o PMBus possui um conjunto de comandos e estrutura de dados exclusivo para dispositivos de controle e gerenciamento de energia.

  Gostou do artigo? Ficou com alguma dúvida? Made uma mensagem pelo Facebook ou para hardwarecentrallr@gmail.com

  Não se esqueça de curtir e compartilhar no Facebook!

FONTES e CRÉDITOS

 

Imagens, texto e gráficos: Leonardo Ritter

Fontes: Microcontrolandos; ArduinoBR; ST Microelectronics; Wikipedia (somente artigos com fontes verificadas!); Embarcados.com; Biblioteca de esquemas elétricos e datasheets do Hardware Central.

 

Última atualização: 19 de Novembro de 2018.

Please reload

© 2019 Hardware Central Tecnologia Entretenimento e Comunicação do Brasil Ltda. Todos os direitos reservados.

Wix Editor / Revisão da web page: 3.0/2019 (07/10/19)