Tutorial Prático: Comunicação I²C entre PIC e Periféricos

Nesta etapa de aprendizado, vamos explorar o barramento I²C (Inter-Integrated Circuit) e sua importância na comunicação entre o PICExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExemplos Práticos em Assembly: Quando Vale a Pena Programar em Baixo NívelExplore como a programação Assembly em PIC maximiza controle de hardware com alta eficiência, ideal para sistemas críticos e dispositivos de baixa energia. e uma variedade de periféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosDescubra conceitos essenciais de arquitetura Harvard, memória, registradores e periféricos dos microcontroladores PIC para projetos eficientes.. O objetivo é fornecer uma visão prática de como esse protocolo pode simplificar projetos, permitindo a conexão de múltiplos dispositivos usando apenas dois fios principais: SDA (Serial Data) e SCL (Serial Clock).

Visão Geral do I²C🔗

O I²C é um protocolo de comunicação serial e síncronoUSART/Serial: Transmissores e Receptores para conexão com outros sistemasUSART/Serial: Transmissores e Receptores para conexão com outros sistemasAprenda a configurar a comunicação serial via USART em PICs com este tutorial detalhado. Domine fundamentos, práticas avançadas e integração eficaz com IoT., desenhado para conectar dispositivos em curtas distâncias. Entre suas principais características, destacam-se:

O barramento I²C requer o uso de resistores de pull-up (tipicamente entre 2,2 kΩ e 10 kΩ, dependendo da velocidade de comunicação e da capacidade do barramento) em ambas as linhas SDA e SCL, pois o controle ocorre via tensões em “open-drain” ou “open-collector”.

Configuração Básica no PIC🔗

Antes de iniciar a comunicação, precisamos configurar os registradoresArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. adequados para habilitar o periférico I²C e ajustar a velocidade de operação (por exemplo, 100 kHz ou 400 kHz). A configuração envolve os seguintes passos gerais:

1. Selecionar o Módulo I²C: em muitos PICs, ele está incluso no MSSP (Master SynchronousUSART/Serial: Transmissores e Receptores para conexão com outros sistemasUSART/Serial: Transmissores e Receptores para conexão com outros sistemasAprenda a configurar a comunicação serial via USART em PICs com este tutorial detalhado. Domine fundamentos, práticas avançadas e integração eficaz com IoT. Serial Port).

2. Configurar os Pinos SDA e SCL: normalmente, devem ser configurados como entradas digitais ou funções especiais, de acordo com o datasheet do microcontrolador.

3. Definir a Taxa de BaudUSART/Serial: Transmissores e Receptores para conexão com outros sistemasUSART/Serial: Transmissores e Receptores para conexão com outros sistemasAprenda a configurar a comunicação serial via USART em PICs com este tutorial detalhado. Domine fundamentos, práticas avançadas e integração eficaz com IoT. (velocidade): através de registradoresArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. específicos (por exemplo, SSPADD), estipulamos a frequência de clock desejada.

4. Habilitar o Módulo: utilizando bits de controle de configuração, ativamos o I²C em modo mestre ou escravo.

Embora cada família de PIC possa ter pequenas diferenças de registradores, o fluxo é semelhante. Consulte o datasheet do seu microcontrolador para detalhes específicos de nome e localização dos bits de configuraçãoConfiguração de Fuses e Clock no Microcontrolador PICConfiguração de Fuses e Clock no Microcontrolador PICAprenda a configurar fuses e definir o clock em PIC para otimizar desempenho e segurança, garantindo confiabilidade no seu projeto..

Tabela de Endereços Comuns🔗

Uma das grandes vantagens do I²C é a possibilidade de conectar múltiplos dispositivos sem aumentar muito a fiação. Cada dispositivo possui um endereço único de 7 bits (ou 10 bits em casos especiais). Abaixo, um exemplo de tabela com alguns periféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosDescubra conceitos essenciais de arquitetura Harvard, memória, registradores e periféricos dos microcontroladores PIC para projetos eficientes. I²C bastante comuns:

DispositivoEndereço padrão (7 bits)Função
EEPROM 24LC2560x50Armazenamento de dados em memória não volátil
RTC DS13070x68Relógio/Calendário com backup de bateria
Sensor de Temperatura LM750x48Monitoramento de temperatura digital
Acelerômetro MPU60500x68 ou 0x69Medição de aceleração e giroscópio integrado
Expandir IO MCP230170x20 a 0x27 (configurável)Expansão de portas de entrada/saída para aplicações

No momento de iniciar a escrita ou leitura no barramento, devemos informar o endereço do dispositivo, bem como se a operação é de escrita (bit de R/W = 0) ou de leitura (bit de R/W = 1).

Exemplo de Aplicação com EEPROM (24LC256)🔗

Suponhamos que queremos armazenar dados em uma EEPROMArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. 24LC256 e posteriormente ler esse conteúdo. No código C abaixo, ilustramos uma rotina genérica de escrita e leitura I²C. Observe que os nomes de funções e registradoresArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. podem variar conforme o compilador e a família PIC, mas o fluxo exemplifica a lógica básica.

// Exemplo demonstrativo (código genérico)
#include <xc.h>
// Define o endereço I2C da EEPROM 24LC256 (0x50 para escrita/leitura)
#define EEPROM_ADDRESS 0x50
void I2C_Init(void) {
    // Ajuste de registradores para modo Master I²C,
    // configuração de velocidade (100 kHz, por exemplo) e
    // habilitação do módulo I²C.
    // Exemplo fictício:
    // SSPCON1 = 0b00101000;  // Habilita I2C Master
    // SSPADD = ((FOSC/4)/100000) - 1; // Configura a velocidade baseada no clock
}
void I2C_Start(void) {
    // Gera condição de START no barramento
}
void I2C_Stop(void) {
    // Gera condição de STOP no barramento
}
void I2C_Write(unsigned char data) {
    // Escreve um byte no barramento
}
unsigned char I2C_Read(unsigned char ack) {
    // Lê um byte do barramento e envia ACK ou NACK
}
// Rotina para escrever um byte em um endereço da EEPROM
void EEPROM_WriteByte(unsigned int addr, unsigned char data) {
    unsigned char addrHigh = (addr >> 8) & 0xFF;  // Parte alta do endereço
    unsigned char addrLow  = addr & 0xFF;         // Parte baixa do endereço
    I2C_Start();
    I2C_Write((EEPROM_ADDRESS << 1) | 0); // Envia endereço + bit Write (0)
    I2C_Write(addrHigh);                  // Envia parte alta do endereço
    I2C_Write(addrLow);                   // Envia parte baixa do endereço
    I2C_Write(data);                      // Envia o byte de dados
    I2C_Stop();
    // Aguardar tempo de escrita interna (tWR) antes de acessar novamente
}
// Rotina para ler um byte de um endereço da EEPROM
unsigned char EEPROM_ReadByte(unsigned int addr) {
    unsigned char data;
    unsigned char addrHigh = (addr >> 8) & 0xFF;
    unsigned char addrLow  = addr & 0xFF;
    I2C_Start();
    I2C_Write((EEPROM_ADDRESS << 1) | 0); // Endereço + bit Write
    I2C_Write(addrHigh);
    I2C_Write(addrLow);
    I2C_Start();                         // Repeated Start
    I2C_Write((EEPROM_ADDRESS << 1) | 1); // Endereço + bit Read (1)
    data = I2C_Read(0);                   // Ler byte, enviar NACK
    I2C_Stop();
    return data;
}

Passo a Passo da Escrita na EEPROM

1. Iniciar a comunicação com um Start.

2. Enviar o endereço do escravo (0x50 << 1 no caso da EEPROMArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados.) + bit de escrita.

3. Definir o endereço de memóriaMigrando de PIC16/PIC18 para PIC24/PIC32: Principais Diferenças e ConsideraçõesMigrando de PIC16/PIC18 para PIC24/PIC32: Principais Diferenças e ConsideraçõesDescubra como migrar de PIC16/PIC18 para PIC24/PIC32, explorando diferenças em arquitetura, memória, compiladores e interrupções para otimizar seu projeto. interno da EEPROM (bytes alto e baixo).

4. Enviar o dado a ser gravado.

5. Finalizar com um Stop.

6. Aguardar um tempo de escrita antes de acessar novamente o componente.

Passo a Passo da Leitura na EEPROM

1. Iniciar a comunicação com um Start.

2. Enviar o endereço do escravo + bit de escrita.

3. Definir o endereço de memóriaMigrando de PIC16/PIC18 para PIC24/PIC32: Principais Diferenças e ConsideraçõesMigrando de PIC16/PIC18 para PIC24/PIC32: Principais Diferenças e ConsideraçõesDescubra como migrar de PIC16/PIC18 para PIC24/PIC32, explorando diferenças em arquitetura, memória, compiladores e interrupções para otimizar seu projeto. a ser lido.

4. Gerar um Repeated Start.

5. Enviar o endereço do escravo + bit de leitura.

6. Ler o byte retornado.

7. Finalizar com Stop.

Outros Exemplos de Aplicação🔗

O mesmo método de inicialização e transmissão aplicado na EEPROMArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. pode ser adaptado para diversos outros periféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosDescubra conceitos essenciais de arquitetura Harvard, memória, registradores e periféricos dos microcontroladores PIC para projetos eficientes. I²C. Destacam-se:

Em todos os casos, os passos básicos são iguais: iniciar uma transação, enviar endereço do dispositivo, escrever ou ler os registradoresArquitetura Básica: Registradores, Memória e Organização de DadosArquitetura Básica: Registradores, Memória e Organização de DadosDomine a arquitetura PIC com este guia prático. Aprenda concepções avançadas, manipulação de registradores e otimização para sistemas embarcados. internos e encerrar a transação.

Conclusão🔗

O barramento I²C é uma ferramenta poderosa para ampliar as capacidades de um projeto com PIC, permitindo conectar sensores, memórias e periféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosEntendendo a Arquitetura dos PIC: Memória, Registradores e PeriféricosDescubra conceitos essenciais de arquitetura Harvard, memória, registradores e periféricos dos microcontroladores PIC para projetos eficientes. usando apenas duas linhas de dados. Seus principais benefícios incluem simplicidade de cabeamento, relativa facilidade de implementaçãoEstrutura de Código em C para PIC: Definições e Convenções EssenciaisEstrutura de Código em C para PIC: Definições e Convenções EssenciaisDescubra técnicas avançadas de programação em C para microcontroladores PIC. Aprenda otimização de memória, gestão de interrupções e depuração eficaz. e ampla disponibilidade de componentes já compatíveis.

Ao dominar a configuração e o fluxo de escrita/leitura, você será capaz de:

Com esse conhecimento, você poderá avançar na criação de sistemas completos e escaláveis, aproveitando toda a versatilidade proporcionada pelo protocolo I²C.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados