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
- Configuração de Registradores / Drivers: O hardware é parametrizado antes da ativação das interrupções globais.
- 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. - 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto