Para complementar o post, recomendo esta apostila da Texas Instruments sobre a comunicação I²C no geral.
Tendo em vista o que foi mostrado, agora você já deve ser capaz de entender o princípio de funcionamento do I²C, além de saber como interpretar a transmissão dos dados.
Referência: Wikipedia
SPI
O I2C ou I²C é um tipo de interface serial utilizada para comunicar com diversos dispositivos, como o acelerômetro MPU 6050. E é importante conhecer o funcionamento por trás dessa comunicação, que é o que faremos neste post.
Recomendo a leitura dos posts sobre a comunicação serial assíncrona, o SPI, o RS-485 e o Modbus RTU.
Assim como na comunicação assíncrona, o I²C utiliza dois canais para comunicação. A diferença é que, nesse caso, um canal é de transmissão e recepção de dados e outro é para sincronização dos mesmos. Ou seja, ele é um tipo de comunicação síncrona, assim como a SPI.
I²C significa Inter-Integrated Circuit (Circuito Inter-Integrado) e pode ser pronunciado como “I dois C”. Ele foi criado pela Philips, tendo como vantagem a simplicidade e o baixo custo, e, como desvantagem, a velocidade.
Em relação aos dois canais de comunicação, temos: o canal de dados seriais, chamado de serial data (SDA); e o canal de sincronização, chamado serial clock (SCL). Simplificadamente, o Clock é um sinal que oscila entre nível alto e baixo rapidamente. Então, essa oscilação é utilizada para sincronizar os dispositivos a cada vez que o clock apresentar certo estado. Na explicação do funcionamento, isso será melhor ilustrado.
Outra informação importante é que os dois canais de comunicação são bidirecionais. Isto é, os dispositivos dos dois lados podem utilizar os canais. Esses canais são, basicamente, barramentos que interligam diversos dispositivos entre si. E, para haver a comunicação, deve existir pelo menos um dispositivo denominado “mestre” e outro denominado “escravo”.
O mestre é responsável por coordenar a comunicação (gerar clock e iniciar a comunicação). Enquanto o escravo apenas recebe os dados e responde quando é “chamado”. Cada escravo possui um endereço individual de 7 bits que é utilizado para um mestre conseguir comunicar individualmente com eles (normalmente escrito em hexadecimal). Dependendo, os dispositivos podem ser mestres ou escravos, embora normalmente eles assumam um papel fixo.
As linhas da comunicação I²C são de coletor aberto, então é necessário utilizar resistores de pull-up para evitar erros na comunicação.
Um exemplo de um diagrama com dispositivos interligados está mostrado abaixo:
De acordo com a imagem acima:
Como foi dito anteriormente, a desvantagem do I²C é a relativa baixa velocidade. Isso se deve por dois motivos: o primeiro é que o procedimento de transmissão de dados é mais “burocrático”; o segundo é que uma única linha recebe e transmite dados (comunicação half-duplex). Ou seja, não é possível fazer os dois ao mesmo tempo e o tempo gasto é dobrado. Um valor médio de velocidade é de 100kbit/s.
Existe um terceiro motivo (mais complexo), que tem relação com os resistores de pull-up, mas não pretendo explicá-lo.
Apesar da relativa baixa velocidade, o barramento do I²C permite a comunicação entre diversos dispositivos com apenas dois fios. Sendo assim, podem existir diversos mestres ou escravos ligados no barramento. O número máximo de dispositivos ligados pode depender da capacitância máxima do barramento (400pF).
O endereço de um dispositivo é algo arbitrário e, portanto, podem haver dispositivos ligados em um barramento que, coincidentemente, possuem o mesmo endereço. É uma situação incomum, dado que o endereço é formado por 7 bits (128 possibilidades, ignorando que algumas são reservadas). Também podem haver casos em que a comunicação I²C utilize 10 bits para endereço.
Um módulo que já mostrei aqui no site, o acelerômetro MPU 6050, é capaz de mudar o seu endereço. Dessa forma, é possível utilizar dois acelerômetros em um mesmo barramento. Ele ainda possui pinos auxiliares que permitem criar um barramento alternativo para comandar outros dispositivos por I²C (um magnetômetro por exemplo). Portanto, o acelerômetro age como escravo em relação ao Arduino, e age como mestre em relação ao magnetômetro.
Em um barramento com dois mestres ou mais, podem ocorrer conflitos de comunicação. Normalmente, um mestre sempre espera outro terminar a comunicação quando o barramento está sendo utilizado. Entretanto, dois mestres podem querer transmitir dados ao mesmo tempo. Para este caso, existe uma arbitragem que evita o erro na comunicação. O que ocorre é que cada mestre verifica o nível da linha SDA e compara com o nível que ele está esperando (o nível que ele mandou definir).
Se, para um determinado mestre, o nível real é diferente do esperado, então este mestre perde o direito da transmissão e espera até o outro mestre terminar o procedimento. Portanto, o mestre que verificou que o nível da linha SDA foi igual ao que ele esperava pode, sem interrupção, continuar a sua transmissão de dados. Dessa forma, a comunicação fica organizada e sem conflitos.
Pode ser que um escravo esteja defasado do mestre (diferentes velocidades de processamento) ou que não esteja pronto para receber/enviar dados. Se este for o caso, o escravo pode manter a linha SCL em nível baixo após receber ou enviar um byte. E o mestre que está comunicando com este escravo deve aguardar até a linha SCL voltar ao nível alto.
Sabemos então que a comunicação I²C é constituída por um clock e um endereço de 7 bits na linha SDA. Mas este é só o necessário para começar a transmitir os dados. Vamos considerar as duas linhas, SDA e SCL, em nível alto a princípio (devido ao pull-up). A transmissão, de fato, ocorrerá da seguinte forma:
A transmissão dos bits ocorre do mais para o menos significativo.
A imagem abaixo mostra o exemplo de uma escrita. O endereço do escravo é 0x68 (1101000), o registrador é 0x3B (00111011) e os dados enviados são: 11001010.
No caso da leitura, continuando do 2º byte, temos:
A imagem abaixo mostra o exemplo de uma leitura. O endereço do escravo é 0x68 (1101000), o registrador é 0x3B (00111011) e os dados enviados pelo escravo são: 10010011.
Obs: É enviado ‘escrita’ no 1º byte (0 no 8º bit) mesmo que estejamos fazendo a leitura mais a frente.
Para complementar o post, recomendo esta apostila da Texas Instruments sobre a comunicação I²C no geral.
Tendo em vista o que foi mostrado, agora você já deve ser capaz de entender o princípio de funcionamento do I²C, além de saber como interpretar a transmissão dos dados.
Referência: Wikipedia
SPI
MUITO OBRIGADO PELA APRESENTAÇÃO , MUITO UTIL.
Que bom que gostou, Anderson. Muito obrigado pelo comentário!
Uma ótima explicação, obrigado por publicar.
Muito bom receber esse feedback, José. Obrigado pelo comentário!
muito obrigado pela disposição. aprendi bastante!!!
Show de bola, Rodrigo. Eu que agradeço o feedback!