Pular para conteúdo

Aula 10 - Barramento I2C (Inter-Integrated Circuit) ⚙️

Objetivo Pedagógico

Objetivo: Comunicação mestre-escravo a 2 fios (SDA e SCL). Endereçamento de 7 bits, resistores de pull-up, condições de Start/Stop e leitura de sensores digitais.


📑 1. Fundamentos Teóricos & Conceituação

Comunicação mestre-escravo a 2 fios (SDA e SCL). Endereçamento de 7 bits, resistores de pull-up, condições de Start/Stop e leitura de sensores digitais. Em projetos de engenharia eletrônica e sistemas computacionais embarcados, a precisão temporal, a contenção de recursos de memória e a confiabilidade contínua são requisitos mandatórios de projeto.

📐 Arquitetura Conceitual & Fluxo de Operação

graph TD
    A["Entrada / Periféricos"] --> B["Barramento I2C (Inter-Integrated Circuit)"]
    B --> C["Processamento e Validação"]
    C --> D["Saída / Atuador / Rede"]

    style A fill:#e3f2fd,stroke:#1565c0
    style B fill:#fff3e0,stroke:#e65100,stroke-width:2px
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Princípios de Engenharia

Nesta unidade, exploramos detalhadamente os seguintes conceitos: - Linhas SDA e SCL: Requisito essencial para garantir operação determinística e estável. - Pull-Up Externo: Requisito essencial para garantir operação determinística e estável. - Endereçamento 7-bit: Requisito essencial para garantir operação determinística e estável. - START / STOP / ACK: Requisito essencial para garantir operação determinística e estável. - Multi-dispositivo: Requisito essencial para garantir operação determinística e estável.


🛠️ 2. Implementação Técnica & Código em C/C++

Abaixo está o exemplo prático estruturado de acordo com as normas de desenvolvimento bare-metal / FreeRTOS para a família estudada:

// Leitura de registrador de sensor via barramento I2C
#include "driver/i2c.h"

esp_err_t i2c_read_sensor_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, size_t len) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (dev_addr << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, reg_addr, true);
    i2c_master_start(cmd); // Repeated Start
    i2c_master_write_byte(cmd, (dev_addr << 1) | I2C_MASTER_READ, true);
    i2c_master_read(cmd, data, len, I2C_MASTER_LAST_NACK);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000));
    i2c_cmd_link_delete(cmd);
    return ret;
}

💡 Análise Passo a Passo do Código

  1. Configuração de Registradores / Drivers: O hardware é parametrizado antes da ativação das interrupções globais.
  2. Tratamento Seguro: Utilização de tipos com largura fixa (uint8_t, uint32_t) da biblioteca <stdint.h> para garantir portabilidade entre arquiteturas de 8, 16 e 32 bits.
  3. Eficiência e Baixo Consumo: Minimização de ciclos de clock desperdiçados e liberação do barramento para outros periféricos.

🎯 3. Próximos Passos & Sequência Prática