1. Elementos de Comunicação
Vamos voltar aos primórdios aqui e depois chegar na comunicação entre nossos dispositivos. Para isso, vamos primeiro pensar em um problema: como dois elementos conseguem se comunicar?
Vamos analisar a imagem a seguir.
![Elementos se Comunicando](https://www.thoughtco.com/thmb/zWRQSKqnDXW5YRUGdjgC__diEnE=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/what-is-communication-process-1689767_FINAL-069d65e4e1414e5c917379c42a537a66.png)
Aqui podemos observar quatro elementos principais nessa imagem:
- Transmissor: elemento que vai realizar o envio da mensagem;
- Meio: canal por onde a mensagem vai ser enviada;
- Receptor: quem vai receber a mensagem enviada;
- Protocolo: conjunto de regras que o emissor e o receptor utilizam para que ambos possam compreender a mensagem. No caso da figura, representada pela mensagem.
Este mesmo conjunto de elementos é necessário no processo de comunicação entre quaisquer dispositivos. O que acontece é que muitas vezes esses elementos ficam implícitos ou ainda abstraídos do usuário.
Vamos estudar mais isso ao longo deste artigo, mas recomendo muito verificar esse vídeo:
Um conceito importante para conhecermos enquanto estamos falando de comunicação, são os modos como ela pode acontecer. O modo como uma comunicação funciona, descreve como ela pode enviar e receber dados. Podemos descrever eles como:
- Simplex: A comunicação acontece em um sentindo apenas. Como uma estação de rádio transmitindo as informações para um sentindo apenas. Outro exemplo é o sinal de TV aberta, onde a emissora envia o sinal e o receptor (televisor) apenas recebe.
Retirado de: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS5YT135AClrXaTWX5HDNonFnYhcTZ0UOArxg&s
- Half-Duplex: A comunicação pode acontecer em ambos os sentidos, do emissor para o receptor e vice-versa. Contudo, ela não acontece de forma simultânea. Para que o receptor comece a receber os dados, ele precisa para de enviar. Um exemplo deste funcionamento são rádios comunicadores. Isso acontece pois o mesmo canal é utilizado.
![Ilustração de comunicação half duplex](https://www.cdt21.com/wp/wp-content/uploads/design_guide/HalfDuplex.gif)
Retirado de: https://www.cdt21.com/wp/wp-content/uploads/design_guide/HalfDuplex.gif
- Full-Duplex: A comunicação pode acontecer em ambos os sentidos ao mesmo tempo. Isso acontece pois diferentes canais são utilizados na comunicação. Um exemplo é a telefonia celular.
![Ilustração de comunicação full duplex](https://blog.nuovoteam.com/wp-content/uploads/2022/07/Full-Duplex-Communication@1x-2-1024x538.jpg)
Retirado de: https://blog.nuovoteam.com/wp-content/uploads/2022/07/Full-Duplex-Communication@1x-2-1024x538.jpg
2. Revisão de Programação C em Microcontroladores
Aqui vai vir um conjunto de revisão de programação de microcontroladores utilizando a ISA do Arduino. Está implementação traz um conjunto bastante grande de validações e simplificações que podemos utilizar. Para saber mais sobre ela:
Logo menos vou adicionar um pouco sobre ele aqui! Só um momento!!⌨️👓👌
3. Protocolos de Comunicação
Vamos lá, existem diversos protocolos de comunicação que podem ser implementados. Cada um deles possui um conjunto de características que vamos estudar a seguir. Os tipos de comunicação que vamos ver:
- Comunicação Serial;
- Comunicação SPI;
- Comunicação I2C.
Cabe destacar aqui que existem outras formas de comunicação, estas são algumas das mais comuns para utilizarmos.
3.1 Comunicação Serial
Pessoal, vamos pensar em algumas formas como dois elementos podem trocar informações. Existe um forma que a troca de mensagens pode acontecer com uma via dedicada para cada um dos bits de informação. Este tipo de comunicação é chamada de Comunicação Parelela
. O que acontece aqui, quando um sinal de clock (CLK) é enviado do transmissor para o receptor, o elemento receptor faz a leitura de todos os bits de uma vez.
Este tipo de comunicação apresenta algumas restrições, como:
- Distância de transmissão;
- Velocidade de transferência limitada;
- Grande quantidade de vias para transmitir os dados.
![Comunicação Paralela](https://cdn.sparkfun.com/r/700-700/assets/c/a/c/3/a/50e1cca6ce395fbc27000000.png)
Retirado de: https://cdn.sparkfun.com/r/700-700/assets/c/a/c/3/a/50e1cca6ce395fbc27000000.png
Uma outra forma de trocar dados é utilizar uma única via para transferir os dados. Aqui cabe destacar um ponto em relação a algumas literaturas, quando dizemos uma única via para troca de informações é para o envio de dados. Ainda é necessário utilizar mais algumas vias, como um canal para clock, um canal de referência para terra. Estes são os elementos mínimos para a comunicação.
![Comunicação Serial](https://cdn.sparkfun.com/r/700-700/assets/e/5/4/2/a/50e1ccf1ce395f962b000000.png)
Retirado de: https://cdn.sparkfun.com/r/700-700/assets/e/5/4/2/a/50e1ccf1ce395f962b000000.png
Aqui cabe um ponto interessante para verificarmos: pinos de controle. Estes pinos não são necessariamente necessários para a comunicação, eles estão mais ligados ao tipo de padrão que utilizamos. Alguns padrões de comunicação são:
RS-232
: RS-232 é um padrão de comunicação serial assíncrona que utiliza tensões entre ±3V e ±25V (com nível lógico “1” em tensões negativas e “0” em tensões positivas), podendo alcançar distâncias de até 15 metros e taxas de transmissão comuns entre 9600 e 115200 bps. Normalmente emprega conectores DB-9 ou DB-25 e inclui linhas de controle de fluxo (como RTS e CTS) para handshakes por hardware, operando em modo full-duplex. Embora seja um padrão antigo e desbalanceado (mais suscetível a ruídos), ainda é muito utilizado em aplicações industriais e legadas.RS-422
: RS-422 é um padrão de comunicação serial diferencial que permite transmitir dados em longas distâncias (até cerca de 1200 metros) a taxas de transferência elevadas e com maior imunidade a ruídos em comparação ao RS-232. Ele utiliza duas linhas para cada sinal (A/B) na transmissão e recepção, reduzindo interferências eletromagnéticas e melhorando a integridade do sinal. Embora não especifique um conector padrão, costuma empregar conectores DB-9 ou bornes de parafuso em ambientes industriais. Além disso, o RS-422 pode operar em modos simplex ou full-duplex, dependendo de como as linhas de transmissão e recepção são configuradas.RS-485
: RS-485 é um padrão de comunicação serial diferencial que suporta múltiplos dispositivos na mesma linha (até 32 transmissores e 32 receptores), permitindo comunicação em longas distâncias (até 1200 metros) e maiores taxas de transmissão com boa imunidade a ruídos. Diferentemente do RS-422, é normalmente configurado para comunicação half-duplex, compartilhando as linhas para transmissão e recepção em momentos distintos, embora também possa operar em full-duplex com cabeamento adicional. Por ser um padrão físico, não define conector específico, mas comumente utiliza conectores DB-9 ou bornes de parafuso no ambiente industrial, onde sua robustez e flexibilidade são especialmente valorizadas.
Estes são alguns dos padrões mais conhecidos e utilizados. Vamos focar agora no RS-232
. Em geral, este padrão elétrico é ligado utilizando um conector do tipo DB-9:
![Conector DB9](https://www.usconverters.com/images/rs232-pinout.webp)
Retirado de: https://www.usconverters.com/images/rs232-pinout.webp
Destes pinos, vamos compreender o funcionamento de alguns deles:
Data Carrier Detect
: sinaliza que há uma portadora ativa no modem, indicando uma conexão estabelecida;Received Data
: recebe dados do dispositivo remoto;Transmit Data
: envia dados para o dispositivo remoto;Data Terminal Ready
: indica que o terminal (computador) está pronto para se comunicar;Ground
: serve como referência de terra do sinal;Data Set Ready
: informa que o modem ou dispositivo de comunicação está pronto;Request to Send
: indica que o dispositivo deseja transmitir dados;Clear to Send
: confirma que o outro dispositivo está pronto para receber;Ring Indicator
: avisa que há uma chamada telefônica chegando.
Pessoal todos estes pinos eram utilizados quando os dispositivos faziam o controle de fluxo de dados utilizando os pinos físicos. Ela é um tipo de comunicação ponto a ponto, em que apenas dois dispositivos trocam informações.
![Conectando cabo RS232](https://www.firewall.cx/images/stories/networking/cabling_dcc5.gif)
Retirado de: https://www.firewall.cx/images/stories/networking/cabling_dcc5.gif
Atualmente, utilizamos uma quantidade menor de pinos para realizar a comunicação. Os pinos que utilizamos nesta configuração são os pinos GND (ground), TX e RX. Vale a pena chamar a atenção para a configuração destes elementos. Para que um dispositivo possam receber os dados do outro, ligamos o TX
de um elemento no pino RX
do outro.
![Comunicação Serial Básica](https://www.virtual-serial-port.org/images/upload/products/vspd/articles/serial/cable.jpg)
Retirado de: https://www.virtual-serial-port.org/images/upload/products/vspd/articles/serial/cable.jpg
Murilo mas eu vejo algumas ligações que não ligam o TX com o RX de todos os elementos, só ligamos o TX no nosso RX por exemplo ou o contrário. Por que isso?
O que acontece pessoal, muitos dispositivos, eme especial sensores, mandam os dados para o controlador quando um evento acontece. Muitos microcontroladores e processadores possuem rotinas de interrupção para detectar quando um conjunto de dados está chegando. Assim, quando o dispositivo envia os dados, o controlador consegue fazer a sua leitura. Como em diversos destes casos, a comunicação é simplex, não é necessário fazer a outra ligação.
Mas agora vamos avaliar um pouco mais sobre a configuração destes dispositivos. O protocolo de comunicação serial pode ser implementado de forma síncrona, como no caso do SPI e do I2C, onde o sinal do clock é enviado além dos sinais de dados. Ou ainda pode ser implementado de forma assíncrona. No caso da implementação assíncrona, não existe sinal de sincronização de dados, portanto tanto o transmissor quando o receptor são responsáveis por gerar este sinal. Ambos os dispositivos precisam estar com a mesma configuração para que a comunicação possa acontecer.
Para a Comunicação Serial Assíncrona acontecer, é necessário configurar:
Data bits
: quantidade de bits que são enviados em cada mensagem;Bits de Sincronização
: quantos bits são utilizados para iniciar e terminar a mensagem;Bits de Paridade
: quantos bits de paridade são utilizados nas mensagens;Baud Rate
: qual a velocidade no envio de dados.
![Frame de mensagem Serial](https://cdn.sparkfun.com/r/700-700/assets/f/9/c/0/2/50d2066fce395fc43b000000.png)
Retirado de: https://cdn.sparkfun.com/r/700-700/assets/f/9/c/0/2/50d2066fce395fc43b000000.png
Bits de paridade são bits adicionais inseridos no fim ou no início do quadro de dados em comunicações seriais para auxiliar na detecção de erros de transmissão. Em geral, o transmissor calcula se o número de bits “1” do pacote de dados é par ou ímpar e define o bit de paridade para manter o total coerente com a configuração (paridade par ou ímpar). Ao receber os dados, o dispositivo de destino faz a mesma contagem e, se houver discrepância, conclui que ocorreu um erro no envio. Para saber mais:
Agora vamos verificar o seguinte cenário: desejamos transmitir a letra "A", em ASCII pela porta serial. Vamos utilizar como configuração 9600 bits por segundo de velocidade, paridade par e um stop bit. Primeiro, vamos verificar como fica a letra "S", em binário. Consultando uma tabela ASCII (https://www.ascii-code.com/), que é uma forma de representar os símbolos e caracteres, podemos ver que a letra "S", pode ser representada por: " 01010011". Quando formos transmitir esse caractere, deve estar configurado entre o transmissor e o receptor a quantidade de bits que serão enviados, para o nosso exemplo, vamos considerar que serão enviados 8 bits por mensagem.
![Frame de mensagem Serial](https://www.robocore.net/upload/tutoriais/50_img_10_H.png?526)
Retirado de: https://www.robocore.net/upload/tutoriais/50_img_10_H.png?526
Por que a velocidade e a quantidade de bits são importantes? Pois elas que permitem que o receptor consiga determinar qual o intervalo de tempo necessário para realizar a leitura de cada um dos bits de dados. Na imagem, podemos ver que os dados são transmitidos em ordem inversa, enviando primeiro o LSB (Least Significant Bit) para o MSB (More Significant Bit). Para iniciar a transmissão, pelo intervalo de 1 bit, o canal é colocado em nível baixo. Esse comportamento é chamado de envio de start bit. Depois do envio dos dados, se existir paridade configurada, estes bits são enviados e por fim, os bits de parada são anexados a mensagem.
Algumas das velocidade mais comuns para a comunicação serial são: 9600, 19200, 115200. Não se pode utilizar qualquer velocidade, pois esse intervalo é calculado por hardware, então é preciso verificar no dispositivo que será utilizado quais são as velocidades que ele consegue operar. Vale destacar aqui que quanto maior a velocidade utilizada, mais suscetível a ruídos e interferências a comunicação está. Em situações que os dispositivos não estão se comunicando, uma possibilidade é reduzir a taxa de transferência entre eles.
![Frame de mensagem Serial](https://www.firewall.cx/images/stories/networking/cabling_dcc-4v2.gif)
Retirado de: https://www.firewall.cx/images/stories/networking/cabling_dcc-4v2.gif
Outro ponto importante é referente aos níveis de tensão utilizados por estes dispositivos. Quando o dispositivo utiliza lógica TTL, ele representa os níveis altos (uns 1), com 5V. Já quando o dispositivo utiliza interface RS-232, os níveis alto são representados por um sinal entre -3 e -25V e os níveis baixos por sinais de +3 e +25V.
![Nível de Tensão TTL](https://cdn.sparkfun.com/r/600-600/assets/1/8/d/c/1/51142c09ce395f0e7e000002.png)
Retirado de: https://cdn.sparkfun.com/r/600-600/assets/1/8/d/c/1/51142c09ce395f0e7e000002.png
![Nível de Tensão RS-232](https://cdn.sparkfun.com/r/600-600/assets/b/d/a/1/3/51142cacce395f877e000006.png)
Retirado de: https://cdn.sparkfun.com/r/600-600/assets/b/d/a/1/3/51142cacce395f877e000006.png
Quando utilizamos um dispositivo de comunicação serial por uma porta USB, em geral este dispositivo instala um Driver no computador que diz ao sistema operacional que ali existe um elemento serial. Este dispositivo interpreta os sinais enviados pelo físico USB e converte eles para o padrão serial da porta UART e vice-versa. Este vídeo apresenta um pouco mais de detalhes de como estes dispositivos funcionam:
O diagrama proposto pelo pessoal da SparkFun abaixo ilustra muito bem e de forma simplificado, como este dispositivo funciona dentro do microcontrolador. Os dados são carregados pelo controlador para o registrador serial. Este registrador, em geral, possui associado a ele uma fila que funciona como um buffer para receber estes dados. Cada vez que está fila não está fazia, é possível transmitir os dados dela para outros dispositivo serialmente. Assim como a fila de saída, os controladores possuem uma fila de entrada, assim quando os dados são recebidos na porta serial, eles são colocados dentro desta fila para serem consumidos posteriormente.
![Hardware Serial no Microcontrolador](https://cdn.sparkfun.com/r/700-700/assets/d/1/f/5/b/50e1cf30ce395fb227000000.png)
Retirado de: https://cdn.sparkfun.com/r/700-700/assets/d/1/f/5/b/50e1cf30ce395fb227000000.png
Abaixo o diagrama do controlador ST16C550.
![Hardware Serial no Microcontrolador](https://cdn.sparkfun.com/r/500-500/assets/e/9/7/5/4/50d24680ce395f7172000000.png)
Retirado de: https://cdn.sparkfun.com/r/500-500/assets/e/9/7/5/4/50d24680ce395f7172000000.png
Como comparação, o Arduino utiliza como microcontrolador, o Atmega8. Este microcontrolador possui em seu manual, o diagrama de comunicação serial a seguir. Podemos observar no diagrama que ele é dividido em três grandes blocos:
Gerador de Clock
: No ATmega8, o gerador de clock interno para a interface de comunicação serial (USART) é responsável por definir a taxa de transmissão (baud rate) dos dados. Ele divide a frequência principal do microcontrolador (ou de um cristal externo) por um fator configurável, resultando no sinal de clock que sincroniza a transmissão e recepção dos bits. Ajustando registradores específicos, o desenvolvedor seleciona a frequência de baud desejada, garantindo que transmissor e receptor operem de forma estável e confiável na velocidade estabelecida;Transmissor
: O transmissor do ATmega8 converte dados paralelos (vindos dos registradores internos) em um fluxo serial de bits, adicionando bits de start, paridade (caso habilitada) e stop conforme configurado. Ele utiliza o gerador de clock para temporizar a saída dos bits, e escreve cada bit de forma sequencial no pino TXD. Durante o envio, o firmware pode monitorar flags de status para saber quando o transmissor está pronto para enviar o próximo byte ou quando a transmissão foi concluída;Receptor
: O receptor do ATmega8 faz o caminho inverso, ou seja, converte um fluxo de bits recebidos em dados paralelos prontos para uso interno. Ele lê cada bit na entrada RXD em sincronismo com o clock gerado, valida a presença de bits de start e stop, e verifica a paridade, caso configurada. Ao finalizar a recepção de um quadro (pacote) de dados, o receptor armazena o byte em um registrador interno, sinalizando via flags que um novo dado está disponível para leitura pelo software.
![Hardware Serial no Microcontrolador](/arch/assets/images/atmega8-uart-blocks-58507f6fbf515a739efba63ce173a4a6.png)
Retirado de: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
Vamos cobrir outros dois tipos de comunicação serial, SPI e I2C.
3.2 Comunicação SPI - Serial Peripheral Interface
Por mais incrível que possam ser as aplicações que podemos fazer com a comunicação serial, ainda temos algumas limitações como:
- Número de dispositivo conectados: mesmo que possam fazer broadcast da nossa mensagem, não foi um protocolo projetado para essa finalidade, quando pensamos no padrão RS-232. Outros padrões como o RS-422 e RS-485 até suportam este tipo de ligação;
- Possui velocidades limitadas.
- Em geral, a comunicação implementada é ASSÍNCRONA.
Quando vamos colocar diversos dispositivos para comunicar-se, a garantia do sincronismo da informação entre eles é importante. Isso também é relevante pois não torna necessário que cada dispositivo fique responsável por gerar uma fonte de clock. Com a comunicação SPI, o sinal de clock é enviado em um canal dedicado para ele, fazendo com que todos os dispositivos possam compartilha-lo. Outro ponto muito importante: a comunicação pode ser implementada utilizando um registrador de deslocamento, o que é muito mais barato e simples que implementar todo o hardware para a comunicação serial, como a UART.
![Frame de Dados SPI](https://cdn.sparkfun.com/assets/d/6/b/f/9/52ddb2d8ce395fad638b4567.png)
Retirado de: https://cdn.sparkfun.com/assets/d/6/b/f/9/52ddb2d8ce395fad638b4567.png
Os elementos e pinos mais relevantes para a comunicação SPI são:
Controlador (antigo Master)
: elemento que controla a comunicação. Responsável pela geração do sinal de clock para os demais elementos;Periférico (antigo Slave)
: elemento que recebe os dados e comandos do dispositivo controlador, respondendo quando é acionado;SDO – Serial Data Out
: O sinal de saída de um dispositivo, onde os dados SPI são enviados para os demais;SDI – Serial Data In
: O sinal de entrada de um dispositivo, por onde ele recebe os dados SPI de outros elementos;CS – Chip Select
: Sinal ativado pelo controlador para comunicar com o periférico selecionado;PICO (peripheral in/controller out)
: Para dispositivos que podem ser controladores ou periféricos. o sinal de saída quando estão como controladores e de entrada quando são periféricos;POCI (peripheral out/controller in)
: Idem ao anterior, mas sinal de entrada quando o elemento for controlador e de saída quando ele for um periférico;SDIO – Serial Data In/Out
: Um sinal bidirecional.
Existe um movimento para ajustar os nomes dos pinos e convenções utilizadas. Este trabalho é relevante pois a terminologia Mestre/Escravo tem sido utilizada por muito tempo por diversos fabricantes, não tratando o assunto com o cuidado que lhe é devidos. Diversos fabricantes estão aderindo a movimentação de corrigir e ajustar os elementos utilizados para utilizar uma nova terminologia.
Recomendo fortemente a leitura do artigo: A Resolution to Redefine SPI Signal Names
Vamos avaliar como os dados são trocados entre os dispositivos. O elemento responsável pela geração do clock é o controlador, os demais elementos são os periféricos da comunicação. Quando o controlador deseja mandar dados, ele envia os dados e os pulsos de clock suficientes para que estes dados possam ser enviados. Se for necessário receber dados do periférico, ele envia a quantidade de pulsos necessária para receber aquela informação.
![Envio e Recebimento de Dados SPI](https://cdn.sparkfun.com/assets/learn_tutorials/1/6/BasicSPI_Updated2.png)
Retirado de: https://cdn.sparkfun.com/assets/learn_tutorials/1/6/BasicSPI_Updated2.png
Para utilizar mais dispositivos, é necessário utilizar o sinal de Chip-Select. Desta forma, o controlador aciona o elemento que deve receber a mensagem que será enviada. É importante notar que a comunicação SPI precisa de um protocolo fixo quanto a quantidade de dados que serão enviados/recebidos na troca de mensagens. Para cada dispositivo periférico adicionado na rede, é necessário um novo sinal de Chip-Select no elemento controlador.
![Rede SPI](https://cdn.sparkfun.com/assets/learn_tutorials/1/6/MultipleCS_Updated2.png)
Retirado de: https://cdn.sparkfun.com/assets/learn_tutorials/1/6/MultipleCS_Updated2.png
3.3 Comunicação I2C - Inter-Integrated Circuit
Ótimo, agora temos uma forma de nos comunicarmos que é assíncrona e outra que é síncrona. Não precisamos de mais nada! Pronto!
Retirado de: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcShKVTG4R617R4putDaUqG2Yg7806L8pKVsfQ&s
Calma ai amigas e amigos! Existem diversos outros tipos e interfaces que podemos utilizar. Vamos verificar mais um interface síncrona de comunicação, o I2C.
Com o I2C, podemos ligar quantos controladores e periféricos forem necessários em um mesmo par de fios. Isso é possível pois, al';em de cada elemento possuir um endereço único na rede, ele são do tipo dreno aberto (open-drain). O que isso significa? Estes dispositivos podem enviar o nível zero (0) no barramento, mas não o nível alto. Por isso este tipo de barramento precisa de resistores de pull-up. Em geral, resistores de 4k7 ohms são capazes de lidar com redes de até 2 metros. Para maiores distâncias, utilizar resistências menores.
![Exemplo de Rede I2C com PullUp](https://cdn.sparkfun.com/r/600-600/assets/learn_tutorials/8/2/I2C_Schematic.jpg)
Retirado de: https://cdn.sparkfun.com/r/600-600/assets/learn_tutorials/8/2/I2C_Schematic.jpg
O protocolo de comunicação I2C é mais complexo que o serial e o SPI. Aqui eu vou fazer uma descrição macro e básica do frame de mensagens que transitam no protocolo. As mensagens são divididas em 2 partes: um endereço e o conteúdo da mensagem. O endereço indica para a rede quem deve receber a mensagem enviada. IMPORTANTE: acho que jamais é um problema deixar claro, todos os elementos na rede I2C recebem todas as mensagens, eles simplesmente não respondem quando as mensagens não são para eles. Os dados são os bytes de dados enviados do controlador para o periférico endereçado ou a resposta de um periférico para o controlador. Os dados são enviados pela linha SDA
depois que a linha SCL
vai para nível baixo e lidos quando a linha SCL
vai para nível alto.
Alguns pontos que valem a pena para verificarmos:
Condição de Início
: O primeiro passo para enviar uma mensagem no barramento I²C é gerar a condição de início, que acontece quando a linha SDA (Serial Data) é puxada para nível baixo enquanto a linha SCL (Serial Clock) ainda está em nível alto. Esse sinal indica a todos os dispositivos no barramento que uma transmissão será iniciada, estabelecendo o controlador como gerador do clock (SCL) e dando início ao envio de dados.Envio de Endereço
: Em seguida, o controlador coloca no barramento o endereço de 7 ou 10 bits do periférico com o qual deseja se comunicar, seguido de um bit que indica se a operação será de escrita (0) ou leitura (1). Como o I²C permite múltiplos periféricos conectados, esse endereço identifica qual dispositivo deve responder. Durante esse tempo, o controlador ajusta o sinal SCL, avançando um bit de cada vez.Recebimento do ACK
: Após o envio do endereço e do bit de leitura/escrita, o controlador libera a linha SDA por um ciclo de clock e verifica se o periférico selecionado puxa a linha para baixo, enviando o bit de ACK (Acknowledge). Se o periférico reconhecer corretamente o endereço, ele emite ACK; caso contrário, o controlador pode encerrar a transmissão ou tentar novamente. Esse processo de confirmação (ACK) ocorre após cada byte transmitido, servindo como verificação de erro básica.Transmissão dos Dados
: Com o periférico selecionado e pronto para receber (ou enviar, no caso de leitura), o controlador envia cada byte de dados sequencialmente, um bit por ciclo de clock. A cada byte concluído, o periférico novamente sinaliza ACK, confirmando o recebimento correto. Se for uma operação de leitura, o papel se inverte: o periférico passa a enviar os bits no mesmo barramento SDA, enquanto o controlador ainda controla o clock pela linha SCL.Condição de Parada
: Quando o controlador termina de enviar ou receber todos os bytes desejados, ele gera a condição de parada, liberando o barramento. Isso ocorre quando a linha SDA volta ao nível alto enquanto a linha SCL permanece em nível alto. Esse sinal indica a todos os dispositivos no barramento que a operação de comunicação terminou, permitindo que outro controlador possa iniciar uma nova transação ou que o mesmo retome o controle em outro momento.
![Exemplo de Frame I2C](https://cdn.sparkfun.com/r/600-600/assets/learn_tutorials/8/2/I2C_Basic_Address_and_Data_Frames.jpg)
Retirado de: https://cdn.sparkfun.com/r/600-600/assets/learn_tutorials/8/2/I2C_Basic_Address_and_Data_Frames.jpg