Guia Completo de I2C para Cortex-M4: Configuração e Uso

Este tutorial aborda, e didática, como configurar a interface I2C em microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. e utilizá-la para ler dados de sensores. O foco é oferecer uma visão clara e direta, facilitando a compreensão para engenheiros, estudantes e entusiastas que desejam implementar comunicação I2C de forma eficiente e confiávelMelhores práticas de proteção contra falhas e uso de watchdog timersMelhores práticas de proteção contra falhas e uso de watchdog timersSaiba como implementar watchdog timers em ARM Cortex-M4 para garantir reinicializações seguras, confiabilidade e robustez em sistemas críticos. em seus projetos de firmware.

Introdução🔗

O protocolo I2C (Inter-Integrated Circuit) é amplamente utilizado em dispositivos embarcados para comunicação com sensores, displays, memórias EEPROM e diversos outros periféricos. Ele se destaca pela facilidade de conexão, pois utiliza apenas duas linhas principais:

  • SCL (Serial Clock Line)
  • SDA (Serial Data Line)

Em um sistema Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais., a configuração correta do I2C permite criar soluções robustas para captura e processamento de dados de sensores, garantindo alto rendimento e baixo consumo de pinos.

Conceitos Fundamentais do I2C🔗

Antes de partir para a configuração prática, é importante relembrar alguns conceitos-chave:

1. Topologia Mestre-Escravo

O I2C opera em uma topologia em que pode haver um ou mais mestres e vários escravos. Geralmente, o microcontrolador (Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais.) é o mestre, responsável por gerar o sinal de clock e iniciar a comunicação. Os sensores conectados atuam como escravos, respondendo aos comandos do mestre.

2. Endereçamento

Cada dispositivo escravo possui um endereço único de 7 ou 10 bits. Na prática, a forma mais comum é o endereçamento de 7 bits, que define até 128 endereços possíveis.

3. Sinais de Controle (Start e Stop)

  • Start: sinal utilizado pelo mestre para indicar o início de uma transmissão.
  • Stop: sinal utilizado para encerrar a transmissão.

4. Taxas de Transferência

As velocidades típicas do I2C incluem:

  • Standard Mode: até 100 kHz
  • Fast Mode: até 400 kHz
  • Fast Mode Plus: até 1 MHz (em alguns MCUs específicos)

Essa variedade de velocidades permite adequar o I2C ao tipo de sensor e às exigências do projeto.

Configurando o I2C no Cortex-M4🔗

A configuração do I2C no Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. geralmente envolve a definição dos seguintes parâmetros (realizada por registradores específicos do microcontrolador ou por bibliotecas de abstração de hardware):

1. GPIOConfigurando e manipulando GPIO, Timers e PWM no Cortex-M4Configurando e manipulando GPIO, Timers e PWM no Cortex-M4Configure GPIO, Timers e PWM no Cortex-M4. Aprenda os passos essenciais e boas práticas para sistemas embarcados de alta performance.

  • Selecionar os pinos corretos para SCL e SDA.
  • Ativar as resistências pull-up se necessário (o I2C requer pull-ups em ambos os sinais).

2. Clock

  • Habilitar o clock do periférico I2C.
  • Configurar a frequência efetiva (baud rate) de acordo com o modo desejado (100 kHz, 400 kHz, etc.).

3. Modo de Operação

  • Selecionar o dispositivo como Mestre (master).
  • Definir endereços/escravos quando necessário, caso o microcontrolador também assuma o papel de escravo em situações específicas.

4. InterrupçõesGerenciamento de interrupções e exceções na arquitetura ARMGerenciamento de interrupções e exceções na arquitetura ARMDescubra como o Cortex-M4 gerencia interrupções e exceções com eficiência, explorando técnicas de empilhamento automático e NVIC para sistemas embarcados. ou Polling

Dica: Em projetos mais robustos, é comum utilizar a DMA (Direct Memory Access) para automatizar transferências de dados no I2C, reduzindo a carga de trabalho da CPU. Isso, entretanto, pode exigir configurações adicionais.

Exemplo Simplificado de Configuração em C

#include "stm32f4xx.h"  // Exemplo de biblioteca de um MCU Cortex-M4
void I2C_Init(void) {
    // 1. Habilitar clock do I2C e dos GPIOs correspondentes
    RCC->AHB1ENR |= (1 << 1);   // Exemplo: habilitar clock GPIOB
    RCC->APB1ENR |= (1 << 21);  // Exemplo: habilitar clock I2C2
    // 2. Configurar pinos PB10 (SCL) e PB11 (SDA) em AF Mode
    GPIOB->MODER &= ~((3 << (10*2)) | (3 << (11*2)));
    GPIOB->MODER |=  (2 << (10*2)) | (2 << (11*2));   // Alternate Function
    // Selecionar função alternativa para I2C (AF4 em muitos MCUs STM32)
    GPIOB->AFR[1] |= (4 << ((10-8)*4)) | (4 << ((11-8)*4));
    // 3. Configurar taxas e parâmetros do I2C
    I2C2->CR2 |= (16 << 0);      // Exemplo: clock de 16 MHz
    I2C2->CCR = 80;             // Ajuste simplificado para ~100 kHz
    I2C2->TRISE = 17;           // Tempo de subida para modo standard
    // 4. Habilitar o I2C
    I2C2->CR1 |= (1 << 0);      // I2C Enable
}

Acima, há um trecho exemplificativo, onde determinadas constantes e valores de registradores podem variar conforme o fabricante e a placa de desenvolvimento escolhida. O datasheet ou manual de referência do seu dispositivo Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. deve ser consultado para valores precisos de cada registro.

Uso de Sensores via I2C🔗

Com o I2C devidamente configurado, podemos proceder à leitura ou escrita de dados em um sensor. A forma de acesso depende do registro interno no qual se deseja ler/escrever. Em geral, o fluxo ao ler dados de um sensor via I2C consiste em:

1. Envio do Endereço do Escravo

  • O mestre coloca o endereço do sensor e o bit de leitura/escrita (R/W) na linha SDA.
  • Aguarda confirmação (ACK) por parte do sensor.

2. Envio do Registro Destino (para leitura de dados)

  • Se o sensor possuir registros internos, envia o endereço do registro que se deseja ler.

3. Reinício (Repeated Start) e Leitura

  • Reenvia o endereço do sensor com bit de leitura.
  • Lê os bytes requisitados.
  • Envia sinal de NACK/ACK para o sensor após cada byte.
  • Envia sinal de Stop para encerrar a comunicação.

Exemplo de Função de Leitura

uint8_t I2C_ReadRegister(uint8_t sensorAddr, uint8_t reg) {
    uint8_t data = 0;
    // 1. Gera condição de START e envia endereço do escravo em modo de escrita
    I2C2->CR1 |= (1 << 8); // START
    while(!(I2C2->SR1 & (1 << 0))); // Espera o START ser gerado
    // Envia endereço + bit de escrita
    I2C2->DR = (sensorAddr << 1) | 0; // 0 = Write
    while(!(I2C2->SR1 & (1 << 1))); // Espera ACK do sensor
    // Limpa flags de SR1 e SR2 com sequência de leitura
    (void) I2C2->SR1;
    (void) I2C2->SR2;
    // 2. Envia endereço do registro
    I2C2->DR = reg;
    while(!(I2C2->SR1 & (1 << 7))); // Espera a transmissão do byte
    // 3. Gera condição de Repeated START e envia endereço do escravo em modo de leitura
    I2C2->CR1 |= (1 << 8); // Repeated START
    while(!(I2C2->SR1 & (1 << 0)));
    I2C2->DR = (sensorAddr << 1) | 1; // 1 = Read
    while(!(I2C2->SR1 & (1 << 1)));
    (void) I2C2->SR1;
    (void) I2C2->SR2;
    // 4. Lê o dado
    while(!(I2C2->SR1 & (1 << 6))); // Espera recebido
    data = I2C2->DR;
    // Envia STOP
    I2C2->CR1 |= (1 << 9);
    return data;
}

Esta função exemplifica a leitura de um único byte, como ocorre em boa parte dos sensores simples. Para sensores mais complexos (como módulos de 6 eixos e sensores ambientais multifuncionais), a sequência de leitura pode envolver diversos bytes e diferentes registradores.

Tabela Exemplo de Endereços Típicos

SensorEndereço Padrão (7 bits)
MPU6050 (IMU)0x68 ou 0x69
BMP280 (Pressão)0x76 ou 0x77
BME280 (Ambiental)0x76 ou 0x77
OLED 128x640x3C ou 0x3D
  • Obs.: O endereçamento pode variar conforme os jumpers de seleção e versões específicas do módulo.

Conclusão🔗

Ao finalizar este estudo, percebemos que a configuração do I2C em micros Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. exige atenção aos detalhes dos registradores, corretas definições de clock e, principalmente, cuidados na sequência de comunicação com o sensor. Uma vez implementada a configuração básica, integrar múltiplos sensores ao mesmo barramento torna-se relativamente simples, graças às características de endereçamento e ao gerenciamento através de Start/Stop repeats do protocolo.

Manter uma referência de datasheet em mãos e testar cada passo com cuidado garante uma implementação confiávelMelhores práticas de proteção contra falhas e uso de watchdog timersMelhores práticas de proteção contra falhas e uso de watchdog timersSaiba como implementar watchdog timers em ARM Cortex-M4 para garantir reinicializações seguras, confiabilidade e robustez em sistemas críticos.. Assim, torna-se possível desenvolver projetos que vão desde a simples leitura de um sensor de temperatura até a integração de sistemasProcedimentos de teste e validação para sistemas críticos em Cortex-M4Procedimentos de teste e validação para sistemas críticos em Cortex-M4Aprenda técnicas de teste e validação para garantir a segurança, integridade e robustez em sistemas críticos com microcontroladores ARM Cortex-M4. complexos de monitoramento ambiental e controle de movimento, explorando todo o potencial que o I2C oferece no ecossistema do Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais..

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

Referências🔗

  • Documentação oficial da ARM para entender o Core Cortex-M e suas funcionalidades, que é fundamental para quem trabalha com o microcontrolador na implementação do I2C: developer.arm.com/documentation
  • Ferramenta STM32CubeMX, que facilita a configuração de periféricos (como o I2C) e a geração de código para dispositivos STM32, demonstrando como simplificar o processo de configuração de hardware: www.st.com/en/development-tools/stm32cubemx.html
  • Página oficial da Keil, útil para acessar ferramentas de desenvolvimento e recursos para programar dispositivos ARM, contribuindo indiretamente para o desenvolvimento dos projetos com Cortex-M4: www.keil.com/
  • Portal da ST para microcontroladores STM32, que exemplifica bem a aplicação prática do Cortex-M4 e inclui documentação que pode ajudar na configuração do I2C para sensores: www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html
  • Recursos e documentação sobre CMSIS, que auxiliam na configuração e abstração de hardware, sendo extremamente relevantes para implementar e depurar comunicação I2C no Cortex-M4: developer.arm.com/tools-and-software/embedded/cmsis

Compartilhar artigo

Artigos Relacionados