#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "driver/i2c_master.h"
#include "esp_task_wdt.h"
static const char *TAG = "I2C";
#define I2C_PORT I2C_NUM_0
#define I2C_SDA_PIN GPIO_NUM_21
#define I2C_SCL_PIN GPIO_NUM_22
#define I2C_FREQ_GZ 100000
static i2c_master_bus_handle_t i2c_bus = NULL;
// i2c master bus init
static void i2c_master_bus_init(void) {
i2c_master_bus_config_t bus_cfg = {
.i2c_port = I2C_PORT,
.sda_io_num = I2C_SDA_PIN,
.scl_io_num = I2C_SCL_PIN,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7, // Фильтр помех
//.intr_priority = 0,
//.trans_queue_depth = 0,
//.flags = {
//.enable_internal_pullup = true,
//.allow_pd = false, // Обработка спящих режимов
//},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&bus_cfg, &i2c_bus));
}
//≠======================××==================================
static int i2c_bus_scan(void) {
int found_addr = -1;
// Крайние значения 0 и 127 зарезервированы (служебные)
for (uint8_t addr = 1; addr < 127; addr++) {
esp_err_t err = i2c_master_probe(i2c_bus, addr, 50); // Где 50 мс - время ожидания
if (err == ESP_OK) {
found_addr = addr;
break;
}
}
return found_addr;
}
void app_main() {
esp_log_level_set("*", ESP_LOG_VERBOSE);
esp_task_wdt_deinit();
i2c_master_bus_init();
vTaskDelay(pdMS_TO_TICKS(50)); // Задержка чтобы датчик включился
int dev_addr = i2c_bus_scan();
printf("dez_addr = %d\n", dev_addr);
while (1) {
if (dev_addr >= 0) {
ESP_LOGI(TAG, "Device address = %d 0x%02X\n", dev_addr, dev_addr);
} else {
ESP_LOGI(TAG, "Device not found\n");
}
vTaskDelay(pdMS_TO_TICKS(2000));
}
}