• Leonardo Ritter

Hardware - A interface I³C / SMBus

Atualizado: Mar 6

Neste artigo 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.

Simbolo do SMBus / I²C

Imagem 1 - Logomarca da interface SMBus e I³C


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, porém 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 cabos flat ou PCB's com trilhas cobreadas.

Já o SMBus funciona com um padrão mais rígido, normalmente a 3,3 Volts, porém com pequenas adaptações consegue trabalhar 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:

Comparação com outras interfaces populares

Tabela 1 - Diferenças entre interfaces


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, todavia 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:

Gráfico 1


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:

Diagrama 1 - 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, porém 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:

Gráfico 2


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 indicam 1 entre 8 dispositivos de um determinado tipo a ser acessado.


OBSERVAÇÃO: 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 Acknowledge. 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, no entanto 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:

Modelo de pacote de dados do barramento I²C / SMBus

Estrutura de uma pacote de dados 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. Veja mais abaixo.


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:

Imagem 2 - Interface gráfica do software MSi Afterburner


-> Quando você instala um módulo de memória RAM, como que o CPU-Z ou o AIDA64 ou 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?

Pois 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):

CPU-Z na aba "SPD"

Imagem 3 - Interface gráfica do aplicativo CPU-Z


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 podem ser transmitidos do controlador Touch Screen ao chipset através de uma interface I³C! Observe o diagrama abaixo:

Diagrama de parte do smartphone LG G3

Diagrama 2


Abaixo, a imagem de um controlador Touch Screen:

Controlador Touch Screen da ST Microelectronics

Imagem 4 - 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 (BMS - 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:

Barramento SMBus e a bateria dos notebooks

Diagrama 3


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? Mande 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: 05 de Março de 2021.

296 visualizações